123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140(******************************************************************************)(* *)(* Sek *)(* *)(* Arthur Charguéraud, Émilie Guermeur and François Pottier *)(* *)(* Copyright Inria. All rights reserved. This file is distributed 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, as described in the file LICENSE. *)(* *)(******************************************************************************)openPublicSignature(* This functor allows providing a [default] element up front, once and for
all, thereby removing the need from passing it as an argument to [create],
[of_array], etc. *)(* Although this code is reasonably short, the signature of this functor is
quite long, as it is a variant of the signature [SEK]. For this reason,
we do not provide an [.mli] file. *)(* The repetition between the ephemeral variant and the persistent variant
could be eliminated by introducing a helper functor. However, tolerating
this repetition leads to more readable code. *)module[@inline]SupplyDefault(S:SEK)(D:sigtypeelementvaldefault:elementend)=struct(* In OCaml < 4.08, we cannot include [S] here.
We list its toplevel components. *)typeside=S.sideletfront=S.frontletback=S.backletother=S.othertypedirection=S.directionletforward=S.forwardletbackward=S.backwardletopposite=S.oppositeletsign=S.signexceptionEmpty=S.EmptyexceptionEnd=S.Endletsnapshot=S.snapshotletsnapshot_and_clear=S.snapshot_and_clearletedit=S.editletreleased=S.releasedmoduleEphemeral=structincludeS.EphemeralopenD(* In OCaml < 4.08, we cannot redefine the type [t]. *)(* type t = element E.t *)let[@inline]create()=createdefaultlet[@inline]makenv=makedefaultnvlet[@inline]initnf=initdefaultnflet[@inline]of_list_segmentnxs=of_list_segmentdefaultnxslet[@inline]of_listxs=of_listdefaultxslet[@inline]of_array_segmentaik=of_array_segmentdefaultaiklet[@inline]of_arraya=of_arraydefaultalet[@inline]of_seq_segmentnxs=of_seq_segmentdefaultnxslet[@inline]of_seqxs=of_seqdefaultxsend(* E *)modulePersistent=structincludeS.PersistentopenD(* In OCaml < 4.08, we cannot redefine the type [t]. *)(* type t = element P.t *)let[@inline]create()=createdefaultletempty=create()let[@inline]makenv=makedefaultnvlet[@inline]initnf=initdefaultnflet[@inline]of_list_segmentnxs=of_list_segmentdefaultnxslet[@inline]of_listxs=of_listdefaultxslet[@inline]of_array_segmentaik=of_array_segmentdefaultaiklet[@inline]of_arraya=of_arraydefaultalet[@inline]of_seq_segmentnxs=of_seq_segmentdefaultnxslet[@inline]of_seqxs=of_seqdefaultxslet[@inline]mapfs=mapdefaultfslet[@inline]mapifs=mapidefaultfslet[@inline]filter_mapfs=filter_mapdefaultfslet[@inline]flatten_mapfs=flatten_mapdefaultfslet[@inline]map2fs1s2=map2defaultfs1s2end(* P *)moduleE=EphemeralmoduleP=PersistentmoduleEmulated=structmoduleArray=structincludeS.Emulated.ArrayopenDlet[@inline]makenx=makedefaultnxlet[@inline]initnf=initdefaultnflet[@inline]make_matrixmnx=make_matrixdefaultmnxlet[@inline]concatss=concatdefaultsslet[@inline]of_listxs=of_listdefaultxslet[@inline]mapfs=mapdefaultfslet[@inline]mapifs=mapidefaultfslet[@inline]map2fs1s2=map2defaultfs1s2let[@inline]of_seqs=of_seqdefaultsendmoduleList=structincludeS.Emulated.ListopenDletempty=P.empty(* We cannot name it [[]]. *)let[@inline]initnf=initdefaultnflet[@inline]mapfs=mapdefaultfslet[@inline]mapifs=mapidefaultfslet[@inline]rev_mapfs=rev_mapdefaultfslet[@inline]filter_mapfs=filter_mapdefaultfslet[@inline]concat_mapfs=concat_mapdefaultfslet[@inline]map2fs1s2=map2defaultfs1s2let[@inline]rev_map2fs1s2=rev_map2defaultfs1s2let[@inline]fold_left_mapfaccus=fold_left_mapdefaultfaccuslet[@inline]of_seqs=of_seqdefaultsend(* List *)moduleQueue=structincludeS.Emulated.QueueopenDlet[@inline]create()=createdefaultlet[@inline]of_seqxs=of_seqdefaultxsend(* Queue *)moduleStack=structincludeS.Emulated.StackopenDlet[@inline]create()=createdefaultlet[@inline]of_seqxs=of_seqdefaultxsend(* Stack *)end(* Emulated *)end(* SupplyDefault *)