{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE TypeFamilies #-} module Data.Stream ( Stream (..), ) where import Data.Data (Proxy (..)) import Data.Kind (Type) class Ord (Pos s) => Stream s where type Item s :: Type type Chunk s :: Type type Pos s :: Type next :: s -> Maybe (Item s, s) nextWhile :: (Item s -> Bool) -> s -> (Chunk s, s) nextN :: Int -> s -> (Chunk s, s) makeChunk :: Proxy s -> [Item s] -> Chunk s unmakeChunk :: Proxy s -> Chunk s -> [Item s] getPos :: s -> Pos s