sig
  module Make :
    functor (D : Date_sig.S) (T : Time_sig.S->
      sig
        module Date :
          sig
            type field = Period.date_field
            type -'a date = 'D.date constraint 'a = [< field ]
            type t = field date
            type day = D.day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
            type month =
              D.month =
                Jan
              | Feb
              | Mar
              | Apr
              | May
              | Jun
              | Jul
              | Aug
              | Sep
              | Oct
              | Nov
              | Dec
            type year = int
            exception Out_of_bounds
            exception Undefined
            val make : year -> int -> int -> t
            val lmake : year:year -> ?month:int -> ?day:int -> unit -> t
            val make_year : int -> [< `Year ] date
            val make_year_month : int -> int -> [< `Month | `Year ] date
            val today : unit -> t
            val from_jd : int -> t
            val from_mjd : int -> t
            val from_day_of_year : year -> int -> t
            val days_in_month : [< field > `Month `Year ] date -> int
            val day_of_week : t -> day
            val day_of_month : t -> int
            val day_of_year : t -> int
            val week : t -> int
            val month : [< field > `Month ] date -> month
            val year : [< field > `Year ] date -> year
            val to_jd : t -> int
            val to_mjd : t -> int
            val equal : [< field ] date -> [< field ] date -> bool
            val compare : [< field ] date -> [< field ] date -> int
            val hash : [< field ] date -> int
            val is_valid_date : year -> int -> int -> bool
            val is_leap_day : t -> bool
            val is_gregorian : t -> bool
            val is_julian : t -> bool
            val to_unixtm : t -> Unix.tm
            val from_unixtm : Unix.tm -> t
            val to_unixfloat : t -> float
            val from_unixfloat : float -> t
            val to_business : t -> year * int * day
            val from_business : year -> int -> day -> t
            val int_of_day : day -> int
            val day_of_int : int -> day
            val int_of_month : month -> int
            val month_of_int : int -> month
            module Period :
              sig
                type +'a p = 'D.Period.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 -> t
                val lmake : ?year:int -> ?month:int -> ?day:int -> unit -> t
                val year : int -> [< field > `Year ] period
                val month : int -> [< field > `Month `Year ] period
                val week : int -> [< field > `Day `Week ] period
                val day : int -> [< 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
            val add : ([< field ] as 'a) date -> 'Period.period -> 'a date
            val sub :
              ([< field ] as 'a) date ->
              'a date -> [< field > `Day `Week ] Period.period
            val precise_sub : ([< field ] as 'a) date -> 'a date -> Period.t
            val rem : ([< field ] as 'a) date -> 'Period.period -> 'a date
            val next : ([< field ] as 'a) date -> '-> 'a date
            val prev : ([< field ] as 'a) date -> '-> 'a date
            val is_leap_year : year -> bool
            val same_calendar : year -> year -> bool
            val days_in_year : ?month:month -> year -> int
            val weeks_in_year : year -> int
            val week_first_last : int -> year -> t * t
            val nth_weekday_of_month : year -> month -> day -> int -> t
            val century : year -> int
            val millenium : year -> int
            val solar_number : year -> int
            val indiction : year -> int
            val golden_number : year -> int
            val epact : year -> int
            val easter : year -> t
            val carnaval : year -> t
            val mardi_gras : year -> t
            val ash : year -> t
            val palm : year -> t
            val easter_friday : year -> t
            val easter_saturday : year -> t
            val easter_monday : year -> t
            val ascension : year -> t
            val withsunday : year -> t
            val withmonday : year -> t
            val corpus_christi : year -> t
          end
        module Time :
          sig
            type t = T.t
            type field = [ `Hour | `Minute | `Second ]
            type second = T.second
            module Second :
              sig
                type t = second
                val from_int : int -> t
                val from_float : float -> t
                val to_int : t -> int
                val to_float : t -> float
              end
            val make : int -> int -> second -> t
            val lmake :
              ?hour:int -> ?minute:int -> ?second:second -> unit -> t
            val now : unit -> t
            val midnight : unit -> t
            val midday : unit -> t
            val convert : t -> Time_Zone.t -> Time_Zone.t -> t
            val from_gmt : t -> t
            val to_gmt : t -> t
            val normalize : t -> t * int
            val hour : t -> int
            val minute : t -> int
            val second : t -> second
            val to_seconds : t -> second
            val to_minutes : t -> float
            val to_hours : t -> float
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val hash : t -> int
            val is_pm : t -> bool
            val is_am : t -> bool
            val from_seconds : second -> t
            val from_minutes : float -> t
            val from_hours : float -> t
            module Period :
              sig
                type +'a period = 'T.Period.period
                  constraint 'a = [< Period.date_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 length : [< Period.date_field ] period -> second
                val mul :
                  ([< Period.date_field ] as 'a) period ->
                  'a period -> 'a period
                val div :
                  ([< Period.date_field ] as 'a) period ->
                  'a period -> 'a period
                val make :
                  int -> int -> second -> [< Period.date_field ] period
                val lmake :
                  ?hour:int ->
                  ?minute:int ->
                  ?second:second -> unit -> [< Period.date_field ] period
                val hour : int -> [< Period.date_field ] period
                val minute : int -> [< Period.date_field ] period
                val second : second -> [< Period.date_field ] period
                val to_seconds : [< Period.date_field ] period -> second
                val to_minutes : [< Period.date_field ] period -> float
                val to_hours : [< Period.date_field ] period -> float
              end
            val add : t -> [< Period.date_field ] Period.period -> t
            val sub : t -> t -> [< Period.date_field ] Period.period
            val rem : t -> [< Period.date_field ] Period.period -> t
            val next : t -> field -> t
            val prev : t -> field -> t
          end
        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 -> second -> t
        val lmake :
          year:int ->
          ?month:int ->
          ?day:int -> ?hour:int -> ?minute:int -> ?second:second -> unit -> t
        val create : Date.t -> Time.t -> t
        val now : unit -> t
        val from_jd : float -> t
        val from_mjd : float -> t
        val convert : t -> Time_Zone.t -> Time_Zone.t -> t
        val to_gmt : t -> t
        val from_gmt : t -> t
        val days_in_month : t -> int
        val day_of_week : t -> day
        val day_of_month : t -> int
        val day_of_year : t -> int
        val week : t -> int
        val month : t -> month
        val year : t -> int
        val to_jd : t -> float
        val to_mjd : t -> float
        val hour : t -> int
        val minute : t -> int
        val second : t -> second
        val equal : t -> t -> bool
        val compare : t -> t -> int
        val hash : t -> int
        val is_leap_day : t -> bool
        val is_gregorian : t -> bool
        val is_julian : t -> bool
        val is_pm : t -> bool
        val is_am : t -> bool
        val to_unixtm : t -> Unix.tm
        val from_unixtm : Unix.tm -> t
        val to_unixfloat : t -> float
        val from_unixfloat : float -> t
        val from_date : Date.t -> t
        val to_date : t -> Date.t
        val to_time : t -> Time.t
        module Period :
          sig
            type +'a period constraint 'a = [< Period.date_field ]
            type t = Period.date_field period
            val empty : [< Period.date_field ] period
            val add :
              ([< Period.date_field > `Day `Week ] as 'a) period ->
              'a period -> 'a period
            val sub :
              ([< Period.date_field > `Day `Week ] as 'a) period ->
              'a period -> 'a period
            val opp :
              ([< Period.date_field > `Day `Week ] 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 -> int -> int -> second -> t
            val lmake :
              ?year:int ->
              ?month:int ->
              ?day:int ->
              ?hour:int -> ?minute:int -> ?second:second -> unit -> t
            val year : int -> [< Period.date_field > `Year ] period
            val month : int -> [< Period.date_field > `Month `Year ] period
            val week : int -> [< Period.date_field > `Day `Week ] period
            val day : int -> [< Period.date_field > `Day `Week ] period
            val hour : int -> [< Period.date_field > `Day `Week ] period
            val minute : int -> [< Period.date_field > `Day `Week ] period
            val second : second -> [< Period.date_field > `Day `Week ] period
            val from_date :
              ([< Period.date_field ] as 'a) Date.Period.period -> 'a period
            val from_time :
              ([< Period.date_field ] as 'a) Time.Period.period -> 'a period
            val to_date :
              ([< Date.field ] as 'a) period -> 'Date.Period.period
            exception Not_computable
            val to_time :
              ([< Period.date_field ] as 'a) period -> 'Time.Period.period
            val safe_to_time :
              ([< `Day | `Week ] as 'a) period -> 'Time.Period.period
            val ymds :
              [< Period.date_field ] period -> int * int * int * second
          end
        val add : t -> [< Period.date_field ] Period.period -> t
        val sub : t -> t -> [< Period.date_field > `Day `Week ] Period.period
        val precise_sub : t -> t -> Period.t
        val rem : t -> [< Period.date_field ] Period.period -> t
        val next : t -> field -> t
        val prev : t -> field -> t
      end
  module Make_Precise :
    functor (D : Date_sig.S) (T : Time_sig.S->
      sig
        module Date :
          sig
            type field = Period.date_field
            type -'a date = 'D.date constraint 'a = [< field ]
            type t = field date
            type day = D.day = Sun | Mon | Tue | Wed | Thu | Fri | Sat
            type month =
              D.month =
                Jan
              | Feb
              | Mar
              | Apr
              | May
              | Jun
              | Jul
              | Aug
              | Sep
              | Oct
              | Nov
              | Dec
            type year = int
            exception Out_of_bounds
            exception Undefined
            val make : year -> int -> int -> t
            val lmake : year:year -> ?month:int -> ?day:int -> unit -> t
            val make_year : int -> [< `Year ] date
            val make_year_month : int -> int -> [< `Month | `Year ] date
            val today : unit -> t
            val from_jd : int -> t
            val from_mjd : int -> t
            val from_day_of_year : year -> int -> t
            val days_in_month : [< field > `Month `Year ] date -> int
            val day_of_week : t -> day
            val day_of_month : t -> int
            val day_of_year : t -> int
            val week : t -> int
            val month : [< field > `Month ] date -> month
            val year : [< field > `Year ] date -> year
            val to_jd : t -> int
            val to_mjd : t -> int
            val equal : [< field ] date -> [< field ] date -> bool
            val compare : [< field ] date -> [< field ] date -> int
            val hash : [< field ] date -> int
            val is_valid_date : year -> int -> int -> bool
            val is_leap_day : t -> bool
            val is_gregorian : t -> bool
            val is_julian : t -> bool
            val to_unixtm : t -> Unix.tm
            val from_unixtm : Unix.tm -> t
            val to_unixfloat : t -> float
            val from_unixfloat : float -> t
            val to_business : t -> year * int * day
            val from_business : year -> int -> day -> t
            val int_of_day : day -> int
            val day_of_int : int -> day
            val int_of_month : month -> int
            val month_of_int : int -> month
            module Period :
              sig
                type +'a p = 'D.Period.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 -> t
                val lmake : ?year:int -> ?month:int -> ?day:int -> unit -> t
                val year : int -> [< field > `Year ] period
                val month : int -> [< field > `Month `Year ] period
                val week : int -> [< field > `Day `Week ] period
                val day : int -> [< 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
            val add : ([< field ] as 'a) date -> 'Period.period -> 'a date
            val sub :
              ([< field ] as 'a) date ->
              'a date -> [< field > `Day `Week ] Period.period
            val precise_sub : ([< field ] as 'a) date -> 'a date -> Period.t
            val rem : ([< field ] as 'a) date -> 'Period.period -> 'a date
            val next : ([< field ] as 'a) date -> '-> 'a date
            val prev : ([< field ] as 'a) date -> '-> 'a date
            val is_leap_year : year -> bool
            val same_calendar : year -> year -> bool
            val days_in_year : ?month:month -> year -> int
            val weeks_in_year : year -> int
            val week_first_last : int -> year -> t * t
            val nth_weekday_of_month : year -> month -> day -> int -> t
            val century : year -> int
            val millenium : year -> int
            val solar_number : year -> int
            val indiction : year -> int
            val golden_number : year -> int
            val epact : year -> int
            val easter : year -> t
            val carnaval : year -> t
            val mardi_gras : year -> t
            val ash : year -> t
            val palm : year -> t
            val easter_friday : year -> t
            val easter_saturday : year -> t
            val easter_monday : year -> t
            val ascension : year -> t
            val withsunday : year -> t
            val withmonday : year -> t
            val corpus_christi : year -> t
          end
        module Time :
          sig
            type t = T.t
            type field = [ `Hour | `Minute | `Second ]
            type second = T.second
            module Second :
              sig
                type t = second
                val from_int : int -> t
                val from_float : float -> t
                val to_int : t -> int
                val to_float : t -> float
              end
            val make : int -> int -> second -> t
            val lmake :
              ?hour:int -> ?minute:int -> ?second:second -> unit -> t
            val now : unit -> t
            val midnight : unit -> t
            val midday : unit -> t
            val convert : t -> Time_Zone.t -> Time_Zone.t -> t
            val from_gmt : t -> t
            val to_gmt : t -> t
            val normalize : t -> t * int
            val hour : t -> int
            val minute : t -> int
            val second : t -> second
            val to_seconds : t -> second
            val to_minutes : t -> float
            val to_hours : t -> float
            val equal : t -> t -> bool
            val compare : t -> t -> int
            val hash : t -> int
            val is_pm : t -> bool
            val is_am : t -> bool
            val from_seconds : second -> t
            val from_minutes : float -> t
            val from_hours : float -> t
            module Period :
              sig
                type +'a period = 'T.Period.period
                  constraint 'a = [< Period.date_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 length : [< Period.date_field ] period -> second
                val mul :
                  ([< Period.date_field ] as 'a) period ->
                  'a period -> 'a period
                val div :
                  ([< Period.date_field ] as 'a) period ->
                  'a period -> 'a period
                val make :
                  int -> int -> second -> [< Period.date_field ] period
                val lmake :
                  ?hour:int ->
                  ?minute:int ->
                  ?second:second -> unit -> [< Period.date_field ] period
                val hour : int -> [< Period.date_field ] period
                val minute : int -> [< Period.date_field ] period
                val second : second -> [< Period.date_field ] period
                val to_seconds : [< Period.date_field ] period -> second
                val to_minutes : [< Period.date_field ] period -> float
                val to_hours : [< Period.date_field ] period -> float
              end
            val add : t -> [< Period.date_field ] Period.period -> t
            val sub : t -> t -> [< Period.date_field ] Period.period
            val rem : t -> [< Period.date_field ] Period.period -> t
            val next : t -> field -> t
            val prev : t -> field -> t
          end
        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 -> second -> t
        val lmake :
          year:int ->
          ?month:int ->
          ?day:int -> ?hour:int -> ?minute:int -> ?second:second -> unit -> t
        val create : Date.t -> Time.t -> t
        val now : unit -> t
        val from_jd : float -> t
        val from_mjd : float -> t
        val convert : t -> Time_Zone.t -> Time_Zone.t -> t
        val to_gmt : t -> t
        val from_gmt : t -> t
        val days_in_month : t -> int
        val day_of_week : t -> day
        val day_of_month : t -> int
        val day_of_year : t -> int
        val week : t -> int
        val month : t -> month
        val year : t -> int
        val to_jd : t -> float
        val to_mjd : t -> float
        val hour : t -> int
        val minute : t -> int
        val second : t -> second
        val equal : t -> t -> bool
        val compare : t -> t -> int
        val hash : t -> int
        val is_leap_day : t -> bool
        val is_gregorian : t -> bool
        val is_julian : t -> bool
        val is_pm : t -> bool
        val is_am : t -> bool
        val to_unixtm : t -> Unix.tm
        val from_unixtm : Unix.tm -> t
        val to_unixfloat : t -> float
        val from_unixfloat : float -> t
        val from_date : Date.t -> t
        val to_date : t -> Date.t
        val to_time : t -> Time.t
        module Period :
          sig
            type +'a period constraint 'a = [< Period.date_field ]
            type t = Period.date_field period
            val empty : [< Period.date_field ] period
            val add :
              ([< Period.date_field > `Day `Week ] as 'a) period ->
              'a period -> 'a period
            val sub :
              ([< Period.date_field > `Day `Week ] as 'a) period ->
              'a period -> 'a period
            val opp :
              ([< Period.date_field > `Day `Week ] 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 -> int -> int -> second -> t
            val lmake :
              ?year:int ->
              ?month:int ->
              ?day:int ->
              ?hour:int -> ?minute:int -> ?second:second -> unit -> t
            val year : int -> [< Period.date_field > `Year ] period
            val month : int -> [< Period.date_field > `Month `Year ] period
            val week : int -> [< Period.date_field > `Day `Week ] period
            val day : int -> [< Period.date_field > `Day `Week ] period
            val hour : int -> [< Period.date_field > `Day `Week ] period
            val minute : int -> [< Period.date_field > `Day `Week ] period
            val second : second -> [< Period.date_field > `Day `Week ] period
            val from_date :
              ([< Period.date_field ] as 'a) Date.Period.period -> 'a period
            val from_time :
              ([< Period.date_field ] as 'a) Time.Period.period -> 'a period
            val to_date :
              ([< Date.field ] as 'a) period -> 'Date.Period.period
            exception Not_computable
            val to_time :
              ([< Period.date_field ] as 'a) period -> 'Time.Period.period
            val safe_to_time :
              ([< `Day | `Week ] as 'a) period -> 'Time.Period.period
            val ymds :
              [< Period.date_field ] period -> int * int * int * second
          end
        val add : t -> [< Period.date_field ] Period.period -> t
        val sub : t -> t -> [< Period.date_field > `Day `Week ] Period.period
        val precise_sub : t -> t -> Period.t
        val rem : t -> [< Period.date_field ] Period.period -> t
        val next : t -> field -> t
        val prev : t -> field -> t
      end
end