mirror of
https://github.com/c-cube/iter.git
synced 2025-12-06 11:15:32 -05:00
use delimcc in a new module, SequenceInvert, in order
to reverse the control flow (here with conversion to Gen)
This commit is contained in:
parent
5d73e99652
commit
bebc312b85
6 changed files with 124 additions and 4 deletions
4
META
4
META
|
|
@ -1,6 +1,6 @@
|
||||||
# OASIS_START
|
# OASIS_START
|
||||||
# DO NOT EDIT (digest: 8fe7646cd958ccfd4ec565a95fe6b68c)
|
# DO NOT EDIT (digest: 1e28d93f3671e8db9acf63b73cdbca82)
|
||||||
version = "0.3.7"
|
version = "0.4.1"
|
||||||
description = "Simple sequence (iterator) datatype and combinators"
|
description = "Simple sequence (iterator) datatype and combinators"
|
||||||
archive(byte) = "sequence.cma"
|
archive(byte) = "sequence.cma"
|
||||||
archive(byte, plugin) = "sequence.cma"
|
archive(byte, plugin) = "sequence.cma"
|
||||||
|
|
|
||||||
15
_oasis
15
_oasis
|
|
@ -1,6 +1,6 @@
|
||||||
OASISFormat: 0.4
|
OASISFormat: 0.4
|
||||||
Name: sequence
|
Name: sequence
|
||||||
Version: 0.3.7
|
Version: 0.4.1
|
||||||
Homepage: https://github.com/c-cube/sequence
|
Homepage: https://github.com/c-cube/sequence
|
||||||
Authors: Simon Cruanes
|
Authors: Simon Cruanes
|
||||||
License: BSD-2-clause
|
License: BSD-2-clause
|
||||||
|
|
@ -19,10 +19,23 @@ Flag bench
|
||||||
Description: enable benchmarks (require library Benchmark)
|
Description: enable benchmarks (require library Benchmark)
|
||||||
Default: false
|
Default: false
|
||||||
|
|
||||||
|
Flag invert
|
||||||
|
Description: build sequence.invert (requires Delimcc)
|
||||||
|
Default: false
|
||||||
|
|
||||||
Library "sequence"
|
Library "sequence"
|
||||||
Path: .
|
Path: .
|
||||||
Modules: Sequence
|
Modules: Sequence
|
||||||
|
|
||||||
|
Library "invert"
|
||||||
|
Path: invert
|
||||||
|
Build$: flag(invert)
|
||||||
|
Install$: flag(invert)
|
||||||
|
Modules: SequenceInvert
|
||||||
|
FindlibName: invert
|
||||||
|
FindlibParent: sequence
|
||||||
|
BuildDepends: sequence,delimcc
|
||||||
|
|
||||||
Document sequence
|
Document sequence
|
||||||
Title: Sequence docs
|
Title: Sequence docs
|
||||||
Type: ocamlbuild (0.3)
|
Type: ocamlbuild (0.3)
|
||||||
|
|
|
||||||
13
_tags
13
_tags
|
|
@ -1,5 +1,5 @@
|
||||||
# OASIS_START
|
# OASIS_START
|
||||||
# DO NOT EDIT (digest: 34c62fcaf6a79f081a2b2c5cf44cbe05)
|
# DO NOT EDIT (digest: ffd3fbaf00b431777fea1b8279203bf9)
|
||||||
# Ignore VCS directories, you can use the same kind of rule outside
|
# Ignore VCS directories, you can use the same kind of rule outside
|
||||||
# OASIS_START/STOP if you want to exclude directories that contains
|
# OASIS_START/STOP if you want to exclude directories that contains
|
||||||
# useless stuff for the build process
|
# useless stuff for the build process
|
||||||
|
|
@ -15,5 +15,16 @@
|
||||||
"_darcs": not_hygienic
|
"_darcs": not_hygienic
|
||||||
# Library sequence
|
# Library sequence
|
||||||
"sequence.cmxs": use_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
|
||||||
|
<bench/*.ml{,i}>: pkg_benchmark
|
||||||
|
<bench/*.ml{,i}>: use_sequence
|
||||||
# OASIS_STOP
|
# OASIS_STOP
|
||||||
true: bin_annot
|
true: bin_annot
|
||||||
|
|
|
||||||
2
invert/.merlin
Normal file
2
invert/.merlin
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
REC
|
||||||
|
PKG delimcc
|
||||||
62
invert/sequenceInvert.ml
Normal file
62
invert/sequenceInvert.ml
Normal file
|
|
@ -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
|
||||||
32
invert/sequenceInvert.mli
Normal file
32
invert/sequenceInvert.mli
Normal file
|
|
@ -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 *)
|
||||||
Loading…
Add table
Reference in a new issue