{-# LANGUAGE FunctionalDependencies #-}

module Language.Hasmtlib.Internal.Uniplate1 where

import Data.Functor.Identity
import Data.Some.Constraint
import Data.Kind

type Uniplate1 :: (k -> Type) -> [k -> Constraint] -> Constraint
class Uniplate1 f cs | f -> cs where
  uniplate1 :: (Applicative m, AllC cs b) => (forall a. AllC cs a => f a -> m (f a)) -> f b -> m (f b)

transformM1 :: (Monad m, Uniplate1 f cs, AllC cs b) => (forall a. AllC cs a => f a -> m (f a)) -> f b -> m (f b)
transformM1 :: forall {k} (m :: * -> *) (f :: k -> *) (cs :: [k -> Constraint])
       (b :: k).
(Monad m, Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
transformM1 forall (a :: k). AllC cs a => f a -> m (f a)
f f b
x = (forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
forall k (f :: k -> *) (cs :: [k -> Constraint]) (m :: * -> *)
       (b :: k).
(Uniplate1 f cs, Applicative m, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
forall (m :: * -> *) (b :: k).
(Applicative m, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
uniplate1 ((forall (a :: k). AllC cs a => f a -> m (f a)) -> f a -> m (f a)
forall {k} (m :: * -> *) (f :: k -> *) (cs :: [k -> Constraint])
       (b :: k).
(Monad m, Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
transformM1 f a -> m (f a)
forall (a :: k). AllC cs a => f a -> m (f a)
f) f b
x m (f b) -> (f b -> m (f b)) -> m (f b)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= f b -> m (f b)
forall (a :: k). AllC cs a => f a -> m (f a)
f

transform1 :: (Uniplate1 f cs, AllC cs b) => (forall a. AllC cs a => f a -> f a) -> f b -> f b
transform1 :: forall {k} (f :: k -> *) (cs :: [k -> Constraint]) (b :: k).
(Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> f a) -> f b -> f b
transform1 forall (a :: k). AllC cs a => f a -> f a
f = Identity (f b) -> f b
forall a. Identity a -> a
runIdentity (Identity (f b) -> f b) -> (f b -> Identity (f b)) -> f b -> f b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall (a :: k). AllC cs a => f a -> Identity (f a))
-> f b -> Identity (f b)
forall {k} (m :: * -> *) (f :: k -> *) (cs :: [k -> Constraint])
       (b :: k).
(Monad m, Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
transformM1 (f a -> Identity (f a)
forall a. a -> Identity a
Identity (f a -> Identity (f a)) -> (f a -> f a) -> f a -> Identity (f a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. f a -> f a
forall (a :: k). AllC cs a => f a -> f a
f)
{-# INLINE transform1 #-}

lazyParaM1 :: (Monad m, Uniplate1 f cs, AllC cs b) => (forall a. AllC cs a => f a -> m (f a) -> m (f a)) -> f b -> m (f b)
lazyParaM1 :: forall {k} (m :: * -> *) (f :: k -> *) (cs :: [k -> Constraint])
       (b :: k).
(Monad m, Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a))
-> f b -> m (f b)
lazyParaM1 forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a)
f f b
x = f b -> m (f b) -> m (f b)
forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a)
f f b
x ((forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
forall k (f :: k -> *) (cs :: [k -> Constraint]) (m :: * -> *)
       (b :: k).
(Uniplate1 f cs, Applicative m, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
forall (m :: * -> *) (b :: k).
(Applicative m, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a)) -> f b -> m (f b)
uniplate1 ((forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a))
-> f a -> m (f a)
forall {k} (m :: * -> *) (f :: k -> *) (cs :: [k -> Constraint])
       (b :: k).
(Monad m, Uniplate1 f cs, AllC cs b) =>
(forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a))
-> f b -> m (f b)
lazyParaM1 f a -> m (f a) -> m (f a)
forall (a :: k). AllC cs a => f a -> m (f a) -> m (f a)
f) f b
x)