module Yhc.Core.CaseElimination(coreCaseElim) where
import Yhc.Core.Type
import Yhc.Core.Uniplate
import Data.List((\\))
coreCaseElim :: Core -> Core
coreCaseElim core = transformExpr f core
where
coreSets = map (map coreCtorName . coreDataCtors) (coreDatas core)
f (CoreCase on alts)
| not (null cons) && not (null cors) && null (cors1 \\ cons)
= CoreCase on (filter (not . isPatDefault . fst) alts)
where
cors = filter (cons1 `elem`) coreSets
cons = [x | (PatCon x _, _) <- alts]
(cors1,cons1) = (head cors, head cons)
f x = x