diff --git a/META b/META index 48d38db..e2f9a7d 100644 --- a/META +++ b/META @@ -1,6 +1,6 @@ # OASIS_START -# DO NOT EDIT (digest: 8fe7646cd958ccfd4ec565a95fe6b68c) -version = "0.3.7" +# DO NOT EDIT (digest: 1e28d93f3671e8db9acf63b73cdbca82) +version = "0.4.1" description = "Simple sequence (iterator) datatype and combinators" archive(byte) = "sequence.cma" archive(byte, plugin) = "sequence.cma" diff --git a/_oasis b/_oasis index b4b696a..9163e3b 100644 --- a/_oasis +++ b/_oasis @@ -1,6 +1,6 @@ OASISFormat: 0.4 Name: sequence -Version: 0.3.7 +Version: 0.4.1 Homepage: https://github.com/c-cube/sequence Authors: Simon Cruanes License: BSD-2-clause @@ -19,10 +19,23 @@ Flag bench Description: enable benchmarks (require library Benchmark) Default: false +Flag invert + Description: build sequence.invert (requires Delimcc) + Default: false + Library "sequence" Path: . Modules: Sequence +Library "invert" + Path: invert + Build$: flag(invert) + Install$: flag(invert) + Modules: SequenceInvert + FindlibName: invert + FindlibParent: sequence + BuildDepends: sequence,delimcc + Document sequence Title: Sequence docs Type: ocamlbuild (0.3) diff --git a/_tags b/_tags index f46475b..5715982 100644 --- a/_tags +++ b/_tags @@ -1,5 +1,5 @@ # OASIS_START -# DO NOT EDIT (digest: 34c62fcaf6a79f081a2b2c5cf44cbe05) +# DO NOT EDIT (digest: ffd3fbaf00b431777fea1b8279203bf9) # Ignore VCS directories, you can use the same kind of rule outside # OASIS_START/STOP if you want to exclude directories that contains # useless stuff for the build process @@ -15,5 +15,16 @@ "_darcs": not_hygienic # Library sequence "sequence.cmxs": use_sequence +# Executable benchs +"bench/benchs.native": pkg_benchmark +"bench/benchs.native": use_sequence +# Executable bench_persistent +"bench/bench_persistent.native": pkg_benchmark +"bench/bench_persistent.native": use_sequence +# Executable bench_persistent_read +"bench/bench_persistent_read.native": pkg_benchmark +"bench/bench_persistent_read.native": use_sequence +: pkg_benchmark +: use_sequence # OASIS_STOP true: bin_annot diff --git a/invert/.merlin b/invert/.merlin new file mode 100644 index 0000000..3b9a31d --- /dev/null +++ b/invert/.merlin @@ -0,0 +1,2 @@ +REC +PKG delimcc diff --git a/invert/sequenceInvert.ml b/invert/sequenceInvert.ml new file mode 100644 index 0000000..46efc69 --- /dev/null +++ b/invert/sequenceInvert.ml @@ -0,0 +1,62 @@ +(* +Copyright (c) 2014, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Interface to Delimcc (Invert control flow)} *) + +type 'a gen = unit -> 'a option + +type 'a res = + | Start + | Yield of 'a + | Stop + +let _ret_none () = None +let _ret_unit () = () + +let to_gen seq = + let p = Delimcc.new_prompt () in + let _next = ref None in + ignore (Delimcc.push_prompt p + (fun () -> + Delimcc.take_subcont p (fun c () -> _next := Some c; Start); + seq + (fun x -> + Delimcc.take_subcont p (fun c () -> _next := Some c; Yield x) + ); + _next := None; + Stop + )); + (* call next subcont *) + let rec next () = + match !_next with + | None -> None + | Some f -> + begin match Delimcc.push_delim_subcont f _ret_unit with + | Start -> next () + | Yield x -> Some x + | Stop -> None + end + in + next diff --git a/invert/sequenceInvert.mli b/invert/sequenceInvert.mli new file mode 100644 index 0000000..bd3c843 --- /dev/null +++ b/invert/sequenceInvert.mli @@ -0,0 +1,32 @@ +(* +Copyright (c) 2014, Simon Cruanes +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. Redistributions in binary +form must reproduce the above copyright notice, this list of conditions and the +following disclaimer in the documentation and/or other materials provided with +the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*) + +(** {1 Interface to Delimcc (Invert control flow)} *) + +type 'a gen = unit -> 'a option + +val to_gen : 'a Sequence.t -> 'a gen +(** Use delimited continuations to iterate on the sequence step by step. + Relatively costly but still useful *)