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 = Zero | One | Expression (Expression -> Out Expression)
   41 
   42 type Out = Writer ExpressionDList
   43 
   44 instance Read Expression where
   45   readsPrec _ []      = []
   46   readsPrec _ (c : s) = [(charToExpression c , s)]
   47   readList s = [(stringToExpressionList s , "")]
   48 
   49 instance Show Expression where
   50   show  Zero          = "0"
   51   show  One           = "1"
   52   show (Expression _) = "function"
   53   showList fs  = (concatMap show fs <>)
   54 
   55 instance Digitable Expression where
   56   fromDigit 0 = pure Zero
   57   fromDigit 1 = pure One
   58   fromDigit t = wrongToken t
   59 
   60 instance ToDigit Expression where
   61   toDigit Zero = pure 0
   62   toDigit One  = pure 1
   63   toDigit t    = wrongToken t