module Klip where

data Klip 
 =  Var String
   |Num Int
   |Assign  Klip Klip
   |While Klip Klip
   |Add Klip Klip
   |Sub Klip Klip
   |Mul Klip Klip
   |Div Klip Klip
   |Seq [Klip]

fak
 = Seq [Assign (Var "x") (Num 5)
       ,Assign (Var "result") (Num 1)
       ,While (Var "x")
              (Seq [Assign (Var "result") 
                           (Mul (Var "result")(Var "x"))
                   ,Assign (Var "x") (Sub (Var "x" )(Num 1))])
       ,Var "result"]

pp (Var x) = x
pp (Num i) = show i 
pp (Assign  l r) = (pp l)++" = "++(pp r)
pp (While cond body)
 = "while ("++(pp cond)++"){\n"++(pp body)++"\n}"
pp (Add l r) = (pp l)++" + "++(pp r)
pp (Sub l r) = (pp l)++" - "++(pp r)
pp (Mul l r) = (pp l)++" * "++(pp r)
pp (Div l r) = (pp l)++" / "++(pp r)
pp  (Seq [x])= pp x
pp  (Seq (x:xs))= pp x++";\n"++pp (Seq xs)
