module Data.Apart.Structures.Stream (Stream, same) where

import "base" Data.Functor.Identity (Identity (..))
import "free" Control.Comonad.Cofree (Cofree (..))

-- | Infinite sequence.
type Stream = Cofree Identity

same :: a -> Stream a
same x = x :< Identity (same x)

iter :: (a -> a) -> a -> Stream a
iter f x = x :< Identity (iter f $ f x)