door5/pkg/access/timeseries.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]
}