====================================================================
Stream examples
====================================================================

A Stream object is represented as a list whose last element contains
the wherewithal to create the next element, should it ever be required.

Let ints be the infinite stream of non-negative integers.

  ints := [i for i in 0..]
    [0,1,2,3,4,5,6,7,8,9,...]
                                 Type: Stream NonNegativeInteger

By default, ten stream elements are calculated.  This number may be
changed to something else by the system command 
  )set streams calculate

More generally, you can construct a stream by specifying its initial
value and a function which, when given an element, creates the next element.

  f : List INT -> List INT
                                 Type: Void

  f x == [x.1 + x.2, x.1]
                                 Type: Void

  fibs := [i.2 for i in [generate(f,[1,1])]]
    [1,1,2,3,5,8,13,21,34,55,...]
                                 Type: Stream Integer

You can create the stream of odd non-negative integers by either filtering
them from the integers, or by evaluating an expression for each integer.

  [i for i in ints | odd? i]
    [1,3,5,7,9,11,13,15,17,19,...]
                                 Type: Stream NonNegativeInteger

  odds := [2*i+1 for i in ints]
    [1,3,5,7,9,11,13,15,17,19,...]
                                 Type: Stream NonNegativeInteger

You can accumulate the initial segments of a stream using the scan operation.

  scan(0,+,odds)
    [1,4,9,16,25,36,49,64,81,100,...]
                                 Type: Stream NonNegativeInteger

The corresponding elements of two or more streams can be combined in this way.

  [i*j for i in ints for j in odds]
    [0,3,10,21,36,55,78,105,136,171,...]
                                 Type: Stream NonNegativeInteger

  map(*,ints,odds)
    [0,3,10,21,36,55,78,105,136,171,...]
                                 Type: Stream NonNegativeInteger

Many operations similar to those applicable to lists are available for
streams.

  first ints
    0
                                 Type: NonNegativeInteger

  rest ints
    [1,2,3,4,5,6,7,8,9,10,...]
                                 Type: Stream NonNegativeInteger

  fibs 20
    6765
                                 Type: PositiveInteger

See Also:
o )help StreamFunctions1
o )help StreamFunctions2
o )help StreamFunctions3
o )show Stream

