123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869(*
* Copyright (c) 2013-2022 Thomas Gazagnaire <thomas@gazagnaire.org>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*)openImportopenStore_propertiesmoduletypeS=sig(** A {i content-addressable} store is an indexed read-write store in which
values are keyed directly by their hashes. *)includeRead_only.S(** @inline *)valadd:[>write]t->value->keyLwt.t(** Write the contents of a value to the store. It's the responsibility of the
content-addressable store to generate a consistent key. *)valunsafe_add:[>write]t->key->value->unitLwt.t(** Same as {!add} but allows specifying the key directly. The backend might
choose to discard that key and/or can be corrupt if the key scheme is not
consistent. *)includeCloseablewithtype'at:='at(** @inline *)includeBatchwithtype'at:='at(** @inline *)endmoduletypeMaker=functor(Hash:Hash.S)(Value:Type.S)->sigincludeSwithtypevalue=Value.tandtypekey=Hash.tincludeOf_configwithtype'at:='at(** @inline *)endmoduletypeSigs=sigmoduletypeS=SmoduletypeMaker=MakermoduleMake(Append_only_maker:Append_only.Maker)(Hash:Hash.S)(Value:Type.S):sigincludeSwithtype'at='aAppend_only_maker(Hash)(Value).tandtypevalue=Value.tandtypekey=Hash.tincludeOf_configwithtype'at:='at(** @inline *)endmoduleCheck_closed(M:Maker):Makerend