33feaff80f7dbd910f3fd53d9d18f0a1724e273f
[clean-tests.git] / deep-var / pprint.icl
1 implementation module pprint
2
3 import Control.Applicative
4 import Control.Monad => qualified join
5 import Control.Monad.Reader
6 import Control.Monad.Identity
7 import Data.Func
8 import Data.Functor
9 import Data.List
10 import Text
11 import StdEnv
12
13 import test
14
15 :: DSL | PPrintVar String
16
17 pprint :: DSL -> String
18 pprint d = concat $ runReader (print d) ["x" +++ toString i\\i<-[0..]]
19
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)