123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354(* Copyright (C) 2025--2026 Petter A. Urkedal <paurkedal@gmail.com>
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version, with the LGPL-3.0 Linking Exception.
*
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* and the LGPL-3.0 Linking Exception along with this library. If not, see
* <http://www.gnu.org/licenses/> and <https://spdx.org>, respectively.
*)moduleMake(Fiber:System_sig.FIBER)=structincludeFiber.Infixlet(let*)=(>>=)let(let+)=(>|=)let(>>=?)mf=m>>=functionOkx->fx|Error_asr->Fiber.returnrlet(>|=?)mf=m>|=functionOkx->Ok(fx)|Error_asr->rlet(let*?)=(>>=?)let(let+?)=(>|=?)letassert_single_use~whatin_usef=if!in_usethenfailwith("Invalid concurrent usage of "^what^" detected.");in_use:=true;Fiber.cleanup(fun()->f()>|=funres->in_use:=false;res)(fun()->in_use:=false;Fiber.return())letreciter_s_listf=function|[]->Fiber.return()|x::xs->fx>>=fun()->iter_s_listfxsletreciter_rs_listf=function|[]->Fiber.return(Ok())|x::xs->fx>>=?fun()->iter_rs_listfxsletmap_rs_listf=letrecloopacc=function|[]->Fiber.return(Ok(List.revacc))|x::xs->let*?y=fxinloop(y::acc)xsinloop[]end