never executed always true always false
1 module HelVM.HelMA.Automata.Zot.Expression where
2
3 import HelVM.HelIO.Control.Safe
4
5 import HelVM.HelIO.Containers.Extra
6 import HelVM.HelIO.Digit.Digitable
7 import HelVM.HelIO.Digit.ToDigit
8
9 import Control.Monad.Writer.Lazy
10
11 import qualified Data.DList as D
12 import Text.Read
13 import qualified Text.Show
14
15 showExpressionList ∷ ExpressionList → LText
16 showExpressionList f = fmconcat $ show <$> f
17
18 readExpressionList ∷ LText → ExpressionList
19 readExpressionList = stringToExpressionList . toString
20
21 stringToExpressionList ∷ String → ExpressionList
22 stringToExpressionList s = charToExpressionList =<< s
23
24 charToExpressionList ∷ Char → ExpressionList
25 charToExpressionList = maybeToList . rightToMaybe . charToExpressionSafe
26
27 charToExpression ∷ Char → Expression
28 charToExpression = unsafe . charToExpressionSafe
29
30 charToExpressionSafe ∷ MonadSafe m ⇒ Char → m Expression
31 charToExpressionSafe '0' = pure Zero
32 charToExpressionSafe '1' = pure One
33 charToExpressionSafe c = liftErrorWithPrefix "charToExpression" $ one c
34
35 -- | Types
36 type ExpressionDList = D.DList Expression
37
38 type ExpressionList = [Expression]
39
40 data Expression
41 = Zero
42 | One
43 | Expression (Expression -> Out Expression)
44
45 type Out = Writer ExpressionDList
46
47 instance Read Expression where
48 readsPrec _ [] = []
49 readsPrec _ (c : s) = [(charToExpression c , s)]
50 readList s = [(stringToExpressionList s , "")]
51
52 instance Show Expression where
53 show Zero = "0"
54 show One = "1"
55 show (Expression _) = "function"
56 showList fs = (concatMap show fs <>)
57
58 instance Digitable Expression where
59 fromDigit 0 = pure Zero
60 fromDigit 1 = pure One
61 fromDigit t = wrongToken t
62
63 instance ToDigit Expression where
64 toDigit Zero = pure 0
65 toDigit One = pure 1
66 toDigit t = wrongToken t