never executed always true always false
    1 module HelVM.HelMA.Automata.LazyK.Automaton (
    2   runAutomat,
    3   runWithTerminator,
    4   realize,
    5   realizeWithTrue,
    6 ) where
    7 
    8 import           HelVM.HelMA.Automata.LazyK.Constants
    9 import           HelVM.HelMA.Automata.LazyK.Lambda
   10 import           HelVM.HelMA.Automata.LazyK.Reducer
   11 
   12 import           HelVM.HelMA.Automaton.Eff.MonadEff
   13 
   14 import           HelVM.HelIO.Control.Safe
   15 
   16 import           Control.Monad.Logger
   17 
   18 runAutomat :: AppEff m => Lambda -> m ()
   19 runAutomat = runWithTerminator false
   20 
   21 runWithTerminator :: AppEff m => Lambda -> Lambda -> m ()
   22 runWithTerminator terminator lambda = output terminator lambda =<< realizeWithTrue lambda
   23 
   24 realizeWithTrue :: MonadSafe m => Lambda -> m Natural
   25 realizeWithTrue = realize . flippedApply true
   26 
   27 realize :: MonadSafe m => Lambda -> m Natural
   28 realize = naturalSafe . flippedApply number0 . flippedApply Succ
   29 
   30 number0 :: Lambda
   31 number0 = Number 0
   32 
   33 naturalSafe :: MonadSafe m => Lambda -> m Natural
   34 naturalSafe (Number x) = pure x
   35 naturalSafe x          = liftErrorWithPrefix "Invalid output format. Output should be the list of Church numerals. " $ show x
   36 
   37 output :: AppEff m => Lambda -> Lambda -> Natural -> m ()
   38 output terminator lambda number = check $ compare 256 number where
   39   check GT = putAsChar number *> runWithTerminator terminator (apply lambda terminator)
   40   check EQ = pass
   41   check LT = logInfoN (show number) *> logInfoN (show lambda)