123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384(*****************************************************************************)(* *)(* Open Source License *)(* Copyright (c) 2021 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. *)(* *)(*****************************************************************************)type'at='aoptionletunknown=Noneletknownx=Somexletof_option=Fun.idletis_unknown=Option.is_noneletjoin(typea)~whereeq(l1:at)(l2:at)=match(l1,l2)with|None,None->Result.return_none|Somex,None|None,Somex->Result.return_somex|Somex,Somey->ifeqxythenResult.return_somexelseerror_with"Limit.join: error (%s)"wherelet%expect_test"join"=letpp_print_errfmt=function|Result.Error_->Format.pp_print_stringfmt"error"|Okx->Format.(pp_print_option~none:(funfmt()->pp_print_stringfmt"None")pp_print_bool)fmtxinletprintx=Format.fprintfFormat.std_formatter"%a"pp_print_errxinprint(join~where:__LOC__Bool.equal(Sometrue)(Sometrue));[%expect{| true |}];print(join~where:__LOC__Bool.equalNoneNone);[%expect{| None |}];print(join~where:__LOC__Bool.equalNone(Sometrue));[%expect{| true |}];print(join~where:__LOC__Bool.equal(Sometrue)None);[%expect{| true |}];print(join~where:__LOC__Bool.equal(Sometrue)(Somefalse));[%expect{| error |}]letget~when_unknown=function|None->error_with"Limit.get: %s"when_unknown|Somex->Okxlet%expect_test"get"=letpp_print_errfmt=function|Result.Error_->Format.fprintffmt"error"|Okb->Format.pp_print_boolfmtbinletprintx=Format.fprintfFormat.std_formatter"%a"pp_print_errxinprint(get~when_unknown:""(Sometrue));[%expect{| true |}];print(get~when_unknown:""None);[%expect{| error |}]letfold~unknown~knownx=matchxwithNone->unknown|Somex->knownxletvalue~when_unknown=functionNone->when_unknown|Somex->x