module Flite.ConcatApp where

import Flite.Syntax
import Flite.Traversals
import Flite.Descend

concatApps :: Prog -> Prog
concatApps = onExp conc
  where
    conc (App e []) = conc e
    conc (App (App f xs) ys) = descend conc (App f (xs ++ ys))
    conc e = descend conc e

concatNonPrims :: Prog -> Prog
concatNonPrims = onExp conc
  where
    conc (App e []) = conc e
    conc (App (Fun f) xs) | isPrimId f = App (Fun f) (map conc xs)
    conc (App (App (Fun f) xs) ys) | isPrimId f =
      App (App (Fun f) (map conc xs)) (map conc ys)
    conc (App (App f xs) ys) = descend conc (App f (xs ++ ys))
    conc e = descend conc e