sig
  type date_field = [ `Day | `Month | `Week | `Year ]
  module type S =
    sig
      type +'a period constraint 'a = [< Period.date_field ]
      type t = Period.date_field Period.S.period
      val empty : [< Period.date_field ] Period.S.period
      val add :
        ([< Period.date_field ] as 'a) Period.S.period ->
        'Period.S.period -> 'Period.S.period
      val sub :
        ([< Period.date_field ] as 'a) Period.S.period ->
        'Period.S.period -> 'Period.S.period
      val opp :
        ([< Period.date_field ] as 'a) Period.S.period -> 'Period.S.period
      val equal :
        [< Period.date_field ] Period.S.period ->
        [< Period.date_field ] Period.S.period -> bool
      val compare :
        [< Period.date_field ] Period.S.period ->
        [< Period.date_field ] Period.S.period -> int
      val hash : [< Period.date_field ] Period.S.period -> int
    end
end