module PatchPrelude where
import ExtendedFlat
-- the prelude has to be extended by data declarations for list and tuples
prelude = "Prelude"
patchPreludeFCY :: Prog -> Prog
patchPreludeFCY (Prog name imports types funcs ops)
| name == prelude
= Prog name [] (prelude_types_fcy ++ types) funcs ops
| otherwise
= Prog name imports types funcs ops
prelude_types_fcy :: [TypeDecl]
prelude_types_fcy =
let unit = mkQName (prelude,"()")
nil = mkQName (prelude,"[]") in
[Type unit Public [] [(Cons unit 0 Public [])],
Type nil Public [0]
[Cons nil 0 Public [],
Cons (mkQName (prelude,":")) 2 Public
[TVar 0, TCons nil [TVar 0]]]] ++
map tupleType [2..maxTupleArity]
tupleType ar =
let tuplecons = mkQName (prelude,"("++take (ar-1) (repeat ',')++")") in
Type tuplecons Public [0..ar-1]
[Cons tuplecons ar Public (map TVar [0..ar-1])]
-- Maximal arity of tuples:
maxTupleArity = 15
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------