Library
Module
Module type
Parameter
Class
Class type
This is the core type of Timere used to encode computation over time.
The following documentation may call value of type t
"a Timere object", or "timere".
val now : unit -> t
Time right now
val always : t
Entire interval that Timere can handle, i.e. [0000 Jan 01 14:00:00 +00:00:00, 9999 Dec 31 09:59:58 +00:00:00)
val empty : t
Empty interval
val years : int list -> t
years l
is a shorthand for pattern ~years:l ()
month_ranges l
is a shorthand for pattern ~month_ranges:l ()
val days : int list -> t
days l
is a shorthand for pattern ~month_days:l ()
weekday_ranges l
is a shorthand for pattern ~weekday_ranges:l ()
val hours : int list -> t
hours l
is a shorthand for pattern ~hours:l ()
val minutes : int list -> t
minutes l
is a shorthand for pattern ~minutes:l ()
minute_ranges l
is a shorthand for pattern ~minute_ranges:l ()
val seconds : int list -> t
seconds l
is a shorthand for pattern ~seconds:l ()
second_ranges l
is a shorthand for pattern ~second_ranges:l ()
val pattern :
?years:int list ->
?year_ranges:int range list ->
?months:month list ->
?month_ranges:month range list ->
?days:int list ->
?day_ranges:int range list ->
?weekdays:weekday list ->
?weekday_ranges:weekday range list ->
?hours:int list ->
?hour_ranges:int range list ->
?minutes:int list ->
?minute_ranges:int range list ->
?seconds:int list ->
?second_ranges:int range list ->
unit ->
t
Pattern matches over date times.
A pattern p
matches date time dt
if
(dt.year is in p.years or p.year_ranges) && (dt.month is in p.months or p.month_ranges) && (dt.month_day is in p.month_days or p.month_day_ranges) && (dt.weekday is in p.weekdays or p.weekday_ranges) && (dt.hour is in p.hours or p.hour_ranges) && (dt.minute is in p.minutes or p.minute_ranges) && (dt.second is in p.seconds or p.second_ranges)
Empty pattern levels are treated as wildcard, e.g. if p.years
and p.year_ranges
are both empty, then (dt.year is in p.years or p.year_ranges)
is true
.
nth_weekday_of_month n wday
picks the nth weekday of all months, where 1 <= n && n <= 5
module Span : sig ... end
module Duration : sig ... end
val shift : Duration.t -> t -> t
val lengthen : Duration.t -> t -> t
module Time_zone : sig ... end
val with_tz : Time_zone.t -> t -> t
with_tz tz t
changes the time zone to evaluate t
in to tz
type timestamp = Span.t
module Date_time : sig ... end
module Timestamp : sig ... end
val date_time : Date_time.t -> t
val before : Date_time.t -> t
val after : Date_time.t -> t
val date_times : Date_time.t list -> t
val date_time_seq : Date_time.t Seq.t -> t
val sorted_date_times : Date_time.t list -> t
val sorted_date_time_seq : Date_time.t Seq.t -> t
timestamps l
skip_invalid
defaults to false
timestamps s
skip_invalid
defaults to false
module Interval : sig ... end
val intervals : ?skip_invalid:bool -> Interval.t list -> t
intervals l
skip_invalid
defaults to false
val interval_seq : ?skip_invalid:bool -> Interval.t Seq.t -> t
interval_seq s
skip_invalid
defaults to false
val sorted_intervals : ?skip_invalid:bool -> Interval.t list -> t
sorted_intervals l
skip_invalid
defaults to false
val sorted_interval_seq : ?skip_invalid:bool -> Interval.t Seq.t -> t
sorted_interval_seq s
skip_invalid
defaults to false
Pattern matching intervals are designed to handle intervals where start and end points follow some pattern, but cannot be captured by pattern
efficiently, e.g. you cannot represent "5:30pm to 6:11pm" via a single pattern
val make_points :
?tz:Time_zone.t ->
?tz_offset_s:int ->
?year:int ->
?month:month ->
?day:int ->
?weekday:weekday ->
?hour:int ->
?minute:int ->
second:int ->
unit ->
points option
make_points
call must be exactly one of the following forms (ignoring tz
and tz_offset_s
which are optional in all cases)
make_points ~year:_ ~month:_ ~day:_ ~hour:_ ~minute:_ ~second:_ () make_points ~month:_ ~day:_ ~hour:_ ~minute:_ ~second:_ () make_points ~day:_ ~hour:_ ~minute:_ ~second:_ () make_points ~weekday:_ ~hour:_ ~minute:_ ~second:_ () make_points ~hour:_ ~minute:_ ~second:_ () make_points ~minute:_ ~second:_ () make_points ~second:_ ()
returns Error
otherwise
val make_points_exn :
?tz:Time_zone.t ->
?tz_offset_s:int ->
?year:int ->
?month:month ->
?day:int ->
?weekday:weekday ->
?hour:int ->
?minute:int ->
second:int ->
unit ->
points
val bounded_intervals :
[ `Whole | `Snd ] ->
Duration.t ->
points ->
points ->
t
bounded_intervals mode bound p1 p2
for each point x
matched by p1
, then for the earliest point y
matched by p2
such that x < y && y - x <= bound
mode = `Whole
, yields (x, y)mode = `Snd
, yields (y, y + 1)Examples:
bounded_intervals `Whole (Duration.make ~days:1 ())
(make_points ~hour:13 ~minute:0 ~second:0 ()) (* p1 *)
(make_points ~hour:14 ~minute:0 ~second:0 ()) (* p2 *)
yields all the "1pm to 2pm" intervals, since at each "1pm" mark represented by p1
, searching forward up to 24 hour period, we can find a "2pm" mark in p2
bounded_intervals `Whole (Duration.make ~days:1 ())
(make_points ~month:`Feb ~day:10 ~hour:13 ~minute:0 ~second:0 ()) (* p1 *)
(make_points ~hour:14 ~minute:0 ~second:0 ()) (* p2 *)
yields all the "Feb 10th 1pm to 2pm" intervals (or specifically "Feb 10th 1pm to Feb 10th 2pm")
bounded_intervals `Whole (Duration.make ~days:1 ())
(make_points ~month:`Feb ~day:10 ~hour:23 ~minute:0 ~second:0 ()) (* p1 *)
(make_points ~hour:3 ~minute:0 ~second:0 ()) (* p2 *)
yields all the "Feb 10th 11pm to 3am" intervals (or specifically "Feb 10th 11pm to Feb 11th 3am")
Convenience wrappers around points
and bounded_intervals
val make_hms : hour:int -> minute:int -> second:int -> hms option
val make_hms_exn : hour:int -> minute:int -> second:int -> hms
Same as hms_intervals_exc ...
with end point increased by one second
Same as bounded_intervals ...
with bound fixed to Duration.make ~days:1 ()
val pp_hms : Format.formatter -> hms -> unit
val string_of_hms : hms -> string
type chunking = [
| `Disjoint_intervals
| `By_duration of Duration.t
| `By_duration_drop_partial of Duration.t
| `At_year_boundary
| `At_month_boundary
]
Ways to chunk/slice time intervals for the selector.
`Disjoint_intervals
gives a sequence of disjoint intervals to the selector, specifically they are in ascending order, non-overlapping, non-connecting, and unique`By_duration
slices in the fixed size specified by the duration. Partial chunks (chunks less than the fixed size) are preserved.`By_duration_drop_partial
slices in the fixed size specified by the duration. Partial chunks (chunks less than the fixed size) are discarded.`At_year_boundary
slices at the year boundary (e.g. 2021 Jan 1st 00:00:00
)`At_month_boundary
slices at the month boundary (e.g. Aug 1st 00:00:00
)chunk chunking f t
applies chunked
selector f
on t
You may find (%>)
useful for chaining selectors together, e.g. drop 5 %> take 2
chunk_again chunking f
applies chunked
selector f
as a selector
Take every nth chunk, specifically 0
th, n
th, 2n
th, 3n
th, ...
Composition, mainly for chunked selectors
f1 %> f2
is equivalent to fun x -> x |> f1 |> f2
.
val resolve :
?search_using_tz:Time_zone.t ->
t ->
(Interval.t Seq.t, string) result
Resolves a Timere object into a concrete interval sequence
val pp_intervals :
?display_using_tz:Time_zone.t ->
?format:string ->
?sep:unit Fmt.t ->
unit ->
Format.formatter ->
Interval.t Seq.t ->
unit
These functions are suitable for debugging, serializing and deserializing timeres.
The sexp is a precise description of the steps used to construct a timere. As such deserialization is accurate and goes through the exact same construction steps (including validation) as one would using the construction API directly.
val to_sexp_string : t -> string
val pp_sexp : Format.formatter -> t -> unit
module Utils : sig ... end