Giter Site home page Giter Site logo

c-cube / iter Goto Github PK

View Code? Open in Web Editor NEW
117.0 11.0 11.0 1.41 MB

Simple iterator abstract datatype, intended to iterate efficiently on collections while performing some transformations.

Home Page: https://c-cube.github.io/iter

License: BSD 2-Clause "Simplified" License

Makefile 0.98% OCaml 99.02%
ocaml iterators lazy sequence monad iter higher-order-functions stream

iter's Issues

Can't run tests with OUnit2 and qcheck-0.13

OUnit2 now is repalcement for OUnit.
[builder@localhost ocaml-iter-1.2.1]$ make test
Done: 53/58 (jobs: 1)File "qtest/run_qtest.ml", line 3, characters 5-11:
3 | open OUnit2;;
^^^^^^
Error: Unbound module OUnit2
Hint: Did you mean Unit?
ocamlc qtest/.run_qtest.eobjs/byte/run_qtest.{cmi,cmo,cmt} (exit 2)
(cd _build/default && /usr/bin/ocamlc.opt -w @1[email protected]@30..39@[email protected]@[email protected] -strict-sequence -strict-formats -short-paths -keep-locs -warn-error -a+8 -safe-string -w -33 -g -bin-annot -I qtest/.run_qtest.eobjs/byte -I /usr/lib64/ocaml/bytes -I /usr/lib64/ocaml/qcheck-core -I /usr/lib64/ocaml/result -I src/.iter.objs/byte -I src/.iter.objs/native -no-alias-deps -opaque -o qtest/.run_qtest.eobjs/byte/run_qtest.cmo -c -impl qtest/run_qtest.ml)
make: *** [Makefile:8: test] Error 1

after correcting the qtest/dune, the error looks like this:
ocaml-iter-1.2.1]$ make test
Done: 53/58 (jobs: 1)File "../src/Iter.ml", line 32, characters 5-7:
Error: This pattern matches values of type unit
but a pattern was expected which matches values of type test_ctxt
ocamlc qtest/.run_qtest.eobjs/byte/run_qtest.{cmi,cmo,cmt} (exit 2)
(cd _build/default && /usr/bin/ocamlc.opt -w @1[email protected]@30..39@[email protected]@[email protected] -strict-sequence -strict-formats -short-paths -keep-locs -warn-error -a+8 -safe-string -w -33 -g -bin-annot -I qtest/.run_qtest.eobjs/byte -I /usr/lib64/ocaml/bytes -I /usr/lib64/ocaml/ounit2 -I /usr/lib64/ocaml/ounit2/advanced -I /usr/lib64/ocaml/qcheck-core -I /usr/lib64/ocaml/result -I src/.iter.objs/byte -I src/.iter.objs/native -no-alias-deps -opaque -o qtest/.run_qtest.eobjs/byte/run_qtest.cmo -c -impl qtest/run_qtest.ml)
make: *** [Makefile:8: test] Error 1

opam config needs qtest dependency?

Not a big deal, but, I tried to install sequence via opam -- I did not have qtest installed -- and it fails:

#=== ERROR while installing sequence.0.10 =====================================#

opam-version 1.2.2

os linux

command make build

path /usr/app/lib/opam/4.03.0/build/sequence.0.10

compiler 4.03.0

exit-code 2

env-file /usr/app/lib/opam/4.03.0/build/sequence.0.10/sequence-28014-c61e7b.env

stdout-file /usr/app/lib/opam/4.03.0/build/sequence.0.10/sequence-28014-c61e7b.out

stderr-file /usr/app/lib/opam/4.03.0/build/sequence.0.10/sequence-28014-c61e7b.err

stdout

ocaml setup.ml -build

make[1]: Entering directory '/usr/app/lib/opam/4.03.0/build/sequence.0.10'

make[1]: Leaving directory '/usr/app/lib/opam/4.03.0/build/sequence.0.10'

stderr

make[1]: *** [Makefile:55: qtest-gen] Error 2

E: Failure("Command 'make qtest-gen' terminated with error code 2")

