1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
open Date_time_utils
let fixed_to_weekday = `Mon
type t = { jd : int }
let equal (x : t) (y : t) = x.jd = y.jd
let lt (x : t) (y : t) = x.jd < y.jd
let le (x : t) (y : t) = x.jd <= y.jd
let gt (x : t) (y : t) = x.jd > y.jd
let ge (x : t) (y : t) = x.jd >= y.jd
let compare (x : t) (y : t) = compare x.jd y.jd
type error =
[ `Does_not_exist
| `Invalid_iso_year of int
| `Invalid_iso_week of int
]
exception Error_exn of error
let make ~year ~week : (t, error) result =
if year < Constants.min_year || Constants.max_year < year then
Error (`Invalid_iso_year year)
else if week < 1 || week_count_of_iso_year ~year < week then
Error (`Invalid_iso_week week)
else Ok { jd = jd_of_iso_week_date ~year ~week ~weekday:fixed_to_weekday }
let make_exn ~year ~week : t =
match make ~year ~week with Error e -> raise (Error_exn e) | Ok x -> x
let year_week t : int * int =
let year, week, weekday = iso_week_date_of_jd t.jd in
assert (weekday = fixed_to_weekday);
(year, week)
let year t : int = fst @@ year_week t
let week t : int = snd @@ year_week t
let sub ~weeks (t : t) : t = { jd = t.jd - (weeks * 7) }
let add ~weeks (t : t) : t = { jd = t.jd + (weeks * 7) }
let diff_weeks t1 t2 = (t1.jd - t2.jd) / 7