module Data.Stream where
data Stream a = Cons {
shd :: a,
stl :: Stream a
}
instance Functor Stream where
fmap f xs = Cons (f (shd xs)) (fmap f (stl xs))
instance Monad Stream where
return x = let return_x = Cons x return_x in return_x
xs >>= f = Cons (shd (f (shd xs))) (stl xs >>= f)
zipStream :: Stream a -> Stream b -> Stream (a, b)
zipStream xs ys = Cons (shd xs, shd ys) (zipStream (stl xs) (stl ys))
unzipStream :: Stream (a, b) -> (Stream a, Stream b)
unzipStream xys = (fmap fst xys, fmap snd xys)
listToStream :: [a] -> Stream a
listToStream = foldr Cons (error "listToStream")
streamToList :: Stream a -> [a]
streamToList xs = shd xs : streamToList (stl xs)