[add etaExpandAp to expand a single application
John Meacham <john@repetae.net>**20060310020738] hunk ./E/Eta.hs 1
-module E.Eta(etaExpand,etaExpandE,etaReduce) where
+module E.Eta(
+    etaExpand,
+    etaExpandE,
+    etaExpandAp,
+    etaReduce
+    ) where
hunk ./E/Eta.hs 80
+-- | eta reduce as much as possible
hunk ./E/Eta.hs 95
+
+etaExpandAp :: MonadStats m => DataTable -> TVr -> [E] -> m (Maybe E)
+etaExpandAp dataTable t as | Just (Arity n) <- Info.lookup (tvrInfo t), n > length as = do
+    let e = foldl EAp (EVar t) as
+    let (_,ts) = fromPi' dataTable (getType e)
+        ets = (take (n - length as) ts)
+    mticks (length ets) ("EtaExpand.{" ++ tvrShowName t)
+    let tvrs = f mempty [ (tvrIdent t,t { tvrIdent = n }) |  n <- [2,4 :: Int ..], not $ n `Set.member` freeVars (e,ets) | t <- ets ]
+        f map ((n,t):rs) = t { tvrType = substMap map (tvrType t)} : f (Map.insert n (EVar t) map) rs
+        f _ [] = []
+    return (Just $ foldr ELam (foldl EAp e (map EVar tvrs)) tvrs)
+etaExpandAp _ t as = return Nothing
+
+
+