sig
  module type Key =
    sig
      type t
      type floatable = t
      val of_float : float -> floatable
      val to_float : floatable -> float
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
    end
  module type S =
    sig
      type key
      type t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      val create : (key * float) list -> [ `Fail of string | `Succeed of t ]
      val get : t -> key -> float
    end
  module Make :
    functor (Key : Key->
      sig
        type key = Key.t
        type t = Piecewise_linear.Make(Key).t
        type sexpable = t
        val sexp_of_t : sexpable -> Sexplib.Sexp.t
        val t_of_sexp : Sexplib.Sexp.t -> sexpable
        val create :
          (key * float) list -> [ `Fail of string | `Succeed of t ]
        val get : t -> key -> float
      end
  module Time :
    sig
      type key = Time.t
      type t = Piecewise_linear.Time.t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      val create : (key * float) list -> [ `Fail of string | `Succeed of t ]
      val get : t -> key -> float
    end
  module Float :
    sig
      type key = float
      type t = Piecewise_linear.Float.t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      val create : (key * float) list -> [ `Fail of string | `Succeed of t ]
      val get : t -> key -> float
    end
  module Int :
    sig
      type key = int
      type t = Piecewise_linear.Int.t
      type sexpable = t
      val sexp_of_t : sexpable -> Sexplib.Sexp.t
      val t_of_sexp : Sexplib.Sexp.t -> sexpable
      val create : (key * float) list -> [ `Fail of string | `Succeed of t ]
      val get : t -> key -> float
    end
end