{-# LANGUAGE GADTs #-}
module Control.Effect.Readline
( -- * Readline effect
  Readline(..)
, getInputLine
, getInputLineWithInitial
, getInputChar
, getPassword
, waitForAnyKey
, outputStr
, outputStrLn
, withInterrupt
, handleInterrupt
  -- * Re-exports
, Algebra
, Has
, run
) where

import Control.Algebra

getInputLine :: Has Readline sig m => String -> m (Maybe String)
getInputLine :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m (Maybe String)
getInputLine String
p = Readline m (Maybe String) -> m (Maybe String)
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (String -> Readline m (Maybe String)
forall (m :: * -> *). String -> Readline m (Maybe String)
GetInputLine String
p)

getInputLineWithInitial :: Has Readline sig m => String -> (String, String) -> m (Maybe String)
getInputLineWithInitial :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> (String, String) -> m (Maybe String)
getInputLineWithInitial String
p (String, String)
lr = Readline m (Maybe String) -> m (Maybe String)
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (String -> (String, String) -> Readline m (Maybe String)
forall (m :: * -> *).
String -> (String, String) -> Readline m (Maybe String)
GetInputLineWithInitial String
p (String, String)
lr)

getInputChar :: Has Readline sig m => String -> m (Maybe Char)
getInputChar :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m (Maybe Char)
getInputChar String
p = Readline m (Maybe Char) -> m (Maybe Char)
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (String -> Readline m (Maybe Char)
forall (m :: * -> *). String -> Readline m (Maybe Char)
GetInputChar String
p)

getPassword :: Has Readline sig m => Maybe Char -> String -> m (Maybe String)
getPassword :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
Maybe Char -> String -> m (Maybe String)
getPassword Maybe Char
c String
s = Readline m (Maybe String) -> m (Maybe String)
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (Maybe Char -> String -> Readline m (Maybe String)
forall (m :: * -> *).
Maybe Char -> String -> Readline m (Maybe String)
GetPassword Maybe Char
c String
s)

waitForAnyKey :: Has Readline sig m => String -> m Bool
waitForAnyKey :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m Bool
waitForAnyKey String
p = Readline m Bool -> m Bool
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (String -> Readline m Bool
forall (m :: * -> *). String -> Readline m Bool
WaitForAnyKey String
p)

outputStr :: Has Readline sig m => String -> m ()
outputStr :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m ()
outputStr String
s = Readline m () -> m ()
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (String -> Readline m ()
forall (m :: * -> *). String -> Readline m ()
OutputStr String
s)

outputStrLn :: Has Readline sig m => String -> m ()
outputStrLn :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m ()
outputStrLn String
s = String -> m ()
forall (sig :: (* -> *) -> * -> *) (m :: * -> *).
Has Readline sig m =>
String -> m ()
outputStr (String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\n")

withInterrupt :: Has Readline sig m => m a -> m a
withInterrupt :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has Readline sig m =>
m a -> m a
withInterrupt m a
m = Readline m a -> m a
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (m a -> Readline m a
forall (m :: * -> *) a. m a -> Readline m a
WithInterrupt m a
m)

handleInterrupt :: Has Readline sig m => m a -> m a -> m a
handleInterrupt :: forall (sig :: (* -> *) -> * -> *) (m :: * -> *) a.
Has Readline sig m =>
m a -> m a -> m a
handleInterrupt m a
h m a
m = Readline m a -> m a
forall (eff :: (* -> *) -> * -> *) (sig :: (* -> *) -> * -> *)
       (m :: * -> *) a.
(Member eff sig, Algebra sig m) =>
eff m a -> m a
send (m a -> m a -> Readline m a
forall (m :: * -> *) a. m a -> m a -> Readline m a
HandleInterrupt m a
h m a
m)

data Readline m k where
  GetInputLine :: String -> Readline m (Maybe String)
  GetInputLineWithInitial :: String -> (String, String) -> Readline m (Maybe String)
  GetInputChar :: String -> Readline m (Maybe Char)
  GetPassword :: Maybe Char -> String -> Readline m (Maybe String)
  WaitForAnyKey :: String -> Readline m Bool
  OutputStr :: String -> Readline m ()
  WithInterrupt :: m a -> Readline m a
  HandleInterrupt :: m a -> m a -> Readline m a