# streams-3.3: Various Haskell 2010 stream comonads

Various Haskell 2010 stream comonads.
* Data.Stream.Future provides a coinductive anti-causal stream, or non-empty `ZipList`

. The comonad provides access to only the
tail of the stream. Like a conventional `ZipList`

, this is *not* a monad.

data Future a = Last a | a :< Future a

- Data.Stream.Future.Skew provides a non-empty skew-binary random-access-list with the semantics of
`Data.Stream.Future`

. As with Data.Stream.Future this stream is not a`Monad`

, since the`Applicative`

instance zips streams of potentially differing lengths. The random-access-list structure provides a number of operations logarithmic access time, but makes`cons`

less productive. Where applicable Data.Stream.Infinite.Skew may be more efficient, due to a lazier and more efficient`Applicative`

instance.

- Data.Stream.Infinite provides a coinductive infinite anti-causal stream. The
`Comonad`

provides access to the tail of the stream and the`Applicative`

zips streams together. Unlike`Future`

, infinite stream form a`Monad`

. The monad diagonalizes the`Stream`

, which is consistent with the behavior of the`Applicative`

, and the view of a`Stream`

as a isomorphic to the reader monad from the natural numbers. Being infinite in length, there is no`Alternative`

instance.

data Stream a = a :< Stream a

- Data.Stream.Infinite.Skew provides an infinite skew-binary random-access-list with the semantics of Data.Stream.Infinite
Since every stream is infinite, the
`Applicative`

instance can be considerably less strict than the corresponding instance for Data.Stream.Future.Skew and performs asymptotically better.

- Data.Stream.Infinite.Functional.Zipper provides a bi-infinite sequence, represented as a pure function with an accumulating parameter added to optimize moving the current focus.

data Zipper a = !Integer :~ (Integer -> a)

- Data.Stream.Supply provides a comonadic supply of unique values, which are generated impurely as the tree is explored.