123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163(* Copyright (c) 2026, Cargocut and the Lunar developers.
All rights reserved.
SPDX-License-Identifier: BSD-3-Clause *)typet=|Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dectypeerror=|Invalid_month_numberofint|Invalid_month_stringofstringletall=[Jan;Feb;Mar;Apr;May;Jun;Jul;Aug;Sep;Oct;Nov;Dec]letto_int=function|Jan->1|Feb->2|Mar->3|Apr->4|May->5|Jun->6|Jul->7|Aug->8|Sep->9|Oct->10|Nov->11|Dec->12;;letfrom_int=function|1->OkJan|2->OkFeb|3->OkMar|4->OkApr|5->OkMay|6->OkJun|7->OkJul|8->OkAug|9->OkSep|10->OkOct|11->OkNov|12->OkDec|n->Error(Invalid_month_numbern);;letto_string=function|Jan->"january"|Feb->"february"|Mar->"march"|Apr->"april"|May->"may"|Jun->"june"|Jul->"july"|Aug->"august"|Sep->"september"|Oct->"october"|Nov->"november"|Dec->"december";;letto_short_string=function|Jan->"jan"|Feb->"feb"|Mar->"mar"|Apr->"apr"|May->"may"|Jun->"jun"|Jul->"jul"|Aug->"aug"|Sep->"sep"|Oct->"oct"|Nov->"nov"|Dec->"dec";;letfrom_stringstr=matchString.(trim@@lowercase_asciistr)with|"jan"|"january"->OkJan|"feb"|"february"->OkFeb|"mar"|"march"->OkMar|"apr"|"april"->OkApr|"may"->OkMay|"jun"|"june"->OkJun|"jul"|"july"->OkJul|"aug"|"august"->OkAug|"sep"|"september"->OkSep|"oct"|"october"->OkOct|"nov"|"november"->OkNov|"dec"|"december"->OkDec|s->Error(Invalid_month_strings);;letdays_in~year=function|Jan|Mar|May|Jul|Aug|Oct|Dec->31|Feb->ifUtil.is_leap_yearyearthen29else28|Apr|Jun|Sep|Nov->30;;letsucc=function|Dec->Jan|mon->from_int(succ@@to_intmon)|>(* NOTE: [Dec] case is guarded so [get_ok] is safe. *)Result.get_ok;;letpred=function|Jan->Dec|mon->from_int(pred@@to_intmon)|>(* NOTE: [Jan] case is guarded so [get_ok] is safe. *)Result.get_ok;;letequalab=leta=to_intaandb=to_intbinInt.equalab;;letcompareab=leta=to_intaandb=to_intbinInt.compareab;;letquarter_of=function|Jan|Feb|Mar->Jan,Mar|Apr|May|Jun->Apr,Jun|Jul|Aug|Sep->Jul,Sep|Oct|Nov|Dec->Oct,Dec;;moduleCE=structtypenonrect=tletequal=equalletcompare=compareendincludeUtil.Make_compare_helpers(CE)moduleInfix=structincludeUtil.Make_equal_infix(CE)includeUtil.Make_compare_infix(CE)endmoduleMap=Stdlib.Map.Make(CE)moduleSet=Stdlib.Set.Make(CE)includeInfix