mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 04:42:33 +02:00
67 lines
1.3 KiB
Go
67 lines
1.3 KiB
Go
package period
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
type Period[T any] struct {
|
|
FifteenMinutes *Entries[T]
|
|
OneHour *Entries[T]
|
|
OneDay *Entries[T]
|
|
OneMonth *Entries[T]
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
type Filter string
|
|
|
|
const (
|
|
PeriodFifteenMinutes Filter = "15m"
|
|
PeriodOneHour Filter = "1h"
|
|
PeriodOneDay Filter = "1d"
|
|
PeriodOneMonth Filter = "1m"
|
|
)
|
|
|
|
func NewPeriod[T any]() *Period[T] {
|
|
return &Period[T]{
|
|
FifteenMinutes: newEntries[T](15 * time.Minute),
|
|
OneHour: newEntries[T](1 * time.Hour),
|
|
OneDay: newEntries[T](24 * time.Hour),
|
|
OneMonth: newEntries[T](30 * 24 * time.Hour),
|
|
}
|
|
}
|
|
|
|
func (p *Period[T]) Add(info *T) {
|
|
p.mu.Lock()
|
|
defer p.mu.Unlock()
|
|
now := time.Now()
|
|
p.FifteenMinutes.Add(now, info)
|
|
p.OneHour.Add(now, info)
|
|
p.OneDay.Add(now, info)
|
|
p.OneMonth.Add(now, info)
|
|
}
|
|
|
|
func (p *Period[T]) Get(filter Filter) []*T {
|
|
p.mu.RLock()
|
|
defer p.mu.RUnlock()
|
|
switch filter {
|
|
case PeriodFifteenMinutes:
|
|
return p.FifteenMinutes.Get()
|
|
case PeriodOneHour:
|
|
return p.OneHour.Get()
|
|
case PeriodOneDay:
|
|
return p.OneDay.Get()
|
|
case PeriodOneMonth:
|
|
return p.OneMonth.Get()
|
|
default:
|
|
panic("invalid period filter")
|
|
}
|
|
}
|
|
|
|
func (filter Filter) IsValid() bool {
|
|
switch filter {
|
|
case PeriodFifteenMinutes, PeriodOneHour, PeriodOneDay, PeriodOneMonth:
|
|
return true
|
|
}
|
|
return false
|
|
}
|