>
> module Ivor.Grouper where
> import Ivor.TTCore
> import Ivor.Nobby
> import Ivor.Constant
TT expressions with lambdas/function arguments grouped, for better lambda
lifting.
> data GroupTT n
> = GP n
> | GV Int
> | GCon Int n [GroupTT n]
> | GTyCon n Int
> | GElim n
> | GApp (GroupTT n) [GroupTT n]
> | GLam [GroupTT n] Int (GroupTT n)
> | GLet (GroupTT n) (GroupTT n) (GroupTT n)
> | GPi (GroupTT n) (GroupTT n)
> | GProj Int (GroupTT n)
> | forall c. Constant c => GConst c
> | GStar
> | GCant
>
> group :: Show n => Levelled n -> GroupTT n
> group (Lev term) = gr 0 term where
> gr l (P n) = GP n
> gr l (V i) = GV i
> gr l c@(Con t n a) = mkApp l c []
> gr l (TyCon n a) = GTyCon n a
> gr l (Elim n) = GElim n
> gr l c@(App f a) = mkApp l c []
> gr l (Bind n (B Lambda t) (Sc sc)) = mkLam (l+1) [gr l t] sc
> gr l (Bind n (B Pi t) (Sc sc)) = GPi (gr l t) (gr (l+1) sc)
> gr l (Bind n (B (Let v) t) (Sc sc))
> = GLet (gr l v) (gr l t) (gr (l+1) sc)
> gr l (Proj _ i t) = GProj i (gr l t)
> gr l (Const c) = GConst c
> gr l (Label t _) = gr l t
> gr l (Call _ t) = gr l t
> gr l (Return t) = gr l t
> gr l Star = GStar
> gr _ _ = GCant
> mkApp l (App f a) sp = mkApp l f ((gr l a):sp)
> mkApp l (Con t n a) sp | length sp == a = GCon t n sp
> | otherwise = saturate l t n a sp
> mkApp l x sp = GApp (gr l x) sp
> mkLam l xs (Bind n (B Lambda t) (Sc sc))
> = mkLam (l+1) (xs++[gr l t]) sc
> mkLam l xs sc = GLam xs (llength xs) (gr l sc)
> saturate lev tag name arity sp
> = error $ "Constructor saturation unimplemented " ++ show term