sig
  module type S =
    sig
      module Date : Date_sig.S
      module Time : Time_sig.S
      type t
      type day = Date.day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
      type month =
        Date.month =
          Jan
        | Feb
        | Mar
        | Apr
        | May
        | Jun
        | Jul
        | Aug
        | Sep
        | Oct
        | Nov
        | Dec
      type year = Date.year
      type second = Time.second
      type field =
          [ `Day | `Hour | `Minute | `Month | `Second | `Week | `Year ]
      val make :
        int ->
        int -> int -> int -> int -> Calendar_sig.S.second -> Calendar_sig.S.t
      val lmake :
        year:int ->
        ?month:int ->
        ?day:int ->
        ?hour:int ->
        ?minute:int ->
        ?second:Calendar_sig.S.second -> unit -> Calendar_sig.S.t
      val create : Date.t -> Time.t -> Calendar_sig.S.t
      val now : unit -> Calendar_sig.S.t
      val from_jd : float -> Calendar_sig.S.t
      val from_mjd : float -> Calendar_sig.S.t
      val convert :
        Calendar_sig.S.t -> Time_Zone.t -> Time_Zone.t -> Calendar_sig.S.t
      val to_gmt : Calendar_sig.S.t -> Calendar_sig.S.t
      val from_gmt : Calendar_sig.S.t -> Calendar_sig.S.t
      val days_in_month : Calendar_sig.S.t -> int
      val day_of_week : Calendar_sig.S.t -> Calendar_sig.S.day
      val day_of_month : Calendar_sig.S.t -> int
      val day_of_year : Calendar_sig.S.t -> int
      val week : Calendar_sig.S.t -> int
      val month : Calendar_sig.S.t -> Calendar_sig.S.month
      val year : Calendar_sig.S.t -> int
      val to_jd : Calendar_sig.S.t -> float
      val to_mjd : Calendar_sig.S.t -> float
      val hour : Calendar_sig.S.t -> int
      val minute : Calendar_sig.S.t -> int
      val second : Calendar_sig.S.t -> Calendar_sig.S.second
      val equal : Calendar_sig.S.t -> Calendar_sig.S.t -> bool
      val compare : Calendar_sig.S.t -> Calendar_sig.S.t -> int
      val hash : Calendar_sig.S.t -> int
      val is_leap_day : Calendar_sig.S.t -> bool
      val is_gregorian : Calendar_sig.S.t -> bool
      val is_julian : Calendar_sig.S.t -> bool
      val is_pm : Calendar_sig.S.t -> bool
      val is_am : Calendar_sig.S.t -> bool
      val to_unixtm : Calendar_sig.S.t -> Unix.tm
      val from_unixtm : Unix.tm -> Calendar_sig.S.t
      val to_unixfloat : Calendar_sig.S.t -> float
      val from_unixfloat : float -> Calendar_sig.S.t
      val from_date : Date.t -> Calendar_sig.S.t
      val to_date : Calendar_sig.S.t -> Date.t
      val to_time : Calendar_sig.S.t -> Time.t
      module Period :
        sig
          type +'a period constraint 'a = [< Period.date_field ]
          type t = Period.date_field Calendar_sig.S.Period.period
          val empty : [< Period.date_field ] Calendar_sig.S.Period.period
          val add :
            ([< Period.date_field > `Day `Week ] as 'a)
            Calendar_sig.S.Period.period ->
            'Calendar_sig.S.Period.period ->
            'Calendar_sig.S.Period.period
          val sub :
            ([< Period.date_field > `Day `Week ] as 'a)
            Calendar_sig.S.Period.period ->
            'Calendar_sig.S.Period.period ->
            'Calendar_sig.S.Period.period
          val opp :
            ([< Period.date_field > `Day `Week ] as 'a)
            Calendar_sig.S.Period.period -> 'Calendar_sig.S.Period.period
          val equal :
            [< Period.date_field ] Calendar_sig.S.Period.period ->
            [< Period.date_field ] Calendar_sig.S.Period.period -> bool
          val compare :
            [< Period.date_field ] Calendar_sig.S.Period.period ->
            [< Period.date_field ] Calendar_sig.S.Period.period -> int
          val hash :
            [< Period.date_field ] Calendar_sig.S.Period.period -> int
          val make :
            int ->
            int ->
            int ->
            int -> int -> Calendar_sig.S.second -> Calendar_sig.S.Period.t
          val lmake :
            ?year:int ->
            ?month:int ->
            ?day:int ->
            ?hour:int ->
            ?minute:int ->
            ?second:Calendar_sig.S.second -> unit -> Calendar_sig.S.Period.t
          val year :
            int ->
            [< Period.date_field > `Year ] Calendar_sig.S.Period.period
          val month :
            int ->
            [< Period.date_field > `Month `Year ]
            Calendar_sig.S.Period.period
          val week :
            int ->
            [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
          val day :
            int ->
            [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
          val hour :
            int ->
            [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
          val minute :
            int ->
            [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
          val second :
            Calendar_sig.S.second ->
            [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
          val from_date :
            ([< Period.date_field ] as 'a) Date.Period.period ->
            'Calendar_sig.S.Period.period
          val from_time :
            ([< Period.date_field ] as 'a) Time.Period.period ->
            'Calendar_sig.S.Period.period
          val to_date :
            ([< Date.field ] as 'a) Calendar_sig.S.Period.period ->
            'Date.Period.period
          exception Not_computable
          val to_time :
            ([< Period.date_field ] as 'a) Calendar_sig.S.Period.period ->
            'Time.Period.period
          val safe_to_time :
            ([< `Day | `Week ] as 'a) Calendar_sig.S.Period.period ->
            'Time.Period.period
          val ymds :
            [< Period.date_field ] Calendar_sig.S.Period.period ->
            int * int * int * Calendar_sig.S.second
        end
      val add :
        Calendar_sig.S.t ->
        [< Period.date_field ] Calendar_sig.S.Period.period ->
        Calendar_sig.S.t
      val sub :
        Calendar_sig.S.t ->
        Calendar_sig.S.t ->
        [< Period.date_field > `Day `Week ] Calendar_sig.S.Period.period
      val precise_sub :
        Calendar_sig.S.t -> Calendar_sig.S.t -> Calendar_sig.S.Period.t
      val rem :
        Calendar_sig.S.t ->
        [< Period.date_field ] Calendar_sig.S.Period.period ->
        Calendar_sig.S.t
      val next : Calendar_sig.S.t -> Calendar_sig.S.field -> Calendar_sig.S.t
      val prev : Calendar_sig.S.t -> Calendar_sig.S.field -> Calendar_sig.S.t
    end
end