[list cata applies to any argument, list cata only applies iff gen cata does not apply
martin.hofmann@uni-bamberg.de**20091217100032] hunk ./src/Igor2/Data/IOData.hs 20
-import Data.List (intersect, sort)
+import Data.List (intersect, sort, (\\))
hunk ./src/Igor2/Data/IOData.hs 214
+
hunk ./src/Igor2/Data/Rules.hs 4
-    Rule, mkRule, rule, rhs, lhs,
+    Rule, mkRule, rule, rhs, lhs, ithArg, butIthArg,
hunk ./src/Igor2/Data/Rules.hs 61
+ithArg i = (!!i) . lhs 
+butIthArg i = (\l -> l \\ [l!!i]) . lhs 
+
hunk ./src/Igor2/Data/Rules.hs 84
+
hunk ./src/Igor2/RuleDevelopment/Cata.hs 15
+import Data.Function (on)
hunk ./src/Igor2/RuleDevelopment/Cata.hs 28
-    if hasListT . last . lhs . crul $ cr then listCata cr
-      else do is <- cataArgIs . lhs . crul $ cr
-              rs <- mapM (genericCata cr) is
-              return $ case concat rs of [] -> []; (x:_) -> [x] -- only the first possibility
+    gc <- genCataArgIs cr >>= mapM (genericCata cr) >>= return . oneOnly . concat
+        
+    if not $ null gc then return gc
+      else mapM (genericCata cr) (lstCataArgIs cr) >>= return . oneOnly . concat
+      
+    where
+    oneOnly ls = case ls of [] -> []; (x:_) -> [x]
hunk ./src/Igor2/RuleDevelopment/Cata.hs 38
-cataArgIs :: [TExp] -> IM [Int]
-cataArgIs as = mapM doit (zip as [0..]) >>= return . reverse . rights
+genCataArgIs :: CovrRule -> IM [Int]
+genCataArgIs cr = 
+    mapM doit (zip (lhs . crul $ cr) [0..]) >>= return . reverse . rights
hunk ./src/Igor2/RuleDevelopment/Cata.hs 45
-ithArg i = (!!i) . lhs . crul 
-butIthArg i = (\l -> l \\ [l!!i]) . lhs . crul
+lstCataArgIs :: CovrRule -> [Int]
+lstCataArgIs = 
+    (map fst) . (filter (hasListT . snd)) . (zip [0..]) . lhs . crul
hunk ./src/Igor2/RuleDevelopment/Cata.hs 53
-    (dataTypeName i cr >>= ctorsOf >>= partByCtors i evi >>= mkCata i cr) 
+    (dataTypeName i (crul cr) >>= ctorsOf >>= partByCtors i evi >>= mkCata i cr) 
hunk ./src/Igor2/RuleDevelopment/Cata.hs 57
-    dataTypeName = ((dataName . typeOf) .) . ithArg 
+    dataTypeName = ((dataName . typeOf) .) . ithArg
hunk ./src/Igor2/RuleDevelopment/Cata.hs 60
-partByCtors i rs ns = mapM (byCtor rs) ns
+partByCtors i crs ns = mapM (byCtor crs) ns
hunk ./src/Igor2/RuleDevelopment/Cata.hs 62
-    byCtor rs n = let rs' = filter ((hasCtor n) . (ithArg i)) rs in
-                  if null rs' then noPartition  else return rs'
+    byCtor crs n = let rs = filter ((hasCtor n) . (ithArg i) . crul) crs in
+                   if null rs then noPartition else return rs
hunk ./src/Igor2/RuleDevelopment/Cata.hs 77
-     let mfuns = map (mkMediators (butIthArg i cr)) mfcr     
-     let fExp = foldTAppE  cataEx [botEx, (mkInfxs mfuns), ithArg i cr]
+     let mfuns = map (mkMediators (butIthArg i $ crul cr)) mfcr     
+     let fExp = foldTAppE  cataEx [botEx, (mkInfxs mfuns), ithArg i $ crul cr]
hunk ./src/Igor2/RuleDevelopment/Cata.hs 117
-    args = butIthArg i cr
-    carg = ithArg i cr 
+    args = butIthArg i $ crul cr
+    carg = ithArg i $ crul cr 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 24
-listCata :: CovrRule -> IM [(CovrRules,[Call])]
-listCata cr = do
+import Prelude hiding (last)
+
+listCata :: Int ->  CovrRule -> IM [(CovrRules,[Call])]
+listCata i cr = do
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 29
-    mbios <- lift . lift . lift . lift $ (checkUniPropAndMkIOs $ evi)
-    maybe (naiveMap cr evi) (mkFoldCall cr) mbios
+    mbios <- lift . lift . lift . lift $ (checkUniPropAndMkIOs i evi)
+    maybe (naiveMap i cr evi) (mkFoldCall  i cr) mbios
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 40
-naiveMap :: CovrRule -> [Rule] -> IM [(CovrRules,[Call])]
-naiveMap cr evi = do
+naiveMap :: Int -> CovrRule -> [Rule] -> IM [(CovrRules,[Call])]
+naiveMap i cr evi = do
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 43
-    if (not $ all listAndSameLength evi) || (any hasFreeVars ios) || (null ios) then noFoldCall
+    if (not $ all (listAndSameLength i) evi) || (any hasFreeVars ios) || (null ios) then noFoldCall
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 61
-                          [afExp, last.lhs.crul $ cr]
+                          [afExp, ithArg i $ crul cr]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 65
-    mbMapIO r = liftM (map (\(i,o) -> rule ((init . lhs $ r) ++ [i]) o)) $ liftM2 zip (mbListElems . last . lhs $ r)(mbListElems . rhs $ r)
+    mbMapIO r = liftM (map (\(inn,out) -> rule ((butIthArg i r) ++ [inn]) out)) $ liftM2 zip (mbListElems $ ithArg i r)(mbListElems . rhs $ r)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 67
-mkFoldCall :: CovrRule -> (Rule,[Rule]) -> IM [(CovrRules,[Call])]
-mkFoldCall cr (vr,fios) = (liftM (:[])) . fromJust . msum $ 
-                        [ mbFilter cr (vr,fios)
-                        , mbMap cr (vr,fios)
-                        ,Just $ mkFold cr (vr,fios)]
+mkFoldCall :: Int -> CovrRule -> (Rule,[Rule]) -> IM [(CovrRules,[Call])]
+mkFoldCall i cr (vr,fios) = (liftM (:[])) . fromJust . msum $ 
+                        [ mbFilter i cr (vr,fios)
+                        , mbMap i cr (vr,fios)
+                        ,Just $ mkFold i cr (vr,fios)]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 73
-mbFilter :: CovrRule -> (Rule,[Rule]) -> Maybe (IM (CovrRules,[Call]))
-mbFilter cr (bc,evi) = do 
+mbFilter :: Int -> CovrRule -> (Rule,[Rule]) -> Maybe (IM (CovrRules,[Call]))
+mbFilter i cr (bc,evi) = do 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 81
-    case partition lastArgIsOut evi of
+    case partition (ithArgIsOut i) evi of
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 85
-            if  or [not $ hasMapProperty (bc,evi), null $ on intersect (map lhs) fio tio]
+            if  or [not $ hasMapProperty i (bc,evi), null $ on intersect (map lhs) fio tio]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 104
-                            [pExp, last.lhs.crul $ cr]
+                            [pExp, ithArg i $ crul cr]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 115
-mbMap :: CovrRule -> (Rule,[Rule]) -> Maybe (IM (CovrRules,[Call]))
-mbMap  cr (bc,evi) = 
+mbMap :: Int -> CovrRule -> (Rule,[Rule]) -> Maybe (IM (CovrRules,[Call]))
+mbMap i cr (bc,evi) = 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 120
-    if or [not $ hasMapProperty (bc,evi), any hasFreeVars ios,  null ios]
+    if or [not $ hasMapProperty i (bc,evi), any hasFreeVars ios,  null ios]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 140
-                    [afExp, last.lhs.crul $ cr]
+                    [afExp, ithArg i $ crul cr]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 147
-mkFold :: CovrRule -> (Rule,[Rule]) -> IM (CovrRules,[Call])
-mkFold cr (vr,ios) =  do 
+mkFold :: Int -> CovrRule -> (Rule,[Rule]) -> IM (CovrRules,[Call])
+mkFold i cr (vr,ios) =  do 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 202
-    let afExp = foldTAppE ((tConE afnm) afty) ((rmAll usedVarInd) . init . lhs . crul $ cr)
+    let afExp = foldTAppE ((tConE afnm) afty) $ rmAll usedVarInd $ (butIthArg i) . crul $ cr
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 205
-                    [afExp, v, last.lhs.crul $ cr]
+                    [afExp, v, ithArg i $ crul cr]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 221
-checkUniPropAndMkIOs :: (MonadError e m) => [Rule] -> C m (Maybe (Rule,[Rule]))
-checkUniPropAndMkIOs evi = 
-    case definedOnNil evi of
-        Just (r,rs) -> do ios <- mapM (abduceIO evi) rs
+checkUniPropAndMkIOs :: (MonadError e m) => Int -> [Rule] -> C m (Maybe (Rule,[Rule]))
+checkUniPropAndMkIOs i evi = 
+    case definedOnNil i evi of
+        Just (r,rs) -> do ios <- mapM (abduceIO i evi) rs
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 233
-definedOnNil :: [Rule] -> Maybe (Rule,[Rule])
-definedOnNil = maybeStripNil . partition (hasNilIn.(:[]).last.lhs)
+definedOnNil :: Int -> [Rule] -> Maybe (Rule,[Rule])
+definedOnNil i = maybeStripNil . partition (hasNilIn.(!!i).lhs)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 239
-hasNilIn :: LHS -> Bool
-hasNilIn [TListE [] _] = True
-hasNilIn [a@(TAppE _ _ _)] = (\(TConE n _) -> isNil n) $ head . unfoldTAppE $ a
+hasNilIn :: TExp -> Bool
+hasNilIn (TListE [] _) = True
+hasNilIn (a@(TAppE _ _ _)) = (\(TConE n _) -> isNil n) $ head . unfoldTAppE $ a
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 244
--- check wether last in-type and out type is a list and both have same length
-listAndSameLength :: Rule -> Bool
-listAndSameLength r =  maybe False id $ liftM2 ((==) `on` length)  (mbListElems . last . lhs $ r)(mbListElems . rhs $ r)
+-- check wether ith input argument type and out type is a list and both have same length
+listAndSameLength :: Int -> Rule -> Bool
+listAndSameLength i r =  maybe False id $ liftM2 ((==) `on` length)  (mbListElems $ ithArg i r)(mbListElems . rhs $ r)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 259
-lastArgIsOut r = (last . lhs $ r) == (rhs r)
+ithArgIsOut i r = ((lhs r) !! i) == (rhs r)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 263
-hasMapProperty :: (Rule,[Rule]) -> Bool
-hasMapProperty (bc,evi) = 
-    and [ isNilList . last . lhs $ bc
+hasMapProperty :: Int -> (Rule,[Rule]) -> Bool
+hasMapProperty i (bc,evi) = 
+    and [ isNilList . (!!i) . lhs $ bc
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 267
-        , all lastArgConsed evi]
+        , all (ithArgConsed i) evi]
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 271
-    lastArgConsed r = 
+    ithArgConsed i r = 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 273
-           TListE (x:xs) t -> (last . lhs $ r) == TListE xs t
+           TListE (x:xs) t -> (lhs r) !! i == TListE xs t
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 276
-                [TConE n _, _, xs] -> isCons n  && (last . lhs $ r) == xs
+                [TConE n _, _, xs] -> isCons n  && ((lhs r) !! i == xs)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 283
-abduceIO :: (MonadError e m) => [Rule] -> Rule -> C m (Maybe Rule)
-abduceIO evi r =
-    let temp = liftM ((,) (init . lhs $ r)) $ headTail . (:[]) . last. lhs $ r in 
+abduceIO :: (MonadError e m) => Int -> [Rule] -> Rule -> C m (Maybe Rule)
+abduceIO i evi r =
+    let temp = liftM ((,) (butIthArg i r)) $ headTail $ ithArg i r in 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 295
-headTail :: LHS -> Maybe (TExp,TExp)
+headTail :: TExp -> Maybe (TExp,TExp)
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 297
-headTail [TListE (x:xs) ty]          = Just (x, TListE xs ty)
-headTail [TInfixE l (TConE n _) r _] = 
+headTail (TListE (x:xs) ty)          = Just (x, TListE xs ty)
+headTail (TInfixE l (TConE n _) r _) = 
hunk ./src/Igor2/RuleDevelopment/ListCata.hs 300
-headTail [l@(TAppE _ _ _)]           = 
+headTail (l@(TAppE _ _ _))           = 