module Tonatona ( run , liftIOCont , HasParser(..) , HasConfig(..) ) where import RIO import TonaParser (Parser, withConfig) {-| Main function. -} run :: HasParser env => RIO env () -> IO () run action = do withConfig parser $ \env -> runRIO env action {-| Lift Continuation-passing style IO function into RIO. -} liftIOCont :: ((a -> IO b) -> IO c) -> (a -> RIO env b) -> RIO env c liftIOCont f action = RIO $ ReaderT $ \env -> f (\a -> runReaderT (unRIO (action a)) env) class HasParser a where parser :: Parser a class HasConfig env config where config :: env -> config