module Data.Derive.Foldable(makeFoldable, makeFoldableN) where
import Data.Derive.Internal.Traversal
import Data.Derive.Internal.Derivation
import Language.Haskell
makeFoldable :: Derivation
makeFoldable = makeFoldableN 1
makeFoldableN :: Int -> Derivation
makeFoldableN n = traversalDerivation1 foldrTraversal{traversalArg = n} "Foldable"
foldrTraversal = defaultTraversalType
{ traversalName = Qual (ModuleName "Data.Foldable") (Ident "foldr")
, traversalFunc = \n a -> appP (var "flip") $ appP (Var n) a
, traversalPlus = fail "variable used in multiple positions in a data type"
, traversalId = App (var "flip") (var "const")
, traverseTuple = foldr (.:) $ var "id"
, traverseCtor = const $ foldr (.:) $ var "id"
, traverseFunc = \pat rhs -> Match sl (name "") [pVar "_f", pVar "b", pat] Nothing (UnGuardedRhs $ appP rhs (var "b")) (BDecls [])
}
where a .: b = InfixApp (paren a) (qvop ".") (paren b)