never executed always true always false
    1 module HelVM.HelMA.Automaton.Eff.MockEff
    2   ( MockEffData (..)
    3   , MonadMockEff
    4   , MonadSafeMockEff
    5   , createMockEffData
    6   , mockGetChar
    7   , mockGetCharSafe
    8   , mockGetContents
    9   , mockGetContentsBS
   10   , mockGetContentsText
   11   , mockGetLine
   12   , mockGetLineSafe
   13   , mockPutChar
   14   , mockPutLine
   15   , reverseOutput
   16   ) where
   17 
   18 import           HelVM.HelMA.Automaton.API.IOTypes
   19 
   20 import           HelVM.HelIO.Control.Safe
   21 
   22 import           HelVM.HelIO.SequencesExtra
   23 
   24 import qualified Data.Sequences                    as S
   25 import qualified Data.Text                         as Text
   26 
   27 mockGetContentsBS ∷ MonadMockEff m ⇒ m LByteString
   28 mockGetContentsBS = fromStrict . encodeUtf8 <$> mockGetContentsText
   29 
   30 mockGetContentsText ∷ MonadMockEff m ⇒ m LText
   31 mockGetContentsText = fromStrict . toText <$> mockGetContents
   32 
   33 mockGetContents ∷ MonadMockEff m ⇒ m String
   34 mockGetContents = mockGetContents' =<< get where
   35   mockGetContents' ∷ MonadMockEff m ⇒ MockEffData → m String
   36   mockGetContents' mockEff = content <$ put mockEff { input = "" } where content = input mockEff
   37 
   38 mockGetChar ∷ MonadMockEff m ⇒ m Char
   39 mockGetChar = mockGetChar' =<< get where
   40   mockGetChar' ∷ MonadMockEff m ⇒ MockEffData → m Char
   41   mockGetChar' mockEff = orErrorTuple ("mockGetChar" , Text.show mockEff) (top (input mockEff)) <$ put mockEff { input = orErrorTuple ("mockGetChar" , Text.show mockEff) $ discard $ input mockEff }
   42 
   43 mockGetLine ∷ MonadMockEff m ⇒ m Text
   44 mockGetLine = mockGetLine' =<< get where
   45   mockGetLine' ∷ MonadMockEff m ⇒ MockEffData → m Text
   46   mockGetLine' mockEff = toText line <$ put mockEff { input = input' } where (line , input') = splitStringByLn $ input mockEff
   47 
   48 mockGetCharSafe ∷ MonadSafeMockEff m ⇒ m Char
   49 mockGetCharSafe = mockGetChar' =<< get where
   50   mockGetChar' ∷ MonadSafeMockEff m ⇒ MockEffData → m Char
   51   mockGetChar' mockEff = appendErrorTuple ("mockGetCharSafe" , Text.show mockEff) $ mockGetChar'' =<< unconsSafe (input mockEff) where
   52     mockGetChar'' (c, input') = put mockEff { input = input' } $> c
   53 
   54 mockGetLineSafe ∷ MonadSafeMockEff m ⇒ m Text
   55 mockGetLineSafe = mockGetLineSafe' =<< get where
   56   mockGetLineSafe' ∷ MonadSafeMockEff m ⇒ MockEffData → m Text
   57   mockGetLineSafe' mockEff = toText line <$ put mockEff { input = input' } where (line , input') = splitStringByLn $ input mockEff
   58 
   59 mockPutChar ∷ MonadMockEff m ⇒ Char → m ()
   60 mockPutChar = modify . mockDataPutChar
   61 
   62 mockPutLine ∷ MonadMockEff m ⇒ Text → m ()
   63 mockPutLine = modify . mockDataPutText
   64 
   65 ----
   66 
   67 createMockEffData ∷ Input → MockEffData
   68 createMockEffData = MockEffData "" . toString
   69 
   70 reverseOutput ∷ MockEffData → Output
   71 reverseOutput = reverseText . output
   72 
   73 reverseText ∷ String → Output
   74 reverseText = S.reverse . toText
   75 
   76 reverseString ∷ Output → String
   77 reverseString = toString . S.reverse
   78 
   79 mockDataPutChar ∷ Char → MockEffData → MockEffData
   80 mockDataPutChar char mockEff = mockEff { output = char : output mockEff }
   81 
   82 mockDataPutText ∷ Text → MockEffData → MockEffData
   83 mockDataPutText text mockEff = mockEff { output = reverseString text <> output mockEff }
   84 
   85 splitStringByLn ∷ String → (String , String)
   86 splitStringByLn = splitBy '\n'
   87 
   88 ----
   89 
   90 type MonadSafeMockEff m = (MonadSafe m , MonadMockEff m)
   91 type MonadMockEff m = MonadState MockEffData m
   92 
   93 data MockEffData
   94   = MockEffData
   95       { output :: !String
   96       , input  :: !String
   97       }
   98   deriving stock (Eq, Show)