module Next.Interface.Class
  (
    {- * Class -} TerminableStream (..),
    {- * Utilities -} next,
  )
  where

import Next.Interface.Type

{-| An interface for which 'Next' is one of possibly many supported requests -}
class TerminableStream item interface | interface -> item where

    {-| Lift a 'Next' request into a larger interface -}
    liftNext :: Next item result -> interface result

instance TerminableStream item (Next item) where
    liftNext :: forall result. Next item result -> Next item result
liftNext Next item result
x = Next item result
x

{-| Like v'Next', but polymorphic -}
next :: TerminableStream item interface => interface (Step item)
next :: forall item (interface :: * -> *).
TerminableStream item interface =>
interface (Step item)
next = forall item (interface :: * -> *) result.
TerminableStream item interface =>
Next item result -> interface result
liftNext forall item result. (result ~ Step item) => Next item result
Next