# 9.76 Stream¶

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. For the display purposes of this book, we have chosen a smaller value.

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
```

Void

```
f x == [x.1 + x.2, x.1]
```

Void

```
fibs := [i.2 for i in [generate(f,[1,1])]]
```

```
Compiling function f with type List Integer -> List Integer
```

[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 scanscanStreamFunctions2 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}

The packages StreamFunctions1, StreamFunctions2 and StreamFunctions3 export some useful stream manipulation operations. For more information, see ugLangItsPage in Section ugLangItsNumber , ugProblemSeriesPage in Section ugProblemSeriesNumber , ContinuedFractionXmpPage , and ListXmpPage .