1 implementation module pprint
3 import Control.Applicative
4 import Control.Monad => qualified join
5 import Control.Monad.Reader
6 import Control.Monad.Identity
15 :: DSL | PPrintVar String
17 pprint :: DSL -> String
18 pprint d = concat $ runReader (print d) ["x" +++ toString i\\i<-[0..]]
20 print :: DSL -> Reader [String] [String]
21 print (Lit i) = pure $ pure $ toString i
22 print (PPrintVar s) = pure $ pure s
23 print (Var def) = asks hd >>= \v->
24 let (i In d) = def (PPrintVar v)
25 in local tl $ ((++) ["var ",v,"=",toString i," in\n"]) <$> print d
26 print (a +. b) = liftA2 (\as bs->as++["+":bs]) (print a) (print b)