1- {-# LANGUAGE DeriveFunctor, ExistentialQuantification , FlexibleContexts, FlexibleInstances, GeneralizedNewtypeDeriving, KindSignatures, MultiParamTypeClasses, OverloadedStrings, RankNTypes, StandaloneDeriving, TypeApplications, TypeOperators, UndecidableInstances #-}
1+ {-# LANGUAGE DeriveAnyClass, DeriveFunctor, DeriveGeneric, DerivingStrategies , FlexibleContexts, FlexibleInstances, GeneralizedNewtypeDeriving, KindSignatures, MultiParamTypeClasses, OverloadedStrings, RankNTypes, StandaloneDeriving, TypeApplications, TypeOperators, UndecidableInstances #-}
22
33module Control.Effect.Readline
44( Readline (.. )
@@ -11,46 +11,40 @@ module Control.Effect.Readline
1111, ReadlineC (.. )
1212, runReadline
1313, runReadlineWithHistory
14- , TransC (.. )
1514, ControlIOC (.. )
1615, runControlIO
1716) where
1817
1918import Prelude hiding (print )
2019
2120import Control.Effect.Carrier
21+ import Control.Effect.Lift
2222import Control.Effect.Reader
23- import Control.Effect.Sum
24- import Control.Monad
2523import Control.Monad.IO.Class
2624import Control.Monad.Trans.Class
27- import Data.Coerce
2825import Data.Int
2926import Data.String
3027import Data.Text.Prettyprint.Doc
3128import Data.Text.Prettyprint.Doc.Render.Text
29+ import GHC.Generics (Generic1 )
3230import System.Console.Haskeline hiding (Handler , handle )
3331import System.Directory
3432import System.FilePath
3533
3634data Readline (m :: * -> * ) k
37- = Prompt String (Maybe String -> k )
38- | forall a . Print (Doc a ) k
39- | AskLine (Line -> k )
35+ = Prompt String (Maybe String -> m k )
36+ | Print AnyDoc (m k )
37+ | AskLine (Line -> m k )
38+ deriving stock (Functor , Generic1 )
39+ deriving anyclass (Effect , HFunctor )
4040
41- deriving instance Functor (Readline m )
42-
43- instance HFunctor Readline where
44- hmap _ = coerce
45-
46- instance Effect Readline where
47- handle state handler = coerce . fmap (handler . (<$ state))
41+ newtype AnyDoc = AnyDoc { unAnyDoc :: forall a . Doc a }
4842
4943prompt :: (IsString str , Member Readline sig , Carrier sig m ) => String -> m (Maybe str )
5044prompt p = fmap fromString <$> send (Prompt p pure )
5145
5246print :: (Pretty a , Carrier sig m , Member Readline sig ) => a -> m ()
53- print s = send (Print (pretty s) (pure () ))
47+ print s = send (Print (AnyDoc ( pretty s) ) (pure () ))
5448
5549println :: (Pretty a , Carrier sig m , Member Readline sig ) => a -> m ()
5650println s = print s >> print @ String " \n "
@@ -63,19 +57,19 @@ newtype Line = Line Int64
6357increment :: Line -> Line
6458increment (Line n) = Line (n + 1 )
6559
66- newtype ReadlineC m a = ReadlineC { runReadlineC :: ReaderC Line (TransC InputT m ) a }
67- deriving (Applicative , Functor , Monad , MonadIO )
60+ newtype ReadlineC m a = ReadlineC { runReadlineC :: ReaderC Line (LiftC ( InputT m ) ) a }
61+ deriving newtype (Applicative , Functor , Monad , MonadIO )
6862
6963runReadline :: MonadException m => Prefs -> Settings m -> ReadlineC m a -> m a
70- runReadline prefs settings = runInputTWithPrefs prefs settings . runTransC . runReader (Line 0 ) . runReadlineC
64+ runReadline prefs settings = runInputTWithPrefs prefs settings . runM . runReader (Line 0 ) . runReadlineC
7165
72- instance (Carrier sig m , Effect sig , MonadException m , MonadIO m ) => Carrier (Readline :+: sig ) (ReadlineC m ) where
66+ instance (MonadException m , MonadIO m ) => Carrier (Readline :+: Lift ( InputT m ) ) (ReadlineC m ) where
7367 eff (L (Prompt prompt k)) = ReadlineC $ do
74- str <- lift (TransC (getInputLine (cyan <> prompt <> plain)))
68+ str <- lift (lift (getInputLine (cyan <> prompt <> plain)))
7569 local increment (runReadlineC (k str))
7670 where cyan = " \ESC [1;36m\STX "
7771 plain = " \ESC [0m\STX "
78- eff (L (Print text k)) = liftIO (putDoc text) *> k
72+ eff (L (Print text k)) = liftIO (putDoc (unAnyDoc text) ) *> k
7973 eff (L (AskLine k)) = ReadlineC ask >>= k
8074 eff (R other) = ReadlineC (eff (R (handleCoercible other)))
8175
@@ -93,19 +87,12 @@ runReadlineWithHistory block = do
9387
9488 runReadline prefs settings block
9589
96- -- | Promote a monad transformer into an effect.
97- newtype TransC t (m :: * -> * ) a = TransC { runTransC :: t m a }
98- deriving (Applicative , Functor , Monad , MonadIO , MonadTrans )
99-
100- instance (Carrier sig m , Effect sig , Monad (t m ), MonadTrans t ) => Carrier sig (TransC t m ) where
101- eff = TransC . join . lift . eff . handle (pure () ) (pure . (runTransC =<< ))
102-
10390runControlIO :: (forall x . m x -> IO x ) -> ControlIOC m a -> m a
10491runControlIO handler = runReader (Handler handler) . runControlIOC
10592
10693-- | This exists to work around the 'MonadException' constraint that haskeline entails.
10794newtype ControlIOC m a = ControlIOC { runControlIOC :: ReaderC (Handler m ) m a }
108- deriving (Applicative , Functor , Monad , MonadIO )
95+ deriving newtype (Applicative , Functor , Monad , MonadIO )
10996
11097newtype Handler m = Handler (forall x . m x -> IO x )
11198
0 commit comments