52 lines
1.0 KiB
Go
52 lines
1.0 KiB
Go
package gronx
|
|
|
|
import (
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// Expr represents an item in array for batch check
|
|
type Expr struct {
|
|
Expr string
|
|
Due bool
|
|
Err error
|
|
}
|
|
|
|
// BatchDue checks if multiple expressions are due for given time (or now).
|
|
// It returns []Expr with filled in Due and Err values.
|
|
func (g *Gronx) BatchDue(exprs []string, ref ...time.Time) []Expr {
|
|
ref = append(ref, time.Now())
|
|
g.C.SetRef(ref[0])
|
|
|
|
var segs []string
|
|
|
|
cache, batch := map[string]Expr{}, make([]Expr, len(exprs))
|
|
for i := range exprs {
|
|
batch[i].Expr = exprs[i]
|
|
segs, batch[i].Err = Segments(exprs[i])
|
|
key := strings.Join(segs, " ")
|
|
if batch[i].Err != nil {
|
|
cache[key] = batch[i]
|
|
continue
|
|
}
|
|
|
|
if c, ok := cache[key]; ok {
|
|
batch[i] = c
|
|
batch[i].Expr = exprs[i]
|
|
continue
|
|
}
|
|
|
|
due := true
|
|
for pos, seg := range segs {
|
|
if seg != "*" && seg != "?" {
|
|
if due, batch[i].Err = g.C.CheckDue(seg, pos); !due || batch[i].Err != nil {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
batch[i].Due = due
|
|
cache[key] = batch[i]
|
|
}
|
|
return batch
|
|
}
|