123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.com> *)(* Copyright (c) 2020 Metastate AG <hello@metastate.dev> *)(* Copyright (c) 2021-2022 Nomadic Labs <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)openScript_typed_irletmakex=Set_tagxletget(Set_tagx)=xletempty:typea.acomparable_ty->aset=funty->letmoduleOPS:Boxed_set_OPSwithtypeelt=a=structletelt_size=Gas_comparable_input_size.size_of_comparable_valuetyincludeSet.Make(structtypet=aletcompare=Script_comparable.compare_comparabletyend)endinSet_tag(modulestructtypeelt=amoduleOPS=OPSletboxed=OPS.emptyletsize=0end)letupdate:typea.a->bool->aset->aset=funvb(Set_tag(moduleBox))->Set_tag(modulestructtypeelt=amoduleOPS=Box.OPSletboxed=ifbthenBox.OPS.addvBox.boxedelseBox.OPS.removevBox.boxedletsize=letmem=Box.OPS.memvBox.boxedinifmemthenifbthenBox.sizeelseBox.size-1elseifbthenBox.size+1elseBox.sizeend)letmem:typeelt.elt->eltset->bool=funv(Set_tag(moduleBox))->Box.OPS.memvBox.boxedletfold:typeeltacc.(elt->acc->acc)->eltset->acc->acc=funf(Set_tag(moduleBox))->Box.OPS.foldfBox.boxedletsize:typeelt.eltset->Script_int.nScript_int.num=fun(Set_tag(moduleBox))->Script_int.(abs(of_intBox.size))