Documentation
¶
Index ¶
- Variables
- type CompositeSchedule
- type DayPart
- type DayPartition
- type DaySchedule
- type DaySlot
- type MultiSlotSchedule
- type Schedule
- func (s Schedule) AvailableMinutes(day time.Time) int
- func (s Schedule) Contains(t time.Time) bool
- func (s Schedule) MatchesDay(t time.Time) bool
- func (s Schedule) MatchesTime(t time.Time) bool
- func (s Schedule) NextMatchingDay(from time.Time) time.Time
- func (s Schedule) NextNonMatchingDay(from time.Time) time.Time
- func (s Schedule) PrevMatchingDay(from time.Time) time.Time
- func (s Schedule) PrevNonMatchingDay(from time.Time) time.Time
- func (s Schedule) SlotsForDay(day time.Time) []TimeSlot
- func (s Schedule) SlotsForRange(from, to time.Time) []TimeSlot
- type TimeOfDay
- type TimeRange
- type TimeSlot
- type Vocabulary
- type WeekPattern
- type WeekPatterns
Constants ¶
This section is empty.
Variables ¶
var DefaultDayPartition = DayPartition{ {Name: "night", Span: DaySlot{Start: TimeOfDay{Hour: 22}, End: TimeOfDay{Hour: 29}}}, {Name: "morning", Span: DaySlot{Start: TimeOfDay{Hour: 5}, End: TimeOfDay{Hour: 12}}}, {Name: "lunchtime", Span: DaySlot{Start: TimeOfDay{Hour: 12}, End: TimeOfDay{Hour: 14}}}, {Name: "afternoon", Span: DaySlot{Start: TimeOfDay{Hour: 14}, End: TimeOfDay{Hour: 17}}}, {Name: "evening", Span: DaySlot{Start: TimeOfDay{Hour: 17}, End: TimeOfDay{Hour: 22}}}, }
DefaultDayPartition is the canonical partition of the day. Replace it (or build a custom Vocabulary) for app-specific slicing, and Validate any custom partition first.
var DefaultWorkingHoursSchedule = Schedule{ Days: []time.Weekday{time.Monday, time.Tuesday, time.Wednesday, time.Thursday, time.Friday}, StartHour: 9, EndHour: 17, }
DefaultWorkingHoursSchedule is a standard Monday-Friday 9-17 working hours schedule.
Functions ¶
This section is empty.
Types ¶
type CompositeSchedule ¶ added in v0.0.9
type CompositeSchedule struct {
Groups []DaySchedule
Location *time.Location
}
CompositeSchedule combines multiple DaySchedule groups into one. A day matches if any group matches; slots are the union of all matching groups.
func (CompositeSchedule) MatchesDay ¶ added in v0.0.9
func (cs CompositeSchedule) MatchesDay(t time.Time) bool
func (CompositeSchedule) PrevMatchingDay ¶ added in v0.0.9
func (cs CompositeSchedule) PrevMatchingDay(from time.Time) time.Time
func (CompositeSchedule) SlotsForDay ¶ added in v0.0.9
func (cs CompositeSchedule) SlotsForDay(day time.Time) []TimeSlot
type DayPart ¶ added in v0.3.0
type DayPart struct {
Name string // canonical singular: "morning", "night", ...
Span DaySlot // may cross midnight (End.Hour >= 24)
}
DayPart is one named slice of the day within a DayPartition.
type DayPartition ¶ added in v0.3.0
type DayPartition []DayPart
DayPartition is an ordered set of DayParts that must cover the full 24h exactly once (no gaps, no overlaps, modulo midnight wrap), so one table drives both filtering ("mornings") and classification (PartOf). Validate enforces it, which makes PartOf total and a safe group-by key.
func (DayPartition) PartOf ¶ added in v0.3.0
func (dp DayPartition) PartOf(t time.Time) DayPart
PartOf classifies t's wall clock into its part of the day. On a Validate'd partition it is total: every minute belongs to exactly one part. A partition violating the invariant may return the zero DayPart for uncovered minutes.
func (DayPartition) Validate ¶ added in v0.3.0
func (dp DayPartition) Validate() error
Validate enforces the partition invariant: every minute of the day is covered by exactly one part. Overlaps and gaps are reported with the exact wall-clock minute so a misconfigured custom partition fails loudly instead of silently misclassifying.
type DaySchedule ¶ added in v0.0.9
type DaySchedule interface {
MatchesDay(t time.Time) bool
SlotsForDay(day time.Time) []TimeSlot
PrevMatchingDay(from time.Time) time.Time
}
DaySchedule is the common interface for schedule types that can produce per-day time slots and navigate matching days.
type DaySlot ¶ added in v0.0.9
DaySlot represents a continuous time window within a day, possibly crossing midnight.
type MultiSlotSchedule ¶ added in v0.0.9
MultiSlotSchedule defines multiple disjoint time windows per day.
func (MultiSlotSchedule) MatchesDay ¶ added in v0.0.9
func (ms MultiSlotSchedule) MatchesDay(t time.Time) bool
MatchesDay returns true if t's weekday is one of the schedule's days.
func (MultiSlotSchedule) PrevMatchingDay ¶ added in v0.0.9
func (ms MultiSlotSchedule) PrevMatchingDay(from time.Time) time.Time
PrevMatchingDay finds the previous day matching the schedule, or returns from when no day in the past week matches.
func (MultiSlotSchedule) SlotsForDay ¶ added in v0.0.9
func (ms MultiSlotSchedule) SlotsForDay(day time.Time) []TimeSlot
SlotsForDay generates time slots for a single day from multi-slot config. Cross-midnight slots (hour >= 24) naturally extend into the next calendar day.
type Schedule ¶
type Schedule struct {
Days []time.Weekday // e.g., [Mon, Tue, Wed, Thu, Fri]
StartHour int // e.g., 9
EndHour int // e.g., 17
Gaps []TimeRange // optional gaps (e.g., lunch: [{12, 13}])
Location *time.Location // nil reads times in their own location
}
Schedule defines working hours for a set of days.
func (Schedule) AvailableMinutes ¶
AvailableMinutes returns total available minutes in schedule for a day.
func (Schedule) Contains ¶
Contains returns true if t matches both the day and time of the schedule.
func (Schedule) MatchesDay ¶
MatchesDay returns true if t's weekday is one of the schedule's days.
func (Schedule) MatchesTime ¶
MatchesTime returns true if t's time-of-day is within schedule hours (excluding gaps).
func (Schedule) NextMatchingDay ¶
NextMatchingDay finds the next day matching the schedule, or returns from when no day in the next week matches.
func (Schedule) NextNonMatchingDay ¶
NextNonMatchingDay finds the next day not matching the schedule, or returns from when every day of the next week matches.
func (Schedule) PrevMatchingDay ¶
PrevMatchingDay finds the previous day matching the schedule, or returns from when no day in the past week matches. On a Mon-Fri schedule, Sunday gives Friday.
func (Schedule) PrevNonMatchingDay ¶
PrevNonMatchingDay finds the previous day not matching the schedule, or returns from when every day of the past week matches. On a Mon-Fri schedule, Monday gives Sunday.
func (Schedule) SlotsForDay ¶
SlotsForDay generates the schedule's hour slots for a single day, split around Gaps, which must be sorted by start hour.
type TimeOfDay ¶ added in v0.0.9
TimeOfDay represents a time-of-day with minute precision. Hour can be >= 24 for cross-midnight support (e.g., 26:00 = 2AM next day).
func (TimeOfDay) ToDuration ¶ added in v0.0.9
ToDuration converts TimeOfDay to a duration from midnight.
type Vocabulary ¶ added in v0.3.0
type Vocabulary struct {
Partition DayPartition
Extra map[string]WeekPatterns // app-specific terms, e.g. "officehours"
}
Vocabulary resolves human terms ("weekends", "mornings") to week patterns. The zero-config default (package-level ParsePatterns) uses DefaultDayPartition and the built-in weekday terms; apps may build their own to add domain words or a custom partition.
It is separate from the root package's aliases, which resolve to absolute instants or periods ("last-week" is a concrete week); a week pattern is a recurring predicate with no anchor in absolute time.
func DefaultVocabulary ¶ added in v0.3.0
func DefaultVocabulary() Vocabulary
DefaultVocabulary is the built-in vocabulary: weekday terms plus DefaultDayPartition part names.
func (Vocabulary) ParsePatterns ¶ added in v0.3.0
func (v Vocabulary) ParsePatterns(s string) (WeekPatterns, error)
ParsePatterns converts a comma-separated list of vocabulary terms into a union of week patterns:
input := term ("," term)* // comma = union (OR)
term := dayset | daypart
dayset := "monday(s)" … "sunday(s)" | "weekend(s)"
| "workingday(s)" | "workday(s)" | "weekday(s)"
daypart:= partition part name, singular or plural
Terms are case-insensitive, whitespace-trimmed and plural-tolerant. The result is a list because mixed unions ("sundays,mornings" = sundays all day OR mornings every day) are not expressible in a single {Days, Spans} conjunction. An unknown term errors listing the known vocabulary.
type WeekPattern ¶ added in v0.3.0
WeekPattern is a recurring weekly wall-clock pattern: a conjunction of "weekday ∈ Days" and "time-of-day ∈ one of Spans".
- Days empty => every day
- Spans empty => the whole day
Spans reuse DaySlot; End.Hour may exceed 24 (cross-midnight). A cross-midnight span is attributed to the day it starts on: {Days: [Sunday], Spans: [{22:00, 29:00}]} covers Sunday 22:00 through Monday 05:00.
Unlike Schedule, a WeekPattern has no anchor in absolute time and no timezone opinion: Contains reads the wall clock of the given time value in its own location. Callers own locality.
func (WeekPattern) Contains ¶ added in v0.3.0
func (p WeekPattern) Contains(t time.Time) bool
Contains reports whether t's wall clock matches the pattern.
The attribution rule: Contains(t) is true iff there exists a day d (t's own date or the previous date) such that weekday(d) ∈ Days (or Days is empty) and t ∈ [d+span.Start, d+span.End) for some span. A cross-midnight span belongs to the day it starts on, so a "Sunday nights" pattern includes Monday 01:00, matching human usage.
func (WeekPattern) MultiSlotSchedule ¶ added in v0.3.0
func (p WeekPattern) MultiSlotSchedule(loc *time.Location) MultiSlotSchedule
MultiSlotSchedule converts the pattern into an equivalent MultiSlotSchedule pinned to the given location, so the existing slot math (SlotsForDay, PrevMatchingDay, ...) works on patterns. Empty Days/Spans are expanded into their explicit meanings (every day / the whole day).
func (WeekPattern) Validate ¶ added in v0.3.0
func (p WeekPattern) Validate() error
Validate checks the pattern for sane weekdays and spans: minutes within 0-59, spans starting within their own day (< 24h), ending after they start and before the second midnight (< 48h).
type WeekPatterns ¶ added in v0.3.0
type WeekPatterns []WeekPattern
WeekPatterns is a union (OR) of patterns.
func ParsePatterns ¶ added in v0.3.0
func ParsePatterns(s string) (WeekPatterns, error)
ParsePatterns parses s using DefaultVocabulary.
func (WeekPatterns) Contains ¶ added in v0.3.0
func (ps WeekPatterns) Contains(t time.Time) bool
Contains reports whether t matches any of the patterns (union semantics).
func (WeekPatterns) Validate ¶ added in v0.3.0
func (ps WeekPatterns) Validate() error
Validate checks every pattern of the union.