make: *** [Makefile:7: build] Error 1`

After installing qtest, sequence installs with no problem.

Thanks for all the great code btw.

zipping two sequences?

I feel like I must be missing something obvious. I could not find a function 'a t -> 'b t -> ('a * 'b) t which zips the sequences, stopping when the first one runs out, or something which does the same thing but combines the sequences with a function 'a->'b->'c instead. I found only more complicated combinations. ??

split into several modules

  • use module alias to reduce binary bloat
  • use (wrapped true) in dune
  • move all heavy components (relational combinators, IO, mlist) into separate modules
  • keep only the lightweight and common combinators in Iter (probably via an include)

Is it the normal behavior for group_by?

Hi

I add unexpected results with group_by but I'm not sure 'm right to find them unexpected. Anyway, I expected to get for s2 all pairs with the same first item in the same list, i.e. the same result as s3 when using group_by... Am I doing something wrong here (perhaps because of strings and hashing?)?

utop # module S = Sequence;;
module S = Sequence
utop # open Containers;;
utop # let s = 
List.product (fun x y -> (x, y)) [ "a"; "b"; "c" ] [ "d"; "e"; "f" ]
|> S.of_list;;
val s : (string * string) S.t = <fun>
utop # let print s = Format.printf "%a" 
(Format.within "[" "]" @@ S.pp_seq 
@@ Format.within "(" ")" @@ Pair.pp String.print String.print) s;;
val print : (string * string) S.t -> unit = <fun>
utop # print s;;
[("a", "d"), ("a", "e"), ("a", "f"), ("b", "d"), ("b", "e"), ("b", "f"), ("c", 
"d"), ("c", "e"), ("c", 
"f")]- : unit = ()
utop # let s2 = S.group_by ~hash:(Hash.pair String.hash String.hash)
~eq:(fun (a1, _) (b1, _) -> String.equal a1 b1) s;;
val s2 : (string * string) list S.t = <fun>
utop # let print2 s =
S.iter Format.(printf "%a@\n" (Format.within "[" "]" @@ list @@ within "(" ")" 
@@ hbox @@ Pair.pp String.print String.print)) s;;
val print2 : (string * string) list S.t -> unit = <fun>
utop # print2 s2;;
[("b", "d")]
[("a", "e")]
[("b", "f")]
[("a", "d")]
[("c", "d")]
[("a", "f")]
[("c", "f")]
[("c", "e")]
[("b", "e")]
- : unit = ()
utop # let s3 = S.sort_uniq ~cmp:(Pair.compare String.compare String.compare) s 
|> S.group_succ_by ~eq:(fun (a1, _) (b1, _) -> String.equal a1 b1);;
val s3 : (string * string) list S.t = <fun>
utop # print2 s3;;
[("a", "f"), ("a", "e"), ("a", "d")]
[("b", "f"), ("b", "e"), ("b", "d")]
[("c", "f"), ("c", "e"),
("c", "d")]
- : unit = ()

Compatibility with mdx 2.0.0

It looks like the mdx binary will no longer be part of the installation of mdx (the new binary is called ocaml-mdx).
However it seems there is a simpler method with dune: https://dune.readthedocs.io/en/stable/dune-files.html?highlight=mdx#mdx-since-2-4

#=== ERROR while compiling iter.1.2.1 =========================================#
# context              2.1.0 | linux/x86_64 | ocaml-variants.4.14.0+trunk | file:///home/opam/opam-repository
# path                 ~/.opam/4.14/.opam-switch/build/iter.1.2.1
# command              ~/.opam/opam-init/hooks/sandbox.sh build dune runtest -p iter -j 31
# exit-code            1
# env-file             ~/.opam/log/iter-2311-bf1f39.env
# output-file          ~/.opam/log/iter-2311-bf1f39.out
### output ###
# File "dune", line 6, characters 15-18:
# 6 |           (run mdx test %{deps})
#                    ^^^
# Error: Program mdx not found in the tree or in PATH
#  (context: default)

Missing test dependency

Seems like some dependencies for the build-test opam target are not listed, for instance qcheck. This breaks the build when OPAMBUILDTEST=true.

Sequence.(--^) inconsistent with CCList.(--^)

Sequence.(--^) returns a reversed range, while CCList.(--^) returns a range with the right bound excluded.

See:

CCList.(--^) 0 5;;
(* val _1 : int list = [0; 1; 2; 3; 4] *)
Sequence.(--^) 5 0 |> Sequence.to_list;;
(* val _2 : int list = [5; 4; 3; 2; 1; 0] *)
Sequence.(--^) 0 5 |> Sequence.to_list;;
(* val _3 : int list = [] *)

I would suggest deprecating Sequence.(--^), since the CCList behaviour is more useful and the operator looks half-open range (the hat being on the right. I would expect a reversed range to include an arrow of some sorts).

Iter.IO.write_lines with "empty" iter still writes a newline char to output file

Not sure if this is a bug or intended behavior, but on an "empty" iter, the write_lines function will write a newline to the output file, rather than writing nothing.

But here is a simplified example of what's happening. The snoc/intersperse bit is from the write_bytes_line function which is called by write_lines (here).

# let i = Iter.of_list [] in Iter.snoc (Iter.intersperse "\n" i) "\n" |> Iter.to_list;;
- : string list = ["\n"]

# let i = Iter.of_list ["a"] in Iter.snoc (Iter.intersperse "\n" i) "\n" |> Iter.to_list;;
- : string list = ["a"; "\n"]

# let i = Iter.of_list ["a"; "b"] in Iter.snoc (Iter.intersperse "\n" i) "\n" |> Iter.to_list;;
- : string list = ["a"; "\n"; "b"; "\n"]

My expectation was that for an empty iter, nothing would be written to the file, but instead a newline is written. Is this the intended behavior?

make doc fails

Also triggered by installation through opam when OPAMBUILDDOC=true is set.

File "src/Iter.mli", line 4, characters 1-35:
'1': bad section level (2-4 allowed)
File "src/Iter.mli", line 42, characters 51-62:
'@since' must begin on its own line
File "src/Iter.mli", line 490, characters 17-62:
'@since' must begin on its own line
odoc: internal error, uncaught exception:
      Parser___Helpers.InvalidReference("unknown qualifier `(-'")

File "src/IterLabels.mli", line 5, characters 1-35:
'1': bad section level (2-4 allowed)
File "src/IterLabels.mli", line 18, characters 51-62:
'@since' must begin on its own line
File "src/IterLabels.mli", line 461, characters 17-62:
'@since' must begin on its own line
odoc: internal error, uncaught exception:
      Parser___Helpers.InvalidReference("unknown qualifier `(-'")

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.