adamc@993: functor Make(M : sig
adamc@993:                  con key :: {Type}
adamc@993:                  con data :: {Type}
adamc@993:                  constraint key ~ data
adamc@995:                  constraint [When, Version] ~ (key ++ data)
adamc@993: 
adamc@993:                  val key : $(map sql_injectable key)
adamc@993:                  val data : $(map (fn t => {Inj : sql_injectable_prim t,
adamc@993:                                             Eq : eq t}) data)
adamc@993: 
adamc@993:                  val keyFolder : folder key
adamc@993:                  val dataFolder : folder data
adamc@993:              end) : sig
adamc@993:     val insert : $(M.key ++ M.data) -> transaction unit
adamc@993:     val update : $(M.key ++ M.data) -> transaction unit
adamc@993: 
adamc@993:     val keys : transaction (list $M.key)
adamc@993:     val current : $M.key -> transaction (option $M.data)
adamc@995: 
adamc@995:     type version
adamc@995:     val keysAt : version -> transaction (list $M.key)
adamc@995:     val archive : version -> $M.key -> transaction (option $M.data)
adamc@995:     val updateTimes : transaction (list (version * time))
adamc@993: end