-- Portability : non-portable
--
-- Generic programming in Haskell;
--- see <http://www.cs.vu.nl/boilerplate>.
+-- see <http://www.cs.vu.nl/boilerplate/>.
--
-----------------------------------------------------------------------------
everywhereM,
somewhere,
everything,
+ listify,
something,
synthesize,
type GenericT = forall a. Data a => a -> a
--- | Generic queries of type "r",
+-- | Generic queries of type \"r\",
-- i.e., take any \"a\" and return an \"r\"
--
type GenericQ r = forall a. Data a => a -> r
-- | Make a generic monadic transformation for MonadPlus;
--- use "const mzero" (i.e., failure) instead of return as default.
+-- use \"const mzero\" (i.e., failure) instead of return as default.
--
mkF :: (Typeable a, Typeable b, Typeable (m a), Typeable (m b), MonadPlus m)
=> (b -> m b) -> a -> m a
-- use ordinary foldl to reduce list of intermediate results
--
everything k f x
- = foldl k (f x) (gmapQ (everything k f) x)
+ = foldl k (f x) (gmapQ (everything k f) x)
+
+
+-- | Get a list of all entities that meet a predicate
+listify :: Typeable r => (r -> Bool) -> GenericQ [r]
+listify p
+ = everything (++) ([] `mkQ` (\x -> if p x then [x] else []))
-- | Look up a subterm by means of a maybe-typed filter
gtypecount f = gcount (False `mkQ` (const True . f))
--- | Generic show: an alternative to "deriving Show"
+-- | Generic show: an alternative to \"deriving Show\"
gshow :: Data a => a -> String
-- This is a prefix-show using surrounding "(" and ")",
) `extQ` (show :: String -> String)
--- | Generic equality: an alternative to "deriving Eq"
+-- | Generic equality: an alternative to \"deriving Eq\"
geq :: Data a => a -> a -> Bool
{-
unGRead (GRead x) = x
--- | Generic read: an alternative to "deriving Read"
+-- | Generic read: an alternative to \"deriving Read\"
gread :: GenericB Maybe String
{-