module System.Console.Haskeline.Backend.ANSI
( runANSIDraw,
)
where
import Control.Monad.Catch (MonadCatch, MonadMask, MonadThrow)
import qualified Control.Monad.Trans.Writer as Writer
import Data.String (IsString (..))
import System.Console.Haskeline.Backend.ANSILike
import System.Console.Haskeline.Backend.Posix (Handles, PosixT, ehOut, posixLayouts, posixRunTerm)
import System.Console.Haskeline.Monads
import System.Console.Haskeline.Term (CommandMonad, EvalTerm (..), Layout, RunTerm, Term (..))
import System.IO (hFlush, hPutStr)
newtype StringBuilder
= StringBuilder (String -> String)
instance IsString StringBuilder where
fromString :: String -> StringBuilder
fromString =
String -> StringBuilder
build
instance Monoid StringBuilder where
mempty :: StringBuilder
mempty =
(String -> String) -> StringBuilder
StringBuilder String -> String
forall a. a -> a
id
instance Semigroup StringBuilder where
StringBuilder String -> String
x <> :: StringBuilder -> StringBuilder -> StringBuilder
<> StringBuilder String -> String
y =
(String -> String) -> StringBuilder
StringBuilder (String -> String
x (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
y)
build :: String -> StringBuilder
build :: String -> StringBuilder
build String
s =
(String -> String) -> StringBuilder
StringBuilder (String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++)
runBuilder :: StringBuilder -> String
runBuilder :: StringBuilder -> String
runBuilder (StringBuilder String -> String
s) =
String -> String
s String
""
actions :: Actions StringBuilder
actions :: Actions StringBuilder
actions =
Actions
{ bellAudible :: StringBuilder
bellAudible = String -> StringBuilder
build String
"\a",
bellVisual :: StringBuilder
bellVisual = StringBuilder
forall a. Monoid a => a
mempty,
clearAllA :: Int -> StringBuilder
clearAllA = \Int
_ -> String -> StringBuilder
build String
"\ESC[2J\ESC[H",
clearToLineEnd :: StringBuilder
clearToLineEnd = String -> StringBuilder
build String
"\ESC[K",
cr :: StringBuilder
cr = String -> StringBuilder
build String
"\r",
leftA :: Int -> StringBuilder
leftA = \Int
n -> if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 then StringBuilder
forall a. Monoid a => a
mempty else String -> StringBuilder
build String
"\ESC[" StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build (Int -> String
forall a. Show a => a -> String
show Int
n) StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build String
"D",
nl :: StringBuilder
nl = String -> StringBuilder
build String
"\r\n",
rightA :: Int -> StringBuilder
rightA = \Int
n -> if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 then StringBuilder
forall a. Monoid a => a
mempty else String -> StringBuilder
build String
"\ESC[" StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build (Int -> String
forall a. Show a => a -> String
show Int
n) StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build String
"C",
upA :: Int -> StringBuilder
upA = \Int
n -> if Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
0 then StringBuilder
forall a. Monoid a => a
mempty else String -> StringBuilder
build String
"\ESC[" StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build (Int -> String
forall a. Show a => a -> String
show Int
n) StringBuilder -> StringBuilder -> StringBuilder
forall a. Semigroup a => a -> a -> a
<> String -> StringBuilder
build String
"A",
wrapLine :: StringBuilder
wrapLine = StringBuilder
forall a. Monoid a => a
mempty,
textA :: String -> StringBuilder
textA = String -> StringBuilder
build
}
newtype Draw m a
= Draw {forall (m :: * -> *) a. Draw m a -> ANSILike StringBuilder m a
unDraw :: ANSILike StringBuilder m a}
deriving
( Functor (Draw m)
Functor (Draw m) =>
(forall a. a -> Draw m a)
-> (forall a b. Draw m (a -> b) -> Draw m a -> Draw m b)
-> (forall a b c.
(a -> b -> c) -> Draw m a -> Draw m b -> Draw m c)
-> (forall a b. Draw m a -> Draw m b -> Draw m b)
-> (forall a b. Draw m a -> Draw m b -> Draw m a)
-> Applicative (Draw m)
forall a. a -> Draw m a
forall a b. Draw m a -> Draw m b -> Draw m a
forall a b. Draw m a -> Draw m b -> Draw m b
forall a b. Draw m (a -> b) -> Draw m a -> Draw m b
forall a b c. (a -> b -> c) -> Draw m a -> Draw m b -> Draw m c
forall (m :: * -> *). Monad m => Functor (Draw m)
forall (m :: * -> *) a. Monad m => a -> Draw m a
forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m a
forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m b
forall (m :: * -> *) a b.
Monad m =>
Draw m (a -> b) -> Draw m a -> Draw m b
forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> Draw m a -> Draw m b -> Draw m c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall (m :: * -> *) a. Monad m => a -> Draw m a
pure :: forall a. a -> Draw m a
$c<*> :: forall (m :: * -> *) a b.
Monad m =>
Draw m (a -> b) -> Draw m a -> Draw m b
<*> :: forall a b. Draw m (a -> b) -> Draw m a -> Draw m b
$cliftA2 :: forall (m :: * -> *) a b c.
Monad m =>
(a -> b -> c) -> Draw m a -> Draw m b -> Draw m c
liftA2 :: forall a b c. (a -> b -> c) -> Draw m a -> Draw m b -> Draw m c
$c*> :: forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m b
*> :: forall a b. Draw m a -> Draw m b -> Draw m b
$c<* :: forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m a
<* :: forall a b. Draw m a -> Draw m b -> Draw m a
Applicative,
(forall a b. (a -> b) -> Draw m a -> Draw m b)
-> (forall a b. a -> Draw m b -> Draw m a) -> Functor (Draw m)
forall a b. a -> Draw m b -> Draw m a
forall a b. (a -> b) -> Draw m a -> Draw m b
forall (m :: * -> *) a b. Functor m => a -> Draw m b -> Draw m a
forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Draw m a -> Draw m b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall (m :: * -> *) a b.
Functor m =>
(a -> b) -> Draw m a -> Draw m b
fmap :: forall a b. (a -> b) -> Draw m a -> Draw m b
$c<$ :: forall (m :: * -> *) a b. Functor m => a -> Draw m b -> Draw m a
<$ :: forall a b. a -> Draw m b -> Draw m a
Functor,
Applicative (Draw m)
Applicative (Draw m) =>
(forall a b. Draw m a -> (a -> Draw m b) -> Draw m b)
-> (forall a b. Draw m a -> Draw m b -> Draw m b)
-> (forall a. a -> Draw m a)
-> Monad (Draw m)
forall a. a -> Draw m a
forall a b. Draw m a -> Draw m b -> Draw m b
forall a b. Draw m a -> (a -> Draw m b) -> Draw m b
forall (m :: * -> *). Monad m => Applicative (Draw m)
forall (m :: * -> *) a. Monad m => a -> Draw m a
forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m b
forall (m :: * -> *) a b.
Monad m =>
Draw m a -> (a -> Draw m b) -> Draw m b
forall (m :: * -> *).
Applicative m =>
(forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall (m :: * -> *) a b.
Monad m =>
Draw m a -> (a -> Draw m b) -> Draw m b
>>= :: forall a b. Draw m a -> (a -> Draw m b) -> Draw m b
$c>> :: forall (m :: * -> *) a b.
Monad m =>
Draw m a -> Draw m b -> Draw m b
>> :: forall a b. Draw m a -> Draw m b -> Draw m b
$creturn :: forall (m :: * -> *) a. Monad m => a -> Draw m a
return :: forall a. a -> Draw m a
Monad,
MonadThrow (Draw m)
MonadThrow (Draw m) =>
(forall e a.
(HasCallStack, Exception e) =>
Draw m a -> (e -> Draw m a) -> Draw m a)
-> MonadCatch (Draw m)
forall e a.
(HasCallStack, Exception e) =>
Draw m a -> (e -> Draw m a) -> Draw m a
forall (m :: * -> *). MonadCatch m => MonadThrow (Draw m)
forall (m :: * -> *) e a.
(MonadCatch m, HasCallStack, Exception e) =>
Draw m a -> (e -> Draw m a) -> Draw m a
forall (m :: * -> *).
MonadThrow m =>
(forall e a.
(HasCallStack, Exception e) =>
m a -> (e -> m a) -> m a)
-> MonadCatch m
$ccatch :: forall (m :: * -> *) e a.
(MonadCatch m, HasCallStack, Exception e) =>
Draw m a -> (e -> Draw m a) -> Draw m a
catch :: forall e a.
(HasCallStack, Exception e) =>
Draw m a -> (e -> Draw m a) -> Draw m a
MonadCatch,
Monad (Draw m)
Monad (Draw m) => (forall a. IO a -> Draw m a) -> MonadIO (Draw m)
forall a. IO a -> Draw m a
forall (m :: * -> *).
Monad m =>
(forall a. IO a -> m a) -> MonadIO m
forall (m :: * -> *). MonadIO m => Monad (Draw m)
forall (m :: * -> *) a. MonadIO m => IO a -> Draw m a
$cliftIO :: forall (m :: * -> *) a. MonadIO m => IO a -> Draw m a
liftIO :: forall a. IO a -> Draw m a
MonadIO,
MonadReader (Actions StringBuilder),
MonadReader Handles,
MonadCatch (Draw m)
MonadCatch (Draw m) =>
(forall b.
HasCallStack =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b)
-> (forall b.
HasCallStack =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b)
-> (forall a b c.
HasCallStack =>
Draw m a
-> (a -> ExitCase b -> Draw m c)
-> (a -> Draw m b)
-> Draw m (b, c))
-> MonadMask (Draw m)
forall b.
HasCallStack =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
forall a b c.
HasCallStack =>
Draw m a
-> (a -> ExitCase b -> Draw m c)
-> (a -> Draw m b)
-> Draw m (b, c)
forall (m :: * -> *). MonadMask m => MonadCatch (Draw m)
forall (m :: * -> *) b.
(MonadMask m, HasCallStack) =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
forall (m :: * -> *) a b c.
(MonadMask m, HasCallStack) =>
Draw m a
-> (a -> ExitCase b -> Draw m c)
-> (a -> Draw m b)
-> Draw m (b, c)
forall (m :: * -> *).
MonadCatch m =>
(forall b. HasCallStack => ((forall a. m a -> m a) -> m b) -> m b)
-> (forall b.
HasCallStack =>
((forall a. m a -> m a) -> m b) -> m b)
-> (forall a b c.
HasCallStack =>
m a -> (a -> ExitCase b -> m c) -> (a -> m b) -> m (b, c))
-> MonadMask m
$cmask :: forall (m :: * -> *) b.
(MonadMask m, HasCallStack) =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
mask :: forall b.
HasCallStack =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
$cuninterruptibleMask :: forall (m :: * -> *) b.
(MonadMask m, HasCallStack) =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
uninterruptibleMask :: forall b.
HasCallStack =>
((forall a. Draw m a -> Draw m a) -> Draw m b) -> Draw m b
$cgeneralBracket :: forall (m :: * -> *) a b c.
(MonadMask m, HasCallStack) =>
Draw m a
-> (a -> ExitCase b -> Draw m c)
-> (a -> Draw m b)
-> Draw m (b, c)
generalBracket :: forall a b c.
HasCallStack =>
Draw m a
-> (a -> ExitCase b -> Draw m c)
-> (a -> Draw m b)
-> Draw m (b, c)
MonadMask,
Monad (Draw m)
Monad (Draw m) =>
(forall e a. (HasCallStack, Exception e) => e -> Draw m a)
-> MonadThrow (Draw m)
forall e a. (HasCallStack, Exception e) => e -> Draw m a
forall (m :: * -> *).
Monad m =>
(forall e a. (HasCallStack, Exception e) => e -> m a)
-> MonadThrow m
forall (m :: * -> *). MonadThrow m => Monad (Draw m)
forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> Draw m a
$cthrowM :: forall (m :: * -> *) e a.
(MonadThrow m, HasCallStack, Exception e) =>
e -> Draw m a
throwM :: forall e a. (HasCallStack, Exception e) => e -> Draw m a
MonadThrow,
(forall (m :: * -> *). Monad m => Monad (Draw m)) =>
(forall (m :: * -> *) a. Monad m => m a -> Draw m a)
-> MonadTrans Draw
forall (m :: * -> *). Monad m => Monad (Draw m)
forall (m :: * -> *) a. Monad m => m a -> Draw m a
forall (t :: (* -> *) -> * -> *).
(forall (m :: * -> *). Monad m => Monad (t m)) =>
(forall (m :: * -> *) a. Monad m => m a -> t m a) -> MonadTrans t
$clift :: forall (m :: * -> *) a. Monad m => m a -> Draw m a
lift :: forall (m :: * -> *) a. Monad m => m a -> Draw m a
MonadTrans
)
evalDraw :: forall m. (MonadReader Layout m, CommandMonad m) => EvalTerm (PosixT m)
evalDraw :: forall (m :: * -> *).
(MonadReader Layout m, CommandMonad m) =>
EvalTerm (PosixT m)
evalDraw = (forall a. Draw m a -> PosixT m a)
-> (forall a. PosixT m a -> Draw m a) -> EvalTerm (PosixT m)
forall (m :: * -> *) (n :: * -> *).
(Term n, CommandMonad n) =>
(forall a. n a -> m a) -> (forall a. m a -> n a) -> EvalTerm m
EvalTerm Draw m a -> PosixT m a
forall a. Draw m a -> PosixT m a
eval PosixT m a -> Draw m a
forall a. PosixT m a -> Draw m a
liftE
where
liftE :: PosixT m a -> Draw m a
liftE = ANSILike StringBuilder m a -> Draw m a
forall (m :: * -> *) a. ANSILike StringBuilder m a -> Draw m a
Draw (ANSILike StringBuilder m a -> Draw m a)
-> (PosixT m a -> ANSILike StringBuilder m a)
-> PosixT m a
-> Draw m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PosixT m a -> ANSILike StringBuilder m a
forall (m :: * -> *) a c. Monad m => PosixT m a -> ANSILike c m a
liftPosixT
eval :: Draw m a -> PosixT m a
eval = Actions StringBuilder -> ANSILike StringBuilder m a -> PosixT m a
forall (m :: * -> *) c a.
Monad m =>
Actions c -> ANSILike c m a -> PosixT m a
runANSILike Actions StringBuilder
actions (ANSILike StringBuilder m a -> PosixT m a)
-> (Draw m a -> ANSILike StringBuilder m a)
-> Draw m a
-> PosixT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Draw m a -> ANSILike StringBuilder m a
forall (m :: * -> *) a. Draw m a -> ANSILike StringBuilder m a
unDraw
runANSIDraw :: Handles -> MaybeT IO RunTerm
runANSIDraw :: Handles -> MaybeT IO RunTerm
runANSIDraw Handles
handles =
IO RunTerm -> MaybeT IO RunTerm
forall a. IO a -> MaybeT IO a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO RunTerm -> MaybeT IO RunTerm)
-> IO RunTerm -> MaybeT IO RunTerm
forall a b. (a -> b) -> a -> b
$
Handles
-> [IO (Maybe Layout)]
-> [(String, Key)]
-> (forall (m :: * -> *) b. (MonadIO m, MonadMask m) => m b -> m b)
-> (forall (m :: * -> *).
(MonadMask m, CommandMonad m) =>
EvalTerm (PosixT m))
-> IO RunTerm
posixRunTerm
Handles
handles
(Handles -> [IO (Maybe Layout)]
posixLayouts Handles
handles)
[]
m b -> m b
forall a. a -> a
forall (m :: * -> *) b. (MonadIO m, MonadMask m) => m b -> m b
id
EvalTerm (PosixT m)
forall (m :: * -> *).
(MonadMask m, CommandMonad m) =>
EvalTerm (PosixT m)
forall (m :: * -> *).
(MonadReader Layout m, CommandMonad m) =>
EvalTerm (PosixT m)
evalDraw
runActionT :: (MonadIO m) => Writer.WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a -> Draw m a
runActionT :: forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
m = do
(x, action) <- ANSILike StringBuilder m (a, TermAction StringBuilder)
-> Draw m (a, TermAction StringBuilder)
forall (m :: * -> *) a. ANSILike StringBuilder m a -> Draw m a
Draw (WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> ANSILike StringBuilder m (a, TermAction StringBuilder)
forall w (m :: * -> *) a. WriterT w m a -> m (a, w)
Writer.runWriterT WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
m)
toutput <- asks action
ttyh <- asks ehOut
liftIO $ do
hPutStr ttyh (runBuilder toutput)
hFlush ttyh
return x
instance (MonadIO m, MonadMask m, MonadReader Layout m) => Term (Draw m) where
drawLineDiff :: LineChars -> LineChars -> Draw m ()
drawLineDiff LineChars
xs LineChars
ys = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT (WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ())
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall a b. (a -> b) -> a -> b
$ LineChars
-> LineChars
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall c (m :: * -> *).
(Monoid c, MonadReader Layout m) =>
LineChars -> LineChars -> WriterT (TermAction c) (ANSILike c m) ()
drawLineDiffT LineChars
xs LineChars
ys
reposition :: Layout -> LineChars -> Draw m ()
reposition Layout
layout LineChars
lc = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT (WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ())
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall a b. (a -> b) -> a -> b
$ Layout
-> LineChars
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall c (m :: * -> *).
(Monoid c, MonadReader Layout m) =>
Layout -> LineChars -> WriterT (TermAction c) (ANSILike c m) ()
repositionT Layout
layout LineChars
lc
printLines :: [String] -> Draw m ()
printLines [String]
xs = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT (WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ())
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall a b. (a -> b) -> a -> b
$ [String]
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall c (m :: * -> *).
(Monoid c, Monad m) =>
[String] -> WriterT (TermAction c) (ANSILike c m) ()
printLinesT [String]
xs
clearLayout :: Draw m ()
clearLayout = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall c (m :: * -> *).
(Monoid c, MonadReader Layout m) =>
WriterT (TermAction c) (ANSILike c m) ()
clearLayoutT
moveToNextLine :: LineChars -> Draw m ()
moveToNextLine LineChars
_ = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall c (m :: * -> *).
(Monoid c, Monad m) =>
WriterT (TermAction c) (ANSILike c m) ()
moveToNextLineT
ringBell :: Bool -> Draw m ()
ringBell Bool
x = WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall (m :: * -> *) a.
MonadIO m =>
WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) a
-> Draw m a
runActionT (WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ())
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
-> Draw m ()
forall a b. (a -> b) -> a -> b
$ Bool
-> WriterT (TermAction StringBuilder) (ANSILike StringBuilder m) ()
forall (m :: * -> *) c.
Monad m =>
Bool -> WriterT (TermAction c) (ANSILike c m) ()
ringBellT Bool
x