This PR adds a bunch of Stream functions (and a handful of Either functions that are used in the Stream function implementations). Design constraints include:
I had a hard time deciding whether functions that ignore the return value of a streaming computation (e.g., Stream.toList
) should be parameterized by the return type of that computation (i.e., should Stream.toList : '{g, Stream a} () ->{g} [a]
or : '{g, Stream a} r ->{g} [a]
?). On the one hand, using ()
makes it explicit that the function does not distinguish among return values of the stream, but on the other hand it's less flexible for users who are forced to pass void s
rather than just s
for a non-unit-valued stream s
. Ultimately, I decided to favor flexibility.
The changes summarized below are available for you to review, using the following command:
pull-request.load https://github.com/unisonweb/base:.trunk https://github.com/anovstrup/unisonweb-base:.prs._stream
Stream.toList#fl0g3klg92 : '{e, Stream a} () ->{e} [a]
โ
โ Stream.toList#fl0g3klg92 : '{e, Stream a} () ->{e} [a]
โ Stream.toList#hd25q36900 : '{g, Stream a} r ->{g} [a]
+ anovstrup.mit_2020 : License
+ unisoncomputing2020 : License
+ pchiusano : Author
+ authors.anovstrup : Author
patch patch (added 1 updates)
Either.fold : โ o ๐ i1 i.
(i1 ->{๐} o) -> (i ->{๐} o) -> Either i1 i ->{๐} o (+2 metadata)
Either.left : Either l r -> Optional l (+2 metadata)
Either.right : Either l r -> Optional r (+2 metadata)
Either.unwrap : Either a a -> a (+2 metadata)
โ Stream.++ : (v1 ->{g, Stream a} v2)
-> (v2 ->{g, Stream a} v3)
-> v1
->{g, Stream a} v3 (+2 metadata)
โ Stream.append : (v1 ->{g, Stream a} v2)
-> (v2 ->{g, Stream a} v3)
-> v1
->{g, Stream a} v3 (+2 metadata)
โ Stream.+: : a -> '{Stream a} r -> '{Stream a} r (+2 metadata)
โ Stream.cons : a -> '{Stream a} r -> '{Stream a} r (+2 metadata)
Stream.Int.all : '{Stream Int} a (+2 metadata)
Stream.Int.from : Int ->{Stream Int} a (+2 metadata)
Stream.Int.negatives : '{Stream Int} a (+2 metadata)
Stream.Int.positives : '{Stream Int} a (+2 metadata)
Stream.Int.range : Int ->{Stream Int} Int ->{Stream Int} () (+2 metadata)
Stream.Nat.all : '{Stream Nat} a (+2 metadata)
โ Stream.Nat.from : Nat ->{Stream Nat} a (+2 metadata)
โ Stream.from : Nat ->{Stream Nat} a (+2 metadata)
โ Stream.Nat.to : Nat ->{Stream Nat} () (+3 metadata)
โ Stream.to : Nat ->{Stream Nat} () (+3 metadata)
Stream.drop : Nat -> '{g, Stream a} r ->{g, Stream a} r (+2 metadata)
Stream.drop.test : [Result] (+3 metadata)
Stream.emitAndReturn : a ->{Stream a} a (+2 metadata)
Stream.filter : (a ->{g} Boolean)
-> '{g, Stream a} r
->{g, Stream a} r (+2 metadata)
Stream.filter.test : [Result] (+3 metadata)
Stream.flatMap : (a -> '{e, Stream a} r)
-> '{e, Stream a} r
->{e, Stream a} r (+2 metadata)
Stream.fold : (b ->{g} a ->{g} b)
-> b
-> '{g, Stream a} r
->{g} b (+2 metadata)
Stream.fold.test : [Result] (+3 metadata)
Stream.foldWithResult : (b ->{g} a ->{g} b)
-> b
-> '{g, Stream a} r
->{g} (b, r) (+2 metadata)
Stream.foldWithResult.handler : (b ->{g} a ->{g} b)
-> b
-> Request (Stream a) r
->{g} (b, r) (+2 metadata)
Stream.foldWithResult.test : [Result] (+3 metadata)
Stream.fromList : [a] ->{Stream a} () (+2 metadata)
Stream.interleave : '{Stream a} r -> '{Stream a} r ->{Stream a} r (+2 metadata)
Stream.interleave.handler : '{e} r
-> Request (Stream a) r
->{e, Stream a} r (+2 metadata)
Stream.map : (a ->{g} b)
-> '{g, Stream a} r
->{g, Stream b} r (+2 metadata)
Stream.map.test : [Result] (+3 metadata)
Stream.pipe : '{g, Stream a} r1
-> '{g, Stream b, Ask a} r2
->{g, Stream b} Either r1 r2 (+2 metadata)
Stream.pipe' : '{g, Stream a} r
-> '{g, Stream b, Ask a} r
->{g, Stream b} r (+2 metadata)
Stream.pipe.handler : '{g, Stream a} r1
-> Request {Ask a, Stream b} r2
->{g, Stream b} Either r1 r2 (+2 metadata)
Stream.scan : (b ->{g} a ->{g} b)
-> b
-> '{g, Stream a} r
->{g, Stream b} r (+2 metadata)
Stream.take : Nat
-> '{g, Stream a} r
->{g, Stream a} Optional r (+2 metadata)
Stream.take.testCompletion : [Result] (+3 metadata)
Stream.take.testEarlyTermination : [Result] (+4 metadata)
Stream.terminated : '{g, Stream a} r ->{g, Stream (Optional a)} r (+2 metadata)
Stream.terminated.test : [Result] (+3 metadata)
Stream.toList.test.bidirectional : [Result] (+3 metadata)
Stream.toListWithResult : '{g, Stream a} r ->{g} ([a], r) (+2 metadata)
Stream.zip : '{Stream a} r1
-> '{Stream b} r2
->{Stream (a, b)} Either r1 r2 (+2 metadata)
Original Changes
Stream.range Stream.Nat.range (added)