never executed always true always false
    1 module HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Evaluator(
    2   evalSource,
    3 ) where
    4 
    5 import           HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Instruction
    6 import           HelVM.HelMA.Automata.BrainFuck.Impl.Flat.Parser
    7 import           HelVM.HelMA.Automata.BrainFuck.Impl.Flat.TableOfInstructions
    8 
    9 import           HelVM.HelMA.Automata.BrainFuck.Common.SimpleInstruction
   10 import           HelVM.HelMA.Automata.BrainFuck.Common.Symbol
   11 import           HelVM.HelMA.Automata.BrainFuck.Common.TapeOfSymbols
   12 
   13 import           HelVM.HelMA.Automaton.API.IOTypes
   14 import           HelVM.HelMA.Automaton.IO.BusinessIO
   15 import           HelVM.HelMA.Automaton.Types.DumpType
   16 
   17 import           Control.Type.Operator
   18 
   19 evalSource :: (BIO m , Symbol e) => Source -> FullTape e -> DumpType -> m ()
   20 evalSource source tape dt = logDump dt =<< doInstruction ([] , tokenize source) tape
   21 
   22 doInstruction :: (BIO m , Symbol e) => Table -> FullTape e -> m $ Memory e
   23 doInstruction table@(_ , Simple MoveR  : _) tape = doInstruction (nextInst table) (moveHeadRight tape)
   24 doInstruction table@(_ , Simple MoveL  : _) tape = doInstruction (nextInst table)  (moveHeadLeft tape)
   25 doInstruction table@(_ , Simple Inc    : _) tape = doInstruction (nextInst table)    (nextSymbol tape)
   26 doInstruction table@(_ , Simple Dec    : _) tape = doInstruction (nextInst table)    (prevSymbol tape)
   27 doInstruction table@(_ , Simple Output : _) tape = doOutputChar            table                 tape
   28 doInstruction table@(_ , Simple Input  : _) tape = doInputChar             table                 tape
   29 doInstruction table@(_ , JmpPast       : _) tape = doJmpPast               table                 tape
   30 doInstruction table@(_ , JmpBack       : _) tape = doJmpBack               table                 tape
   31 doInstruction table@(_ , []               ) tape = doEnd                   table                 tape
   32 
   33 doJmpPast :: (BIO m , Symbol e) => Table -> FullTape e -> m $ Memory e
   34 doJmpPast table tape@(_ , 0 : _) = doInstruction (jumpPast table) tape
   35 doJmpPast table tape             = doInstruction (nextInst table) tape
   36 
   37 doJmpBack :: (BIO m , Symbol e) => Table -> FullTape e -> m $ Memory e
   38 doJmpBack table tape@(_ , 0 : _) = doInstruction (nextInst table) tape
   39 doJmpBack table tape             = doInstruction (jumpBack table) tape
   40 
   41 -- | IO instructions
   42 doOutputChar :: (BIO m , Symbol e) => Table -> FullTape e -> m $ Memory e
   43 doOutputChar _          (_ ,    []) = error "Illegal State"
   44 doOutputChar table tape@(_ , e : _) = wPutChar (toChar e) *> doInstruction (nextInst table) tape
   45 
   46 doInputChar :: (BIO m , Symbol e) => Table -> FullTape e -> m $ Memory e
   47 doInputChar table tape = (doInstruction (nextInst table) . flip writeSymbol tape) =<< wGetChar
   48 
   49 -- | Terminate instruction
   50 doEnd :: BIO m => Table -> FullTape e -> m $ Memory e
   51 doEnd table tape = pure $ Memory table tape
   52 
   53 -- | Types
   54 data Memory e = Memory
   55   { memoryTable :: Table
   56   , memoryTape  :: FullTape e
   57   }
   58   deriving stock (Eq , Read , Show)