{-# LANGUAGE RankNTypes, ScopedTypeVariables, CPP #-}
module Data.Generics.Schemes (
everywhere,
everywhere',
everywhereBut,
everywhereM,
somewhere,
everything,
everythingBut,
everythingWithContext,
listify,
something,
synthesize,
gsize,
glength,
gdepth,
gcount,
gnodecount,
gtypecount,
gfindtype
) where
#ifdef __HADDOCK__
import Prelude
#endif
import Data.Data
import Data.Generics.Aliases
import Control.Monad
everywhere :: (forall a. Data a => a -> a)
-> (forall a. Data a => a -> a)
everywhere :: (forall a. Data a => a -> a) -> forall a. Data a => a -> a
everywhere forall a. Data a => a -> a
f = a -> a
forall a. Data a => a -> a
go
where
go :: forall a. Data a => a -> a
go :: a -> a
go = a -> a
forall a. Data a => a -> a
f (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. Data a => a -> a) -> a -> a
forall a. Data a => (forall a. Data a => a -> a) -> a -> a
gmapT forall a. Data a => a -> a
go
everywhere' :: (forall a. Data a => a -> a)
-> (forall a. Data a => a -> a)
everywhere' :: (forall a. Data a => a -> a) -> forall a. Data a => a -> a
everywhere' forall a. Data a => a -> a
f = a -> a
forall a. Data a => a -> a
go
where
go :: forall a. Data a => a -> a
go :: a -> a
go = (forall a. Data a => a -> a) -> a -> a
forall a. Data a => (forall a. Data a => a -> a) -> a -> a
gmapT forall a. Data a => a -> a
go (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
forall a. Data a => a -> a
f
everywhereBut :: GenericQ Bool -> GenericT -> GenericT
everywhereBut :: GenericQ Bool
-> (forall a. Data a => a -> a) -> forall a. Data a => a -> a
everywhereBut GenericQ Bool
q forall a. Data a => a -> a
f = a -> a
forall a. Data a => a -> a
go
where
go :: GenericT
go :: a -> a
go a
x
| a -> Bool
GenericQ Bool
q a
x = a
x
| Bool
otherwise = a -> a
forall a. Data a => a -> a
f ((forall a. Data a => a -> a) -> a -> a
forall a. Data a => (forall a. Data a => a -> a) -> a -> a
gmapT forall a. Data a => a -> a
go a
x)
everywhereM :: forall m. Monad m => GenericM m -> GenericM m
everywhereM :: GenericM m -> GenericM m
everywhereM GenericM m
f = a -> m a
GenericM m
go
where
go :: GenericM m
go :: a -> m a
go a
x = do
a
x' <- GenericM m -> a -> m a
forall a (m :: * -> *).
(Data a, Monad m) =>
(forall d. Data d => d -> m d) -> a -> m a
gmapM GenericM m
go a
x
a -> m a
GenericM m
f a
x'
somewhere :: forall m. MonadPlus m => GenericM m -> GenericM m
somewhere :: GenericM m -> GenericM m
somewhere GenericM m
f = a -> m a
GenericM m
go
where
go :: GenericM m
go :: a -> m a
go a
x = a -> m a
GenericM m
f a
x m a -> m a -> m a
forall (m :: * -> *) a. MonadPlus m => m a -> m a -> m a
`mplus` GenericM m -> a -> m a
forall a (m :: * -> *).
(Data a, MonadPlus m) =>
(forall d. Data d => d -> m d) -> a -> m a
gmapMp GenericM m
go a
x
everything :: forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything :: (r -> r -> r) -> GenericQ r -> GenericQ r
everything r -> r -> r
k GenericQ r
f = a -> r
GenericQ r
go
where
go :: GenericQ r
go :: a -> r
go a
x = (r -> r -> r) -> r -> [r] -> r
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl r -> r -> r
k (a -> r
GenericQ r
f a
x) (GenericQ r -> a -> [r]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ GenericQ r
go a
x)
everythingBut :: forall r. (r -> r -> r) -> GenericQ (r, Bool) -> GenericQ r
everythingBut :: (r -> r -> r) -> GenericQ (r, Bool) -> GenericQ r
everythingBut r -> r -> r
k GenericQ (r, Bool)
f = a -> r
GenericQ r
go
where
go :: GenericQ r
go :: a -> r
go a
x = let (r
v, Bool
stop) = a -> (r, Bool)
GenericQ (r, Bool)
f a
x
in if Bool
stop
then r
v
else (r -> r -> r) -> r -> [r] -> r
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl r -> r -> r
k r
v (GenericQ r -> a -> [r]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ GenericQ r
go a
x)
everythingWithContext :: forall s r. s -> (r -> r -> r) -> GenericQ (s -> (r, s)) -> GenericQ r
everythingWithContext :: s -> (r -> r -> r) -> GenericQ (s -> (r, s)) -> GenericQ r
everythingWithContext s
s0 r -> r -> r
f GenericQ (s -> (r, s))
q = s -> GenericQ r
go s
s0
where
go :: s -> GenericQ r
go :: s -> GenericQ r
go s
s a
x = (r -> r -> r) -> r -> [r] -> r
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl r -> r -> r
f r
r (GenericQ r -> a -> [r]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ (s -> GenericQ r
go s
s') a
x)
where (r
r, s
s') = a -> s -> (r, s)
GenericQ (s -> (r, s))
q a
x s
s
listify :: Typeable r => (r -> Bool) -> GenericQ [r]
listify :: (r -> Bool) -> GenericQ [r]
listify r -> Bool
p = ([r] -> [r] -> [r]) -> GenericQ [r] -> GenericQ [r]
forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything [r] -> [r] -> [r]
forall a. [a] -> [a] -> [a]
(++) ([] [r] -> (r -> [r]) -> a -> [r]
forall a b r. (Typeable a, Typeable b) => r -> (b -> r) -> a -> r
`mkQ` (\r
x -> if r -> Bool
p r
x then [r
x] else []))
something :: GenericQ (Maybe u) -> GenericQ (Maybe u)
something :: GenericQ (Maybe u) -> GenericQ (Maybe u)
something = (Maybe u -> Maybe u -> Maybe u)
-> GenericQ (Maybe u) -> GenericQ (Maybe u)
forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything Maybe u -> Maybe u -> Maybe u
forall a. Maybe a -> Maybe a -> Maybe a
orElse
synthesize :: forall s t. s -> (t -> s -> s) -> GenericQ (s -> t) -> GenericQ t
synthesize :: s -> (t -> s -> s) -> GenericQ (s -> t) -> GenericQ t
synthesize s
z t -> s -> s
o GenericQ (s -> t)
f = a -> t
GenericQ t
go
where
go :: GenericQ t
go :: a -> t
go a
x = a -> s -> t
GenericQ (s -> t)
f a
x ((t -> s -> s) -> s -> [t] -> s
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr t -> s -> s
o s
z (GenericQ t -> a -> [t]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ GenericQ t
go a
x))
gsize :: Data a => a -> Int
gsize :: a -> Int
gsize a
t = Int
1 Int -> Int -> Int
forall a. Num a => a -> a -> a
+ [Int] -> Int
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum ((forall d. Data d => d -> Int) -> a -> [Int]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall d. Data d => d -> Int
gsize a
t)
glength :: GenericQ Int
glength :: a -> Int
glength = [()] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length ([()] -> Int) -> (a -> [()]) -> a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall d. Data d => d -> ()) -> a -> [()]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ (() -> d -> ()
forall a b. a -> b -> a
const ())
gdepth :: GenericQ Int
gdepth :: a -> Int
gdepth = Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) Int
1 (Int -> Int) -> (a -> Int) -> a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int) -> Int -> [Int] -> Int
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
0 ([Int] -> Int) -> (a -> [Int]) -> a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall d. Data d => d -> Int) -> a -> [Int]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ forall d. Data d => d -> Int
gdepth
gcount :: GenericQ Bool -> GenericQ Int
gcount :: GenericQ Bool -> forall d. Data d => d -> Int
gcount GenericQ Bool
p = (Int -> Int -> Int)
-> (forall d. Data d => d -> Int) -> forall d. Data d => d -> Int
forall r. (r -> r -> r) -> GenericQ r -> GenericQ r
everything Int -> Int -> Int
forall a. Num a => a -> a -> a
(+) (\a
x -> if a -> Bool
GenericQ Bool
p a
x then Int
1 else Int
0)
gnodecount :: GenericQ Int
gnodecount :: a -> Int
gnodecount = GenericQ Bool -> forall d. Data d => d -> Int
gcount (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
gtypecount :: Typeable a => a -> GenericQ Int
gtypecount :: a -> forall d. Data d => d -> Int
gtypecount (a
_::a) = GenericQ Bool -> forall d. Data d => d -> Int
gcount (Bool
False Bool -> (a -> Bool) -> a -> Bool
forall a b r. (Typeable a, Typeable b) => r -> (b -> r) -> a -> r
`mkQ` (\(a
_::a) -> Bool
True))
gfindtype :: (Data x, Typeable y) => x -> Maybe y
gfindtype :: x -> Maybe y
gfindtype = [y] -> Maybe y
forall a. [a] -> Maybe a
singleton
([y] -> Maybe y) -> (x -> [y]) -> x -> Maybe y
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([y] -> Maybe y -> [y]) -> [y] -> [Maybe y] -> [y]
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl [y] -> Maybe y -> [y]
forall a. [a] -> Maybe a -> [a]
unJust []
([Maybe y] -> [y]) -> (x -> [Maybe y]) -> x -> [y]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall d. Data d => d -> Maybe y) -> x -> [Maybe y]
forall a u. Data a => (forall d. Data d => d -> u) -> a -> [u]
gmapQ (Maybe y
forall a. Maybe a
Nothing Maybe y -> (y -> Maybe y) -> d -> Maybe y
forall a b r. (Typeable a, Typeable b) => r -> (b -> r) -> a -> r
`mkQ` y -> Maybe y
forall a. a -> Maybe a
Just)
where
unJust :: [a] -> Maybe a -> [a]
unJust [a]
l (Just a
x) = a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:[a]
l
unJust [a]
l Maybe a
Nothing = [a]
l
singleton :: [a] -> Maybe a
singleton [a
s] = a -> Maybe a
forall a. a -> Maybe a
Just a
s
singleton [a]
_ = Maybe a
forall a. Maybe a
Nothing