{-# LANGUAGE ExistentialQuantification, RankNTypes #-}
module Rest.Driver.Types
  ( Run
  , RunnableHandler (..)
  , mapHandler

  , module Rest.Types.Method
  ) where

import Rest.Handler (Handler)
import Rest.Types.Method (Method (..))

type Run m n = forall a. m a -> n a

data RunnableHandler n = forall m. RunnableHandler
  (Run m n)   -- Runner to the base monad.
  (Handler m) -- Actual handler to run.

mapHandler :: Run m n -> RunnableHandler m -> RunnableHandler n
mapHandler run (RunnableHandler run' h) = RunnableHandler (run . run') h