syb 0.7.2.3 → 0.7.2.4
raw patch · 7 files changed
+434/−64 lines, 7 files
Files
- Changelog.md +4/−0
- src/Data/Generics/Aliases.hs +356/−59
- src/Data/Generics/Builders.hs +5/−1
- src/Data/Generics/Schemes.hs +35/−1
- src/Data/Generics/Text.hs +6/−0
- src/Data/Generics/Twins.hs +26/−1
- syb.cabal +2/−2
Changelog.md view
@@ -1,3 +1,7 @@+# 0.7.2.4+- Improved documentation (thanks to @BinderDavid)+- Export `ext2` function which was already defined but not exported+ # 0.7.2.3 - Compatibility with `mtl` 2.3 and GHC 9.6
src/Data/Generics/Aliases.hs view
@@ -4,35 +4,58 @@ -- Module : Data.Generics.Aliases -- Copyright : (c) The University of Glasgow, CWI 2001--2004 -- License : BSD-style (see the LICENSE file)--- +-- -- Maintainer : generics@haskell.org -- Stability : experimental -- Portability : non-portable (local universal quantification) ----- \"Scrap your boilerplate\" --- Generic programming in Haskell --- See <http://www.cs.uu.nl/wiki/GenericProgramming/SYB>.--- The present module provides a number of declarations for typical generic+-- This module provides a number of declarations for typical generic -- function types, corresponding type case, and others. -- ----------------------------------------------------------------------------- module Data.Generics.Aliases ( - -- * Combinators to \"make\" generic functions via cast- mkT, mkQ, mkM, mkMp, mkR,- ext0, extT, extQ, extM, extMp, extB, extR,+ -- * Combinators which create generic functions via cast+ --+ -- $castcombinators - -- * Type synonyms for generic function types+ -- ** Transformations+ mkT,+ extT,+ -- ** Queries+ mkQ,+ extQ,+ -- ** Monadic transformations+ mkM,+ extM,+ -- ** MonadPlus transformations+ mkMp,+ extMp,+ -- ** Readers+ mkR,+ extR,+ -- ** Builders+ extB,+ -- ** Other+ ext0,+ -- * Types for generic functions+ -- ** Transformations GenericT,+ GenericT'(..),+ -- ** Queries GenericQ,+ GenericQ'(..),+ -- ** Monadic transformations GenericM,- GenericB,+ GenericM'(..),+ -- ** Readers GenericR,+ -- ** Builders+ GenericB,+ -- ** Other Generic, Generic'(..),- GenericT'(..),- GenericQ'(..),- GenericM'(..), -- * Ingredients of generic functions orElse,@@ -52,6 +75,7 @@ ext1B, -- * Type extension for binary type constructors+ ext2, ext2T, ext2M, ext2Q,@@ -73,149 +97,346 @@ -- ------------------------------------------------------------------------------ --- | Make a generic transformation;--- start from a type-specific case;--- preserve the term otherwise+-- $castcombinators --+-- Other programming languages sometimes provide an operator @instanceof@ which+-- can check whether an expression is an instance of a given type. This operator+-- allows programmers to implement a function @f :: forall a. a -> a@ which exhibits+-- a different behaviour depending on whether a `Bool` or a `Char` is passed.+-- In Haskell this is not the case: A function with type @forall a. a -> a@+-- can only be the identity function or a function which loops indefinitely+-- or throws an exception. That is, it must implement exactly the same behaviour+-- for any type at which it is used. But sometimes it is very useful to have+-- a function which can accept (almost) any type and exhibit a different behaviour+-- for different types. Haskell provides this functionality with the 'Typeable'+-- typeclass, whose instances can be automatically derived by GHC for almost all+-- types. This typeclass allows the definition of a functon 'cast' which has type+-- @forall a b. (Typeable a, Typeable b) => a -> Maybe b@. The 'cast' function allows+-- to implement a polymorphic function with different behaviour at different types:+--+-- >>> cast True :: Maybe Bool+-- Just True+--+-- >>> cast True :: Maybe Int+-- Nothing+--+-- This section provides combinators which make use of 'cast' internally to+-- provide various polymorphic functions with type-specific behaviour.+++-- | Extend the identity function with a type-specific transformation.+-- The function created by @mkT ext@ behaves like the identity function on all+-- arguments which cannot be cast to type @b@, and like the function @ext@ otherwise.+-- The name 'mkT' is short for "make transformation".+--+-- === __Examples__+--+-- >>> mkT not True+-- False+--+-- >>> mkT not 'a'+-- 'a'+--+-- @since 0.1.0.0 mkT :: ( Typeable a , Typeable b ) => (b -> b)+ -- ^ The type-specific transformation -> a+ -- ^ The argument we try to cast to type @b@ -> a mkT = extT id --- | Make a generic query;--- start from a type-specific case;--- return a constant otherwise+-- | The function created by @mkQ def f@ returns the default result+-- @def@ if its argument cannot be cast to type @b@, otherwise it returns+-- the result of applying @f@ to its argument.+-- The name 'mkQ' is short for "make query". --+-- === __Examples__+--+-- >>> mkQ "default" (show :: Bool -> String) True+-- "True"+--+-- >>> mkQ "default" (show :: Bool -> String) ()+-- "default"+--+-- @since 0.1.0.0 mkQ :: ( Typeable a , Typeable b ) => r+ -- ^ The default result -> (b -> r)+ -- ^ The transformation to apply if the cast is successful -> a+ -- ^ The argument we try to cast to type @b@ -> r (r `mkQ` br) a = case cast a of Just b -> br b Nothing -> r --- | Make a generic monadic transformation;--- start from a type-specific case;--- resort to return otherwise+-- | Extend the default monadic action @pure :: Monad m => a -> m a@ by a type-specific+-- monadic action. The function created by @mkM act@ behaves like 'pure' if its+-- argument cannot be cast to type @b@, and like the monadic action @act@ otherwise.+-- The name 'mkM' is short for "make monadic transformation". --+-- === __Examples__+--+-- >>> mkM (\x -> [x, not x]) True+-- [True,False]+--+-- >>> mkM (\x -> [x, not x]) (5 :: Int)+-- [5]+--+-- @since 0.1.0.0 mkM :: ( Monad m , Typeable a , Typeable b ) => (b -> m b)+ -- ^ The type-specific monadic transformation -> a+ -- ^ The argument we try to cast to type @b@ -> m a mkM = extM return --{---For the remaining definitions, we stick to a more concise style, i.e.,-we fold maybes with "maybe" instead of case ... of ..., and we also-use a point-free style whenever possible.---}----- | Make a generic monadic transformation for MonadPlus;--- use \"const mzero\" (i.e., failure) instead of return as default.+-- | Extend the default 'MonadPlus' action @const mzero@ by a type-specific 'MonadPlus'+-- action. The function created by @mkMp act@ behaves like @const mzero@ if its argument+-- cannot be cast to type @b@, and like the monadic action @act@ otherwise.+-- The name 'mkMp' is short for "make MonadPlus transformation". --+-- === __Examples__+--+-- >>> mkMp (\x -> Just (not x)) True+-- Just False+--+-- >>> mkMp (\x -> Just (not x)) 'a'+-- Nothing+--+-- @since 0.1.0.0 mkMp :: ( MonadPlus m , Typeable a , Typeable b ) => (b -> m b)+ -- ^ The type-specific MonadPlus action -> a+ -- ^ The argument we try to cast to type @b@ -> m a mkMp = extM (const mzero) --- | Make a generic builder;--- start from a type-specific ase;--- resort to no build (i.e., mzero) otherwise+-- | Make a generic reader from a type-specific case.+-- The function created by @mkR f@ behaves like the reader @f@ if an expression+-- of type @a@ can be cast to type @b@, and like the expression @mzero@ otherwise.+-- The name 'mkR' is short for "make reader". --+-- === __Examples__+--+-- >>> mkR (Just True) :: Maybe Bool+-- Just True+--+-- >>> mkR (Just True) :: Maybe Int+-- Nothing+--+-- @since 0.1.0.0 mkR :: ( MonadPlus m , Typeable a , Typeable b )- => m b -> m a+ => m b+ -- ^ The type-specific reader+ -> m a mkR f = mzero `extR` f -- | Flexible type extension+--+-- === __Examples__+--+-- >>> ext0 [1 :: Int, 2, 3] [True, False] :: [Int]+-- [1,2,3]+--+-- >>> ext0 [1 :: Int, 2, 3] [4 :: Int, 5, 6] :: [Int]+-- [4,5,6]+--+-- @since 0.1.0.0 ext0 :: (Typeable a, Typeable b) => c a -> c b -> c a ext0 def ext = maybe def id (gcast ext) --- | Extend a generic transformation by a type-specific case+-- | Extend a generic transformation by a type-specific transformation.+-- The function created by @extT def ext@ behaves like the generic transformation+-- @def@ if its argument cannot be cast to the type @b@, and like the type-specific+-- transformation @ext@ otherwise.+-- The name 'extT' is short for "extend transformation".+--+-- === __Examples__+--+-- >>> extT id not True+-- False+--+-- >>> extT id not 'a'+-- 'a'+--+-- @since 0.1.0.0 extT :: ( Typeable a , Typeable b ) => (a -> a)+ -- ^ The transformation we want to extend -> (b -> b)+ -- ^ The type-specific transformation -> a+ -- ^ The argument we try to cast to type @b@ -> a extT def ext = unT ((T def) `ext0` (T ext)) --- | Extend a generic query by a type-specific case+-- | Extend a generic query by a type-specific query. The function created by @extQ def ext@ behaves+-- like the generic query @def@ if its argument cannot be cast to the type @b@, and like the type-specific+-- query @ext@ otherwise.+-- The name 'extQ' is short for "extend query".+--+-- === __Examples__+--+-- >>> extQ (const True) not True+-- False+--+-- >>> extQ (const True) not 'a'+-- True+--+-- @since 0.1.0.0 extQ :: ( Typeable a , Typeable b )- => (a -> q)- -> (b -> q)+ => (a -> r)+ -- ^ The query we want to extend+ -> (b -> r)+ -- ^ The type-specific query -> a- -> q+ -- ^ The argument we try to cast to type @b@+ -> r extQ f g a = maybe (f a) g (cast a) --- | Extend a generic monadic transformation by a type-specific case+-- | Extend a generic monadic transformation by a type-specific case.+-- The function created by @extM def ext@ behaves like the monadic transformation+-- @def@ if its argument cannot be cast to type @b@, and like the monadic transformation+-- @ext@ otherwise.+-- The name 'extM' is short for "extend monadic transformation".+--+-- === __Examples__+--+-- >>> extM (\x -> [x,x])(\x -> [not x, x]) True+-- [False,True]+--+-- >>> extM (\x -> [x,x])(\x -> [not x, x]) (5 :: Int)+-- [5,5]+--+-- @since 0.1.0.0 extM :: ( Monad m , Typeable a , Typeable b )- => (a -> m a) -> (b -> m b) -> a -> m a+ => (a -> m a)+ -- ^ The monadic transformation we want to extend+ -> (b -> m b)+ -- ^ The type-specific monadic transformation+ -> a+ -- ^ The argument we try to cast to type @b@+ -> m a extM def ext = unM ((M def) `ext0` (M ext)) --- | Extend a generic MonadPlus transformation by a type-specific case+-- | Extend a generic MonadPlus transformation by a type-specific case.+-- The function created by @extMp def ext@ behaves like 'MonadPlus' transformation @def@+-- if its argument cannot be cast to type @b@, and like the transformation @ext@ otherwise.+-- Note that 'extMp' behaves exactly like 'extM'.+-- The name 'extMp' is short for "extend MonadPlus transformation".+--+-- === __Examples__+--+-- >>> extMp (\x -> [x,x])(\x -> [not x, x]) True+-- [False,True]+--+-- >>> extMp (\x -> [x,x])(\x -> [not x, x]) (5 :: Int)+-- [5,5]+--+-- @since 0.1.0.0 extMp :: ( MonadPlus m , Typeable a , Typeable b )- => (a -> m a) -> (b -> m b) -> a -> m a+ => (a -> m a)+ -- ^ The 'MonadPlus' transformation we want to extend+ -> (b -> m b)+ -- ^ The type-specific 'MonadPlus' transformation+ -> a+ -- ^ The argument we try to cast to type @b@+ -> m a extMp = extM --- | Extend a generic builder+-- | Extend a generic builder by a type-specific case.+-- The builder created by @extB def ext@ returns @def@ if @ext@ cannot be cast+-- to type @a@, and like @ext@ otherwise.+-- The name 'extB' is short for "extend builder".+--+-- === __Examples__+--+-- >>> extB True 'a'+-- True+--+-- >>> extB True False+-- False+--+-- @since 0.1.0.0 extB :: ( Typeable a , Typeable b )- => a -> b -> a+ => a+ -- ^ The default result+ -> b+ -- ^ The argument we try to cast to type @a@+ -> a extB a = maybe a id . cast --- | Extend a generic reader+-- | Extend a generic reader by a type-specific case.+-- The reader created by @extR def ext@ behaves like the reader @def@+-- if expressions of type @b@ cannot be cast to type @a@, and like the+-- reader @ext@ otherwise.+-- The name 'extR' is short for "extend reader".+--+-- === __Examples__+--+-- >>> extR (Just True) (Just 'a')+-- Just True+--+-- >>> extR (Just True) (Just False)+-- Just False+--+-- @since 0.1.0.0 extR :: ( Monad m , Typeable a , Typeable b )- => m a -> m b -> m a+ => m a+ -- ^ The generic reader we want to extend+ -> m b+ -- ^ The type-specific reader+ -> m a extR def ext = unR ((R def) `ext0` (R ext)) ------------------------------------------------------------------------------ ----- Type synonyms for generic function types+-- Types for generic functions -- ------------------------------------------------------------------------------ @@ -223,30 +444,53 @@ -- | Generic transformations, -- i.e., take an \"a\" and return an \"a\" --+-- @since 0.1.0.0 type GenericT = forall a. Data a => a -> a +-- | The type synonym `GenericT` has a polymorphic type, and can therefore not+-- appear in places where monomorphic types are expected, for example in a list.+-- The newtype `GenericT'` wraps `GenericT` in a newtype to lift this restriction.+--+-- @since 0.1.0.0+newtype GenericT' = GT { unGT :: GenericT } -- | Generic queries of type \"r\", -- i.e., take any \"a\" and return an \"r\" --+-- @since 0.1.0.0 type GenericQ r = forall a. Data a => a -> r +-- | The type synonym `GenericQ` has a polymorphic type, and can therefore not+-- appear in places where monomorphic types are expected, for example in a list.+-- The newtype `GenericQ'` wraps `GenericQ` in a newtype to lift this restriction.+--+-- @since 0.1.0.0+newtype GenericQ' r = GQ { unGQ :: GenericQ r } -- | Generic monadic transformations, -- i.e., take an \"a\" and compute an \"a\" --+-- @since 0.1.0.0 type GenericM m = forall a. Data a => a -> m a +-- | The type synonym `GenericM` has a polymorphic type, and can therefore not+-- appear in places where monomorphic types are expected, for example in a list.+-- The newtype `GenericM'` wraps `GenericM` in a newtype to lift this restriction.+--+-- @since 0.1.0.0+newtype GenericM' m = GM { unGM :: GenericM m } -- | Generic builders -- i.e., produce an \"a\". --+-- @since 0.1.0.0 type GenericB = forall a. Data a => a -- | Generic readers, say monadic builders, -- i.e., produce an \"a\" with the help of a monad \"m\". --+-- @since 0.1.0.0 type GenericR m = forall a. Data a => m a @@ -254,28 +498,51 @@ -- assumed by gfoldl; there are isomorphisms such as -- GenericT = Generic T. --+-- @since 0.1.0.0 type Generic c = forall a. Data a => a -> c a --- | Wrapped generic functions;--- recall: [Generic c] would be legal but [Generic' c] not.+-- | The type synonym `Generic` has a polymorphic type, and can therefore not+-- appear in places where monomorphic types are expected, for example in a list.+-- The data type `Generic'` wraps `Generic` in a data type to lift this restriction. --+-- @since 0.1.0.0 data Generic' c = Generic' { unGeneric' :: Generic c } ---- | Other first-class polymorphic wrappers-newtype GenericT' = GT { unGT :: forall a. Data a => a -> a }-newtype GenericQ' r = GQ { unGQ :: GenericQ r }-newtype GenericM' m = GM { unGM :: forall a. Data a => a -> m a }-+------------------------------------------------------------------------------+--+-- Ingredients of generic functions+--+------------------------------------------------------------------------------ -- | Left-biased choice on maybes+--+-- === __Examples__+--+-- >>> orElse Nothing Nothing+-- Nothing+--+-- >>> orElse Nothing (Just 'a')+-- Just 'a'+--+-- >>> orElse (Just 'a') Nothing+-- Just 'a'+--+-- >>> orElse (Just 'a') (Just 'b')+-- Just 'a'+--+-- @since 0.1.0.0 orElse :: Maybe a -> Maybe a -> Maybe a x `orElse` y = case x of Just _ -> x Nothing -> y +------------------------------------------------------------------------------+--+-- Function combinators on generic functions+--+------------------------------------------------------------------------------ {- The following variations take "orElse" to the function@@ -289,21 +556,29 @@ -} -- | Choice for monadic transformations+--+-- @since 0.1.0.0 choiceMp :: MonadPlus m => GenericM m -> GenericM m -> GenericM m choiceMp f g x = f x `mplus` g x -- | Choice for monadic queries+--+-- @since 0.1.0.0 choiceQ :: MonadPlus m => GenericQ (m r) -> GenericQ (m r) -> GenericQ (m r) choiceQ f g x = f x `mplus` g x -- | Recover from the failure of monadic transformation by identity+--+-- @since 0.1.0.0 recoverMp :: MonadPlus m => GenericM m -> GenericM m recoverMp f = f `choiceMp` return -- | Recover from the failure of monadic query by a constant+--+-- @since 0.1.0.0 recoverQ :: MonadPlus m => r -> GenericQ (m r) -> GenericQ (m r) recoverQ r f = f `choiceQ` const (return r) @@ -319,6 +594,8 @@ #endif -- | Flexible type extension+--+-- @since 0.3 ext1 :: (Data a, Typeable1 t) => c a -> (forall d. Data d => c (t d))@@ -327,6 +604,8 @@ -- | Type extension of transformations for unary type constructors+--+-- @since 0.1.0.0 ext1T :: (Data d, Typeable1 t) => (forall e. Data e => e -> e) -> (forall f. Data f => t f -> t f)@@ -335,6 +614,8 @@ -- | Type extension of monadic transformations for type constructors+--+-- @since 0.1.0.0 ext1M :: (Monad m, Data d, Typeable1 t) => (forall e. Data e => e -> m e) -> (forall f. Data f => t f -> m (t f))@@ -343,6 +624,8 @@ -- | Type extension of queries for type constructors+--+-- @since 0.1.0.0 ext1Q :: (Data d, Typeable1 t) => (d -> q) -> (forall e. Data e => t e -> q)@@ -351,6 +634,8 @@ -- | Type extension of readers for type constructors+--+-- @since 0.1.0.0 ext1R :: (Monad m, Data d, Typeable1 t) => m d -> (forall e. Data e => m (t e))@@ -359,6 +644,8 @@ -- | Type extension of builders for type constructors+--+-- @since 0.2 ext1B :: (Data a, Typeable1 t) => a -> (forall b. Data b => (t b))@@ -378,6 +665,8 @@ -- | Type extension of transformations for unary type constructors+--+-- @since 0.3 ext2T :: (Data d, Typeable2 t) => (forall e. Data e => e -> e) -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> t d1 d2)@@ -386,6 +675,8 @@ -- | Type extension of monadic transformations for type constructors+--+-- @since 0.3 ext2M :: (Monad m, Data d, Typeable2 t) => (forall e. Data e => e -> m e) -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> m (t d1 d2))@@ -394,6 +685,8 @@ -- | Type extension of queries for type constructors+--+-- @since 0.3 ext2Q :: (Data d, Typeable2 t) => (d -> q) -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> q)@@ -402,6 +695,8 @@ -- | Type extension of readers for type constructors+--+-- @since 0.3 ext2R :: (Monad m, Data d, Typeable2 t) => m d -> (forall d1 d2. (Data d1, Data d2) => m (t d1 d2))@@ -410,6 +705,8 @@ -- | Type extension of builders for type constructors+--+-- @since 0.3 ext2B :: (Data a, Typeable2 t) => a -> (forall d1 d2. (Data d1, Data d2) => (t d1 d2))
src/Data/Generics/Builders.hs view
@@ -6,7 +6,7 @@ -- Module : Data.Generics.Builders -- Copyright : (c) 2008 Universiteit Utrecht -- License : BSD-style --- +-- -- Maintainer : generics@haskell.org -- Stability : experimental -- Portability : non-portable @@ -22,6 +22,8 @@ -- | Construct the empty value for a datatype. For algebraic datatypes, the -- leftmost constructor is chosen. +-- +-- @since 0.2 empty :: forall a. Data a => a empty = general `extB` char @@ -43,6 +45,8 @@ -- | Return a list of values of a datatype. Each value is one of the possible -- constructors of the datatype, populated with 'empty' values. +-- +-- @since 0.2 constrs :: forall a. Data a => [a] constrs = general `extB` char
src/Data/Generics/Schemes.hs view
@@ -48,7 +48,8 @@ import Control.Monad -- | Apply a transformation everywhere in bottom-up manner-+--+-- @since 0.1.0.0 everywhere :: (forall a. Data a => a -> a) -> (forall a. Data a => a -> a) @@ -62,6 +63,8 @@ go = f . gmapT go -- | Apply a transformation everywhere in top-down manner+--+-- @since 0.1.0.0 everywhere' :: (forall a. Data a => a -> a) -> (forall a. Data a => a -> a) @@ -73,6 +76,8 @@ -- | Variation on everywhere with an extra stop condition+--+-- @since 0.1.0.0 everywhereBut :: GenericQ Bool -> GenericT -> GenericT -- Guarded to let traversal cease if predicate q holds for x@@ -85,6 +90,8 @@ -- | Monadic variation on everywhere+--+-- @since 0.1.0.0 everywhereM :: forall m. Monad m => GenericM m -> GenericM m -- Bottom-up order is also reflected in order of do-actions@@ -97,6 +104,8 @@ -- | Apply a monadic transformation at least somewhere+--+-- @since 0.1.0.0 somewhere :: forall m. MonadPlus m => GenericM m -> GenericM m -- We try "f" in top-down manner, but descent into "x" when we fail@@ -110,6 +119,8 @@ -- | Summarise all nodes in top-down, left-to-right order+--+-- @since 0.1.0.0 everything :: forall r. (r -> r -> r) -> GenericQ r -> GenericQ r -- Apply f to x to summarise top-level node;@@ -122,6 +133,8 @@ go x = foldl k (f x) (gmapQ go x) -- | Variation of "everything" with an added stop condition+--+-- @since 0.3 everythingBut :: forall r. (r -> r -> r) -> GenericQ (r, Bool) -> GenericQ r everythingBut k f = go where@@ -133,6 +146,8 @@ -- | Summarise all nodes in top-down, left-to-right order, carrying some state -- down the tree during the computation, but not left-to-right to siblings.+--+-- @since 0.3.7 everythingWithContext :: forall s r. s -> (r -> r -> r) -> GenericQ (s -> (r, s)) -> GenericQ r everythingWithContext s0 f q = go s0 where@@ -141,11 +156,15 @@ where (r, s') = q x s -- | Get a list of all entities that meet a predicate+--+-- @since 0.1.0.0 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+--+-- @since 0.1.0.0 something :: GenericQ (Maybe u) -> GenericQ (Maybe u) -- "something" can be defined in terms of "everything"@@ -159,6 +178,7 @@ -- 2nd argument o is for reduction of results from subterms; -- 3rd argument f updates the synthesised data according to the given term --+-- @since 0.1.0.0 synthesize :: forall s t. s -> (t -> s -> s) -> GenericQ (s -> t) -> GenericQ t synthesize z o f = go where@@ -167,36 +187,50 @@ -- | Compute size of an arbitrary data structure+--+-- @since 0.1.0.0 gsize :: Data a => a -> Int gsize t = 1 + sum (gmapQ gsize t) -- | Count the number of immediate subterms of the given term+--+-- @since 0.1.0.0 glength :: GenericQ Int glength = length . gmapQ (const ()) -- | Determine depth of the given term+--+-- @since 0.1.0.0 gdepth :: GenericQ Int gdepth = (+) 1 . foldr max 0 . gmapQ gdepth -- | Determine the number of all suitable nodes in a given term+--+-- @since 0.1.0.0 gcount :: GenericQ Bool -> GenericQ Int gcount p = everything (+) (\x -> if p x then 1 else 0) -- | Determine the number of all nodes in a given term+--+-- @since 0.1.0.0 gnodecount :: GenericQ Int gnodecount = gcount (const True) -- | Determine the number of nodes of a given type in a given term+--+-- @since 0.1.0.0 gtypecount :: Typeable a => a -> GenericQ Int gtypecount (_::a) = gcount (False `mkQ` (\(_::a) -> True)) -- | Find (unambiguously) an immediate subterm of a given type+--+-- @since 0.1.0.0 gfindtype :: (Data x, Typeable y) => x -> Maybe y gfindtype = singleton . foldl unJust []
src/Data/Generics/Text.hs view
@@ -40,10 +40,14 @@ -- | Generic show: an alternative to \"deriving Show\"+--+-- @since 0.1.0.0 gshow :: Data a => a -> String gshow x = gshows x "" -- | Generic shows+--+-- @since 0.2 gshows :: Data a => a -> ShowS -- This is a prefix-show using surrounding "(" and ")",@@ -57,6 +61,8 @@ -- | Generic read: an alternative to \"deriving Read\"+--+-- @since 0.1.0.0 gread :: Data a => ReadS a {-
src/Data/Generics/Twins.hs view
@@ -82,7 +82,8 @@ --------------------------------------------------------------} -- | gfoldl with accumulation-+--+-- @since 0.1.0.0 gfoldlAccum :: Data d => (forall e r. Data e => a -> c (e -> r) -> e -> (a, c r)) -> (forall g. a -> g -> (a, c g))@@ -99,6 +100,8 @@ -- | gmapT with accumulation+--+-- @since 0.1.0.0 gmapAccumT :: Data d => (forall e. Data e => a -> e -> (a,e)) -> a -> d -> (a, d)@@ -111,6 +114,8 @@ -- | Applicative version+--+-- @since 0.2 gmapAccumA :: forall b d a. (Data d, Applicative a) => (forall e. Data e => b -> e -> (b, a e)) -> b -> d -> (b, a d)@@ -127,6 +132,8 @@ -- | gmapM with accumulation+--+-- @since 0.1.0.0 gmapAccumM :: (Data d, Monad m) => (forall e. Data e => a -> e -> (a, m e)) -> a -> d -> (a, m d)@@ -138,6 +145,8 @@ -- | gmapQl with accumulation+--+-- @since 0.1.0.0 gmapAccumQl :: Data d => (r -> r' -> r) -> r@@ -152,6 +161,8 @@ -- | gmapQr with accumulation+--+-- @since 0.1.0.0 gmapAccumQr :: Data d => (r' -> r -> r) -> r@@ -166,6 +177,8 @@ -- | gmapQ with accumulation+--+-- @since 0.1.0.0 gmapAccumQ :: Data d => (forall e. Data e => a -> e -> (a,q)) -> a -> d -> (a, [q])@@ -201,6 +214,8 @@ -- | Twin map for transformation+--+-- @since 0.1.0.0 gzipWithT :: GenericQ (GenericT) -> GenericQ (GenericT) gzipWithT f x y = case gmapAccumT perkid funs y of ([], c) -> c@@ -212,6 +227,8 @@ -- | Twin map for monadic transformation+--+-- @since 0.1.0.0 gzipWithM :: Monad m => GenericQ (GenericM m) -> GenericQ (GenericM m) gzipWithM f x y = case gmapAccumM perkid funs y of ([], c) -> c@@ -222,6 +239,8 @@ -- | Twin map for queries+--+-- @since 0.1.0.0 gzipWithQ :: GenericQ (GenericQ r) -> GenericQ (GenericQ [r]) gzipWithQ f x y = case gmapAccumQ perkid funs y of ([], r) -> r@@ -239,6 +258,8 @@ ------------------------------------------------------------------------------ -- | Generic equality: an alternative to \"deriving Eq\"+--+-- @since 0.1.0.0 geq :: Data a => a -> a -> Bool {-@@ -264,6 +285,8 @@ -- | Generic zip controlled by a function with type-specific branches+--+-- @since 0.1.0.0 gzip :: GenericQ (GenericM Maybe) -> GenericQ (GenericM Maybe) -- See testsuite/.../Generics/gzip.hs for an illustration gzip f = go@@ -277,6 +300,8 @@ else Nothing -- | Generic comparison: an alternative to \"deriving Ord\"+--+-- @since 0.5 gcompare :: Data a => a -> a -> Ordering gcompare = gcompare' where
syb.cabal view
@@ -1,10 +1,10 @@ name: syb-version: 0.7.2.3+version: 0.7.2.4 license: BSD3 license-file: LICENSE author: Ralf Lammel, Simon Peyton Jones, Jose Pedro Magalhaes maintainer: Sergey Vinokurov <serg.foo@gmail.com>-homepage: http://www.cs.uu.nl/wiki/GenericProgramming/SYB+homepage: https://github.com/dreixel/syb bug-reports: https://github.com/dreixel/syb/issues synopsis: Scrap Your Boilerplate description: