# Stream Library

The definitions provided by this library operate on streams and/or produce new streams. This library also contains a number of streams representing special sequences.

## Functions

### downfrom

(x: Numeric) → [Numeric]

Produces a stream of numbers starting with the given number down through zero.

#### Examples

``````downfrom(5) = [ 5, 4, 3, 2, 1, 0]
downfrom(0) = [ 0 ]
downfrom(-1) = [ ]
downfrom(3.2) = [ 4, 3, 2, 1, 0 ]
``````

#### Implementation

``````y-combinator(
(self, n) :> (
(ceil(n) != n) : self(self, ceil(n))
(n > 0) : [ n, self(self, n - 1) ]
(n = 0) : [ 0 ]
(     ) : [ ]
)
)
``````

### insert-after

(stream: [Any], value: Any) → [Any]

Returns a new stream with the given value inserted after the head of the given stream.

#### Implementation

``````(stream, value) :> [ stream', value, stream... ]
``````

### last

(s: [Any]) → Any

Returns the last value in a finite stream. This function will walk an infinite stream until it encounters some other limit such as running out of processing time.

#### Examples

``````last( mean( 1..10 ) ) = 55
last( max( [ 1, 3, 5, 3, 1 ] ) ) = 5
``````

#### Implementation

``````y-combinator(
(self, stream) :> (
(?(stream...)) : self(self, stream...)
(            ) : stream'
)
)
``````

### set-first

(stream: [Any], stream-head: Any) → [Any]

Returns a new stream with the provided stream head replacing the head of the given stream.

#### Implementation

``````(stream, stream-head) :> stream-head ::> stream...
``````

### set-rest

(stream: [Any], stream-tail: [Any]) → [Any]

Returns a new stream with the head of the first stream followed by the second stream.

#### Implementation

``````(stream, stream-tail) :> stream' ::> stream-tail
``````

### until

(f: Function, stream: [Any]) → [Any]

Returns a new stream with elements from the provided stream until either the end of the stream of until an element in the stream causes the function f to return a true value.

#### Implementation

``````y-combinator(
(self, f, stream) :> (
(?stream and ~f(stream')) : [ stream', self(self, f, stream...) ]
(                       ) : ( )
)
)
``````