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)