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.
- toStream : collection → stream
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'
...
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 = let x := { default := pure b }; Stream.forIn.visit f s b
Instances For
Equations
- instToStreamArraySubarray = { toStream := fun a => Array.toSubarray a 0 (Array.size a) }
Equations
- instToStreamStringSubstring = { toStream := fun s => String.toSubstring s }
Equations
- instToStreamRange = { toStream := fun r => r }
Equations
- One or more equations did not get rendered due to their size.
Equations
- instStreamRangeNat = { next? := fun r => if r.start < r.stop then some (r.start, { start := r.start + r.step, stop := r.stop, step := r.step }) else none }
Equations
- One or more equations did not get rendered due to their size.