123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384(*
* 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.
*)open!ImportincludeContent_addressable_intfmoduleMake(AO:Append_only.Maker)(K:Hash.S)(V:Type.S)=structincludeAO(K)(V)openLwt.InfixmoduleH=Hash.Typed(K)(V)lethash=H.hashletpp_key=Type.ppK.tletequal_hash=Type.(unstage(equalK.t))letfindtk=findtk>>=function|None->Lwt.return_none|Somevasr->letk'=hashvinifequal_hashkk'thenLwt.returnrelseFmt.kstrLwt.fail_invalid_arg"corrupted value: got %a, expecting %a"pp_keyk'pp_keykletunsafe_addtkv=addtkvletaddtv=letk=hashvinaddtkv>|=fun()->kendmoduleCheck_closed(CA:Maker)(K:Hash.S)(V:Type.S)=structmoduleS=CA(K)(V)type'at={closed:boolref;t:'aS.t}typekey=S.keytypevalue=S.valueletcheck_not_closedt=if!(t.closed)thenraiseStore_properties.Closedletmemtk=check_not_closedt;S.memt.tkletfindtk=check_not_closedt;S.findt.tkletaddtv=check_not_closedt;S.addt.tvletunsafe_addtkv=check_not_closedt;S.unsafe_addt.tkvletbatchtf=check_not_closedt;S.batcht.t(funw->f{t=w;closed=t.closed})letvconf=let+t=S.vconfin{closed=reffalse;t}letcloset=if!(t.closed)thenLwt.return_unitelse(t.closed:=true;S.closet.t)end