, MonadState PS
, MonadReader PR
)
-data PS = PS {fresh :: [Int]}
+newtype PS = PS {fresh :: [Int]}
data PR = PR {context :: Ctx, indent :: Int}
data Ctx = CtxNo | CtxNullary | CtxNonfix | CtxInfix {assoc :: CtxAssoc, prio :: Int, branch :: CtxAssoc}
deriving Eq
instance DSL Printer
instance Expression Printer where
lit = printLit . show
- (+.) = printBinOp (leftctx 6) "+"
- (-.) = printBinOp (leftctx 6) "-"
- (*.) = printBinOp (leftctx 7) "*"
- (/.) = printBinOp (leftctx 7) "/"
- neg = printUnOp (nonectx 7) "!"
- (&.) = printBinOp (rightctx 3) "&"
- (|.) = printBinOp (rightctx 2) "|"
- not = printUnOp (nonectx 7) "!"
- (==.) = printBinOp (nonectx 4) "=="
- (/=.) = printBinOp (nonectx 4) "/="
- (<.) = printBinOp (nonectx 4) "<"
- (>.) = printBinOp (nonectx 4) ">"
- (<=.) = printBinOp (nonectx 4) "<"
- (>=.) = printBinOp (nonectx 4) ">"
+ (+.) = printBinOp "+" (leftctx 6)
+ (-.) = printBinOp "-" (leftctx 6)
+ (*.) = printBinOp "*" (leftctx 7)
+ (/.) = printBinOp "/" (leftctx 7)
+ neg = printUnOp "!" (nonectx 7)
+ (&.) = printBinOp "&" (rightctx 3)
+ (|.) = printBinOp "|" (rightctx 2)
+ not = printUnOp "!" (nonectx 7)
+ (==.) = printBinOp "==" (nonectx 4)
+ (/=.) = printBinOp "/=" (nonectx 4)
+ (<.) = printBinOp "<" (nonectx 4)
+ (>.) = printBinOp ">" (nonectx 4)
+ (<=.) = printBinOp "<" (nonectx 4)
+ (>=.) = printBinOp ">" (nonectx 4)
if' p t e = paren' CtxNonfix
$ printLit "if" >-> p
>^> printLit "then" >^> iindent (localctx CtxNonfix t)
printIndent = asks (flip replicate '\t' . indent) >>= printLit
infixl 1 >>>, >->, >^>
-printBinOp :: Ctx -> String -> Printer a1 -> Printer a2 -> Printer a3
-printBinOp thisctx op l r = paren' thisctx $
+printBinOp :: String -> Ctx -> Printer a1 -> Printer a2 -> Printer a3
+printBinOp op thisctx l r = paren' thisctx $
localctx (setBranch thisctx CtxLeft) l
>-> printLit op
>-> localctx (setBranch thisctx CtxRight) r
-printUnOp :: Ctx -> String -> Printer a -> Printer a
-printUnOp thisctx op l = paren' thisctx $
+printUnOp :: String -> Ctx -> Printer a -> Printer a
+printUnOp op thisctx l = paren' thisctx $
printLit (' ':op)
>-> localctx (setBranch thisctx CtxRight) l
printCons cons l = paren' CtxNonfix $ printLit cons >-> l
printRec :: String -> Printer a -> Printer a
-printRec op l = printUnOp CtxNo op $ accol l
+printRec op l = printUnOp op CtxNo $ accol l