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 `Data.Stream.Future.Skew.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 Zipper a = !Integer :~ (Integer -> a)`