sig
  type +'a p constraint 'a = [< field ]
  type +'a period = 'a p constraint 'a = [< field ]
  type t = Period.date_field period
  val empty : [< Period.date_field ] period
  val add : ([< Period.date_field ] as 'a) period -> 'a period -> 'a period
  val sub : ([< Period.date_field ] as 'a) period -> 'a period -> 'a period
  val opp : ([< Period.date_field ] as 'a) period -> 'a period
  val equal :
    [< Period.date_field ] period -> [< Period.date_field ] period -> bool
  val compare :
    [< Period.date_field ] period -> [< Period.date_field ] period -> int
  val hash : [< Period.date_field ] period -> int
  val make : int -> int -> int -> Date_sig.S.t
  val lmake : ?year:int -> ?month:int -> ?day:int -> unit -> Date_sig.S.t
  val year : int -> [< Date_sig.S.field > `Year ] period
  val month : int -> [< Date_sig.S.field > `Month `Year ] period
  val week : int -> [< Date_sig.S.field > `Day `Week ] period
  val day : int -> [< Date_sig.S.field > `Day `Week ] period
  exception Not_computable
  val nb_days : [< field ] period -> int
  val safe_nb_days : [< `Day | `Week ] period -> int
  val ymd : [< field ] period -> int * int * int
end