Remark: we considered using the following alternative design
structure Stream (α : Type u) where
stream : Type u
next? : stream → Option (α × stream)
class ToStream (collection : Type u) (value : outParam (Type v)) where
toStream : collection → Stream value
where Stream
is not a class, and its state is encapsulated.
The key problem is that the type Stream α
"lives" in a universe higher than α
.
This is a problem because we want to use Stream
s in monadic code.
Streams are used to implement parallel for
statements.
Example:
for x in xs, y in ys do
...
is expanded into
let mut s := toStream ys
for x in xs do
match Stream.next? s with
| none => break
| some (y, s') =>
s := s'
...
- toStream : collection → stream
Instances
def
Stream.forIn
{ρ : Type u_1}
{α : Type u_2}
{m : Type u_3 → Type u_4}
{β : Type u_3}
[Stream ρ α]
[Monad m]
(s : ρ)
(b : β)
(f : α → β → m (ForInStep β))
:
m β
Equations
- Stream.forIn s b f = Stream.forIn.visit f s b
Instances For
Equations
- instToStreamStringSubstring = { toStream := fun (s : String) => s.toSubstring }
Equations
- instToStreamRange = { toStream := fun (r : Std.Range) => r }