61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
package access
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type CardTimeSeries struct {
|
|
Map map[time.Time]*Card `json:"nfc_checkins"`
|
|
crossRef map[*Card][]time.Time
|
|
last time.Time
|
|
mu *sync.RWMutex
|
|
}
|
|
|
|
func NewCardTimeSeries() *CardTimeSeries {
|
|
return &CardTimeSeries{
|
|
Map: make(map[time.Time]*Card),
|
|
crossRef: make(map[*Card][]time.Time),
|
|
mu: &sync.RWMutex{},
|
|
}
|
|
}
|
|
|
|
func (cts *CardTimeSeries) CheckIn(c *Card) {
|
|
cts.mu.Lock()
|
|
defer cts.mu.Unlock()
|
|
tnow := time.Now()
|
|
cts.Map[tnow] = c
|
|
if cts.crossRef[c] == nil {
|
|
cts.crossRef[c] = make([]time.Time, 0)
|
|
}
|
|
cts.crossRef[c] = append(cts.crossRef[c], tnow)
|
|
cts.last = tnow
|
|
}
|
|
|
|
func (cts *CardTimeSeries) Get(t time.Time) *Card {
|
|
cts.mu.RLock()
|
|
defer cts.mu.RUnlock()
|
|
return cts.Map[t]
|
|
}
|
|
|
|
func (cts *CardTimeSeries) GetClosest(t time.Time) *Card {
|
|
cts.mu.RLock()
|
|
defer cts.mu.RUnlock()
|
|
if cts.Map[t] != nil {
|
|
return cts.Map[t]
|
|
}
|
|
var closest time.Time
|
|
for k := range cts.Map {
|
|
if k.Before(t) && k.After(closest) {
|
|
closest = k
|
|
}
|
|
}
|
|
return cts.Map[closest]
|
|
}
|
|
|
|
func (cts *CardTimeSeries) GetLast() *Card {
|
|
cts.mu.RLock()
|
|
defer cts.mu.RUnlock()
|
|
return cts.Map[cts.last]
|
|
}
|