never executed always true always false
1 module HelVM.HelMA.Automaton.Eff.MonadEff (
2 AppEff,
3 MonadLoggerEff,
4 MonadEff(..),
5 ) where
6
7 import HelVM.HelIO.Control.Safe
8
9 import HelVM.HelIO.ReadText
10
11 import Control.Monad.Logger
12
13 import qualified Data.ByteString.Lazy as LByteString
14 import qualified Data.Text.Lazy.IO as LText
15
16 import Prelude hiding (getLine, putText)
17 import qualified Prelude
18
19 import qualified RIO
20
21 import qualified System.IO as IO
22
23 type AppEff m = (MonadSafe m , MonadLoggerEff m)
24
25 type MonadLoggerEff m = (MonadLogger m, MonadEff m)
26
27 class Monad m => MonadEff m where
28
29 putAsChar :: Integral v => v -> m ()
30 putAsDec :: Integral v => v -> m ()
31 getCharAs :: Integral v => m v
32 getDecAs :: Integral v => m v
33
34 putIntAsChar :: Int -> m ()
35 putIntAsDec :: Int -> m ()
36 getCharAsInt :: m Int
37 getDecAsInt :: m Int
38
39 getContentsBS :: m LByteString
40 getContentsText :: m LText
41 getChar :: m Char
42 getLine :: m Text
43 putChar :: Char -> m ()
44 putLine :: Text -> m ()
45
46 flush :: m ()
47
48 putAsChar = putIntAsChar . fromIntegral
49 putAsDec = putIntAsDec . fromIntegral
50 getCharAs = fromIntegral <$> getCharAsInt
51 getDecAs = fromIntegral <$> getDecAsInt
52
53 putIntAsChar = putChar . chr
54 putIntAsDec = putLine . show
55 getCharAsInt = ord <$> getChar
56 getDecAsInt = readTextUnsafe <$> getLine
57
58 flush = pass
59
60 instance MonadEff IO where
61 getContentsBS = LByteString.getContents
62 getContentsText = LText.getContents
63 getChar = IO.getChar
64 getLine = Prelude.getLine
65 putChar = IO.putChar
66 putLine = Prelude.putText
67 flush = flushIO
68
69 instance {-# OVERLAPPABLE #-} (MonadTrans t, Monad m, MonadEff m) => MonadEff (t m) where
70 getContentsBS = lift getContentsBS
71 getContentsText = lift getContentsText
72 getChar = lift getChar
73 getLine = lift getLine
74 putChar = lift . putChar
75 putLine = lift . putLine
76 flush = lift flush
77
78 instance RIO.HasLogFunc env => MonadEff (RIO.RIO env) where
79 getContentsBS = liftIO LByteString.getContents
80 getContentsText = liftIO LText.getContents
81 getChar = liftIO IO.getChar
82 getLine = liftIO Prelude.getLine
83 putChar = liftIO . IO.putChar
84 putLine = liftIO . Prelude.putText
85 flush = liftIO flushIO
86
87 ---- Internal
88
89 flushIO :: IO ()
90 flushIO = hFlush stdout