module Data.Generics.Uniplate
where
import Control.Monad
import Data.Generics.Uniplate.Internal.Utils
type UniplateType on = on -> ([on], [on] -> on)
class Uniplate on where
uniplate :: UniplateType on
universe :: Uniplate on => on -> [on]
universe :: forall on. Uniplate on => on -> [on]
universe on
x = forall a. (forall b. (a -> b -> b) -> b -> b) -> [a]
builder (forall on res.
Uniplate on =>
on -> (on -> res -> res) -> res -> res
f on
x)
where
f :: Uniplate on => on -> (on -> res -> res) -> res -> res
f :: forall on res.
Uniplate on =>
on -> (on -> res -> res) -> res -> res
f on
x on -> res -> res
cons res
nil = on
x on -> res -> res
`cons` forall a. [a -> a] -> a -> a
concatCont (forall a b. (a -> b) -> [a] -> [b]
map (\on
x -> forall on res.
Uniplate on =>
on -> (on -> res -> res) -> res -> res
f on
x on -> res -> res
cons) forall a b. (a -> b) -> a -> b
$ forall on. Uniplate on => on -> [on]
children on
x) res
nil
children :: Uniplate on => on -> [on]
children :: forall on. Uniplate on => on -> [on]
children = forall a b. (a, b) -> a
fst forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall on. Uniplate on => UniplateType on
uniplate
transform :: Uniplate on => (on -> on) -> on -> on
transform :: forall on. Uniplate on => (on -> on) -> on -> on
transform on -> on
f on
x = on -> on
f forall a b. (a -> b) -> a -> b
$ [on] -> on
generate forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall on. Uniplate on => (on -> on) -> on -> on
transform on -> on
f) [on]
current
where ([on]
current, [on] -> on
generate) = forall on. Uniplate on => UniplateType on
uniplate on
x
transformM :: (Monad m, Uniplate on) => (on -> m on) -> on -> m on
transformM :: forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m on) -> on -> m on
transformM on -> m on
f on
x = forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM (forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m on) -> on -> m on
transformM on -> m on
f) [on]
current forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= on -> m on
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. [on] -> on
generate
where ([on]
current, [on] -> on
generate) = forall on. Uniplate on => UniplateType on
uniplate on
x
rewrite :: Uniplate on => (on -> Maybe on) -> on -> on
rewrite :: forall on. Uniplate on => (on -> Maybe on) -> on -> on
rewrite on -> Maybe on
f = forall on. Uniplate on => (on -> on) -> on -> on
transform on -> on
g
where g :: on -> on
g on
x = forall b a. b -> (a -> b) -> Maybe a -> b
maybe on
x (forall on. Uniplate on => (on -> Maybe on) -> on -> on
rewrite on -> Maybe on
f) (on -> Maybe on
f on
x)
rewriteM :: (Monad m, Uniplate on) => (on -> m (Maybe on)) -> on -> m on
rewriteM :: forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m (Maybe on)) -> on -> m on
rewriteM on -> m (Maybe on)
f = forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m on) -> on -> m on
transformM on -> m on
g
where g :: on -> m on
g on
x = on -> m (Maybe on)
f on
x forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall b a. b -> (a -> b) -> Maybe a -> b
maybe (forall (m :: * -> *) a. Monad m => a -> m a
return on
x) (forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m (Maybe on)) -> on -> m on
rewriteM on -> m (Maybe on)
f)
descend :: Uniplate on => (on -> on) -> on -> on
descend :: forall on. Uniplate on => (on -> on) -> on -> on
descend on -> on
f on
x = [on] -> on
generate forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map on -> on
f [on]
current
where ([on]
current, [on] -> on
generate) = forall on. Uniplate on => UniplateType on
uniplate on
x
descendM :: (Monad m, Uniplate on) => (on -> m on) -> on -> m on
descendM :: forall (m :: * -> *) on.
(Monad m, Uniplate on) =>
(on -> m on) -> on -> m on
descendM on -> m on
f on
x = forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM [on] -> on
generate forall a b. (a -> b) -> a -> b
$ forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM on -> m on
f [on]
current
where ([on]
current, [on] -> on
generate) = forall on. Uniplate on => UniplateType on
uniplate on
x
contexts :: Uniplate on => on -> [(on, on -> on)]
contexts :: forall on. Uniplate on => on -> [(on, on -> on)]
contexts on
x = (on
x,forall a. a -> a
id) forall a. a -> [a] -> [a]
: forall {b} {c}. Uniplate b => [(b, b -> c)] -> [(b, b -> c)]
f (forall on. Uniplate on => on -> [(on, on -> on)]
holes on
x)
where
f :: [(b, b -> c)] -> [(b, b -> c)]
f [(b, b -> c)]
xs = [ (b
y, b -> c
ctx forall b c a. (b -> c) -> (a -> b) -> a -> c
. b -> b
context)
| (b
child, b -> c
ctx) <- [(b, b -> c)]
xs
, (b
y, b -> b
context) <- forall on. Uniplate on => on -> [(on, on -> on)]
contexts b
child]
holes :: Uniplate on => on -> [(on, on -> on)]
holes :: forall on. Uniplate on => on -> [(on, on -> on)]
holes on
x = forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall {a} {c}. [a] -> ([a] -> c) -> [(a, a -> c)]
f (forall on. Uniplate on => UniplateType on
uniplate on
x)
where f :: [a] -> ([a] -> c) -> [(a, a -> c)]
f [] [a] -> c
_ = []
f (a
x:[a]
xs) [a] -> c
gen = (a
x, [a] -> c
gen forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall a. a -> [a] -> [a]
:[a]
xs)) forall a. a -> [a] -> [a]
:
[a] -> ([a] -> c) -> [(a, a -> c)]
f [a]
xs ([a] -> c
gen forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a
xforall a. a -> [a] -> [a]
:))
para :: Uniplate on => (on -> [r] -> r) -> on -> r
para :: forall on r. Uniplate on => (on -> [r] -> r) -> on -> r
para on -> [r] -> r
op on
x = on -> [r] -> r
op on
x forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map (forall on r. Uniplate on => (on -> [r] -> r) -> on -> r
para on -> [r] -> r
op) forall a b. (a -> b) -> a -> b
$ forall on. Uniplate on => on -> [on]
children on
x