module Yhc.Core.Saturated(coreSaturated) where

import Yhc.Core.Type
import qualified Data.Map as Map


-- | Given an expr (normally a 'CoreApp')
--   say if it is saturated or not.
coreSaturated :: Core -> (CoreExpr -> Bool)
coreSaturated core =
        \x -> case x of
            CoreApp (CoreFun x) ys -> f funcArity x ys
            CoreApp (CoreCon x) ys -> f ctorArity x ys
            _ -> False
    where
        ctorArity = Map.fromList [(name, length args) | dat <- coreDatas core, (CoreCtor name args) <- coreDataCtors dat]
        funcArity = Map.fromList [(name, length args) | CoreFunc name args _ <- coreFuncs core]

        f mp x ys = case Map.lookup x mp of
                        Nothing -> False
                        Just xn -> xn == length ys