sig
  module type S =
    sig
      type field = Period.date_field
      type -'a date constraint 'a = [< Date_sig.S.field ]
      type t = Date_sig.S.field Date_sig.S.date
      type day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
      type month =
          Jan
        | Feb
        | Mar
        | Apr
        | May
        | Jun
        | Jul
        | Aug
        | Sep
        | Oct
        | Nov
        | Dec
      type year = int
      exception Out_of_bounds
      exception Undefined
      val make : Date_sig.S.year -> int -> int -> Date_sig.S.t
      val lmake :
        year:Date_sig.S.year ->
        ?month:int -> ?day:int -> unit -> Date_sig.S.t
      val make_year : int -> [< `Year ] Date_sig.S.date
      val make_year_month : int -> int -> [< `Month | `Year ] Date_sig.S.date
      val today : unit -> Date_sig.S.t
      val from_jd : int -> Date_sig.S.t
      val from_mjd : int -> Date_sig.S.t
      val from_day_of_year : Date_sig.S.year -> int -> Date_sig.S.t
      val days_in_month :
        [< Date_sig.S.field > `Month `Year ] Date_sig.S.date -> int
      val day_of_week : Date_sig.S.t -> Date_sig.S.day
      val day_of_month : Date_sig.S.t -> int
      val day_of_year : Date_sig.S.t -> int
      val week : Date_sig.S.t -> int
      val month :
        [< Date_sig.S.field > `Month ] Date_sig.S.date -> Date_sig.S.month
      val year :
        [< Date_sig.S.field > `Year ] Date_sig.S.date -> Date_sig.S.year
      val to_jd : Date_sig.S.t -> int
      val to_mjd : Date_sig.S.t -> int
      val equal :
        [< Date_sig.S.field ] Date_sig.S.date ->
        [< Date_sig.S.field ] Date_sig.S.date -> bool
      val compare :
        [< Date_sig.S.field ] Date_sig.S.date ->
        [< Date_sig.S.field ] Date_sig.S.date -> int
      val hash : [< Date_sig.S.field ] Date_sig.S.date -> int
      val is_valid_date : Date_sig.S.year -> int -> int -> bool
      val is_leap_day : Date_sig.S.t -> bool
      val is_gregorian : Date_sig.S.t -> bool
      val is_julian : Date_sig.S.t -> bool
      val to_unixtm : Date_sig.S.t -> Unix.tm
      val from_unixtm : Unix.tm -> Date_sig.S.t
      val to_unixfloat : Date_sig.S.t -> float
      val from_unixfloat : float -> Date_sig.S.t
      val to_business :
        Date_sig.S.t -> Date_sig.S.year * int * Date_sig.S.day
      val from_business :
        Date_sig.S.year -> int -> Date_sig.S.day -> Date_sig.S.t
      val int_of_day : Date_sig.S.day -> int
      val day_of_int : int -> Date_sig.S.day
      val int_of_month : Date_sig.S.month -> int
      val month_of_int : int -> Date_sig.S.month
      module Period :
        sig
          type +'a p constraint 'a = [< Date_sig.S.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 : [< Date_sig.S.field ] period -> int
          val safe_nb_days : [< `Day | `Week ] period -> int
          val ymd : [< Date_sig.S.field ] period -> int * int * int
        end
      val add :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        'Date_sig.S.Period.period -> 'Date_sig.S.date
      val sub :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        'Date_sig.S.date ->
        [< Date_sig.S.field > `Day `Week ] Date_sig.S.Period.period
      val precise_sub :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        'Date_sig.S.date -> Date_sig.S.Period.t
      val rem :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        'Date_sig.S.Period.period -> 'Date_sig.S.date
      val next :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        '-> 'Date_sig.S.date
      val prev :
        ([< Date_sig.S.field ] as 'a) Date_sig.S.date ->
        '-> 'Date_sig.S.date
      val is_leap_year : Date_sig.S.year -> bool
      val same_calendar : Date_sig.S.year -> Date_sig.S.year -> bool
      val days_in_year : ?month:Date_sig.S.month -> Date_sig.S.year -> int
      val weeks_in_year : Date_sig.S.year -> int
      val week_first_last :
        int -> Date_sig.S.year -> Date_sig.S.t * Date_sig.S.t
      val nth_weekday_of_month :
        Date_sig.S.year ->
        Date_sig.S.month -> Date_sig.S.day -> int -> Date_sig.S.t
      val century : Date_sig.S.year -> int
      val millenium : Date_sig.S.year -> int
      val solar_number : Date_sig.S.year -> int
      val indiction : Date_sig.S.year -> int
      val golden_number : Date_sig.S.year -> int
      val epact : Date_sig.S.year -> int
      val easter : Date_sig.S.year -> Date_sig.S.t
      val carnaval : Date_sig.S.year -> Date_sig.S.t
      val mardi_gras : Date_sig.S.year -> Date_sig.S.t
      val ash : Date_sig.S.year -> Date_sig.S.t
      val palm : Date_sig.S.year -> Date_sig.S.t
      val easter_friday : Date_sig.S.year -> Date_sig.S.t
      val easter_saturday : Date_sig.S.year -> Date_sig.S.t
      val easter_monday : Date_sig.S.year -> Date_sig.S.t
      val ascension : Date_sig.S.year -> Date_sig.S.t
      val withsunday : Date_sig.S.year -> Date_sig.S.t
      val withmonday : Date_sig.S.year -> Date_sig.S.t
      val corpus_christi : Date_sig.S.year -> Date_sig.S.t
    end
end