module Test.Speculate.Pretty
( prettyThy, prettyEquations
, prettyShy, prettySemiEquations
, prettyChy, prettyCondEquations
)
where
import Test.Speculate.Expr
import Test.Speculate.Utils.PrettyPrint
import Test.Speculate.Reason (Thy, finalEquations)
import Test.Speculate.SemiReason (Shy, finalSemiEquations)
import Test.Speculate.CondReason (Chy, finalCondEquations)
type Equation = (Expr,Expr)
type CondEquation = (Expr,Expr,Expr)
prettyThy :: (Equation -> Bool) -> Instances -> Thy -> String
prettyThy shouldShow ti = prettyEquations . finalEquations shouldShow ti
prettyChy :: (CondEquation -> Bool) -> Chy -> String
prettyChy shouldShow = prettyCondEquations . finalCondEquations shouldShow
prettyShy :: (Equation -> Bool) -> Instances -> (Expr -> Expr -> Bool) -> Shy -> String
prettyShy shouldShow insts equivalentInstanceOf =
prettySemiEquations . finalSemiEquations shouldShow insts equivalentInstanceOf
prettyEquations :: [Equation] -> String
prettyEquations =
table "r l l" . map showEquation
where
showEquation (e1,e2)
| otherwise = [showOpExpr "==" e1, "==", showOpExpr "==" e2]
prettySemiEquations :: [Equation] -> String
prettySemiEquations =
table "r l l" . map showSELine
where
showSELine (e1,e2) = showLineWithOp (if typ e1 == boolTy then "==>" else "<=") (e1,e2)
showLineWithOp o (e1,e2) = [showOpExpr o e1, o, showOpExpr o e2]
prettyCondEquations :: [CondEquation] -> String
prettyCondEquations =
table "r r r l l" . map showCELine
where
showCELine (ce,e1,e2) = [ showOpExpr "==>" ce
, "==>", showOpExpr "==" e1
, "==", showOpExpr "==" e2 ]