{-# LANGUAGE DeriveAnyClass #-} {-# LANGUAGE DeriveFoldable #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE DeriveTraversable #-} {-# LANGUAGE TypeFamilies #-} module Package.C.Type.Tree ( DepTree (..) , DepTreeF (..) , asBldDep ) where import Control.Recursion import GHC.Generics (Generic) data DepTree p = DepNode p Bool [DepTree p] | BldDepNode p [DepTree p] deriving ((forall a b. (a -> b) -> DepTree a -> DepTree b) -> (forall a b. a -> DepTree b -> DepTree a) -> Functor DepTree forall a b. a -> DepTree b -> DepTree a forall a b. (a -> b) -> DepTree a -> DepTree b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f $cfmap :: forall a b. (a -> b) -> DepTree a -> DepTree b fmap :: forall a b. (a -> b) -> DepTree a -> DepTree b $c<$ :: forall a b. a -> DepTree b -> DepTree a <$ :: forall a b. a -> DepTree b -> DepTree a Functor, (forall m. Monoid m => DepTree m -> m) -> (forall m a. Monoid m => (a -> m) -> DepTree a -> m) -> (forall m a. Monoid m => (a -> m) -> DepTree a -> m) -> (forall a b. (a -> b -> b) -> b -> DepTree a -> b) -> (forall a b. (a -> b -> b) -> b -> DepTree a -> b) -> (forall b a. (b -> a -> b) -> b -> DepTree a -> b) -> (forall b a. (b -> a -> b) -> b -> DepTree a -> b) -> (forall a. (a -> a -> a) -> DepTree a -> a) -> (forall a. (a -> a -> a) -> DepTree a -> a) -> (forall a. DepTree a -> [a]) -> (forall a. DepTree a -> Bool) -> (forall a. DepTree a -> Int) -> (forall a. Eq a => a -> DepTree a -> Bool) -> (forall a. Ord a => DepTree a -> a) -> (forall a. Ord a => DepTree a -> a) -> (forall a. Num a => DepTree a -> a) -> (forall a. Num a => DepTree a -> a) -> Foldable DepTree forall a. Eq a => a -> DepTree a -> Bool forall a. Num a => DepTree a -> a forall a. Ord a => DepTree a -> a forall m. Monoid m => DepTree m -> m forall a. DepTree a -> Bool forall a. DepTree a -> Int forall a. DepTree a -> [a] forall a. (a -> a -> a) -> DepTree a -> a forall m a. Monoid m => (a -> m) -> DepTree a -> m forall b a. (b -> a -> b) -> b -> DepTree a -> b forall a b. (a -> b -> b) -> b -> DepTree a -> b forall (t :: * -> *). (forall m. Monoid m => t m -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. t a -> [a]) -> (forall a. t a -> Bool) -> (forall a. t a -> Int) -> (forall a. Eq a => a -> t a -> Bool) -> (forall a. Ord a => t a -> a) -> (forall a. Ord a => t a -> a) -> (forall a. Num a => t a -> a) -> (forall a. Num a => t a -> a) -> Foldable t $cfold :: forall m. Monoid m => DepTree m -> m fold :: forall m. Monoid m => DepTree m -> m $cfoldMap :: forall m a. Monoid m => (a -> m) -> DepTree a -> m foldMap :: forall m a. Monoid m => (a -> m) -> DepTree a -> m $cfoldMap' :: forall m a. Monoid m => (a -> m) -> DepTree a -> m foldMap' :: forall m a. Monoid m => (a -> m) -> DepTree a -> m $cfoldr :: forall a b. (a -> b -> b) -> b -> DepTree a -> b foldr :: forall a b. (a -> b -> b) -> b -> DepTree a -> b $cfoldr' :: forall a b. (a -> b -> b) -> b -> DepTree a -> b foldr' :: forall a b. (a -> b -> b) -> b -> DepTree a -> b $cfoldl :: forall b a. (b -> a -> b) -> b -> DepTree a -> b foldl :: forall b a. (b -> a -> b) -> b -> DepTree a -> b $cfoldl' :: forall b a. (b -> a -> b) -> b -> DepTree a -> b foldl' :: forall b a. (b -> a -> b) -> b -> DepTree a -> b $cfoldr1 :: forall a. (a -> a -> a) -> DepTree a -> a foldr1 :: forall a. (a -> a -> a) -> DepTree a -> a $cfoldl1 :: forall a. (a -> a -> a) -> DepTree a -> a foldl1 :: forall a. (a -> a -> a) -> DepTree a -> a $ctoList :: forall a. DepTree a -> [a] toList :: forall a. DepTree a -> [a] $cnull :: forall a. DepTree a -> Bool null :: forall a. DepTree a -> Bool $clength :: forall a. DepTree a -> Int length :: forall a. DepTree a -> Int $celem :: forall a. Eq a => a -> DepTree a -> Bool elem :: forall a. Eq a => a -> DepTree a -> Bool $cmaximum :: forall a. Ord a => DepTree a -> a maximum :: forall a. Ord a => DepTree a -> a $cminimum :: forall a. Ord a => DepTree a -> a minimum :: forall a. Ord a => DepTree a -> a $csum :: forall a. Num a => DepTree a -> a sum :: forall a. Num a => DepTree a -> a $cproduct :: forall a. Num a => DepTree a -> a product :: forall a. Num a => DepTree a -> a Foldable, Functor DepTree Foldable DepTree (Functor DepTree, Foldable DepTree) => (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTree a -> f (DepTree b)) -> (forall (f :: * -> *) a. Applicative f => DepTree (f a) -> f (DepTree a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTree a -> m (DepTree b)) -> (forall (m :: * -> *) a. Monad m => DepTree (m a) -> m (DepTree a)) -> Traversable DepTree forall (t :: * -> *). (Functor t, Foldable t) => (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> t a -> f (t b)) -> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> t a -> m (t b)) -> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a)) -> Traversable t forall (m :: * -> *) a. Monad m => DepTree (m a) -> m (DepTree a) forall (f :: * -> *) a. Applicative f => DepTree (f a) -> f (DepTree a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTree a -> m (DepTree b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTree a -> f (DepTree b) $ctraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTree a -> f (DepTree b) traverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTree a -> f (DepTree b) $csequenceA :: forall (f :: * -> *) a. Applicative f => DepTree (f a) -> f (DepTree a) sequenceA :: forall (f :: * -> *) a. Applicative f => DepTree (f a) -> f (DepTree a) $cmapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTree a -> m (DepTree b) mapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTree a -> m (DepTree b) $csequence :: forall (m :: * -> *) a. Monad m => DepTree (m a) -> m (DepTree a) sequence :: forall (m :: * -> *) a. Monad m => DepTree (m a) -> m (DepTree a) Traversable, (forall x. DepTree p -> Rep (DepTree p) x) -> (forall x. Rep (DepTree p) x -> DepTree p) -> Generic (DepTree p) forall x. Rep (DepTree p) x -> DepTree p forall x. DepTree p -> Rep (DepTree p) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall p x. Rep (DepTree p) x -> DepTree p forall p x. DepTree p -> Rep (DepTree p) x $cfrom :: forall p x. DepTree p -> Rep (DepTree p) x from :: forall x. DepTree p -> Rep (DepTree p) x $cto :: forall p x. Rep (DepTree p) x -> DepTree p to :: forall x. Rep (DepTree p) x -> DepTree p Generic, Functor (Base (DepTree p)) Functor (Base (DepTree p)) => (DepTree p -> Base (DepTree p) (DepTree p)) -> Recursive (DepTree p) DepTree p -> Base (DepTree p) (DepTree p) forall p. Functor (Base (DepTree p)) forall t. Functor (Base t) => (t -> Base t t) -> Recursive t forall p. DepTree p -> Base (DepTree p) (DepTree p) $cproject :: forall p. DepTree p -> Base (DepTree p) (DepTree p) project :: DepTree p -> Base (DepTree p) (DepTree p) Recursive) data DepTreeF p x = DepNodeF { forall p x. DepTreeF p x -> p self :: p, forall p x. DepTreeF p x -> Bool man :: Bool, forall p x. DepTreeF p x -> [x] deps :: [x] } | BldDepNodeF { self :: p, deps :: [x] } deriving ((forall a b. (a -> b) -> DepTreeF p a -> DepTreeF p b) -> (forall a b. a -> DepTreeF p b -> DepTreeF p a) -> Functor (DepTreeF p) forall a b. a -> DepTreeF p b -> DepTreeF p a forall a b. (a -> b) -> DepTreeF p a -> DepTreeF p b forall p a b. a -> DepTreeF p b -> DepTreeF p a forall p a b. (a -> b) -> DepTreeF p a -> DepTreeF p b forall (f :: * -> *). (forall a b. (a -> b) -> f a -> f b) -> (forall a b. a -> f b -> f a) -> Functor f $cfmap :: forall p a b. (a -> b) -> DepTreeF p a -> DepTreeF p b fmap :: forall a b. (a -> b) -> DepTreeF p a -> DepTreeF p b $c<$ :: forall p a b. a -> DepTreeF p b -> DepTreeF p a <$ :: forall a b. a -> DepTreeF p b -> DepTreeF p a Functor, (forall m. Monoid m => DepTreeF p m -> m) -> (forall m a. Monoid m => (a -> m) -> DepTreeF p a -> m) -> (forall m a. Monoid m => (a -> m) -> DepTreeF p a -> m) -> (forall a b. (a -> b -> b) -> b -> DepTreeF p a -> b) -> (forall a b. (a -> b -> b) -> b -> DepTreeF p a -> b) -> (forall b a. (b -> a -> b) -> b -> DepTreeF p a -> b) -> (forall b a. (b -> a -> b) -> b -> DepTreeF p a -> b) -> (forall a. (a -> a -> a) -> DepTreeF p a -> a) -> (forall a. (a -> a -> a) -> DepTreeF p a -> a) -> (forall a. DepTreeF p a -> [a]) -> (forall a. DepTreeF p a -> Bool) -> (forall a. DepTreeF p a -> Int) -> (forall a. Eq a => a -> DepTreeF p a -> Bool) -> (forall a. Ord a => DepTreeF p a -> a) -> (forall a. Ord a => DepTreeF p a -> a) -> (forall a. Num a => DepTreeF p a -> a) -> (forall a. Num a => DepTreeF p a -> a) -> Foldable (DepTreeF p) forall a. Eq a => a -> DepTreeF p a -> Bool forall a. Num a => DepTreeF p a -> a forall a. Ord a => DepTreeF p a -> a forall m. Monoid m => DepTreeF p m -> m forall a. DepTreeF p a -> Bool forall a. DepTreeF p a -> Int forall a. DepTreeF p a -> [a] forall a. (a -> a -> a) -> DepTreeF p a -> a forall p a. Eq a => a -> DepTreeF p a -> Bool forall p a. Num a => DepTreeF p a -> a forall p a. Ord a => DepTreeF p a -> a forall m a. Monoid m => (a -> m) -> DepTreeF p a -> m forall p m. Monoid m => DepTreeF p m -> m forall p x. DepTreeF p x -> Bool forall p a. DepTreeF p a -> Int forall p x. DepTreeF p x -> [x] forall b a. (b -> a -> b) -> b -> DepTreeF p a -> b forall a b. (a -> b -> b) -> b -> DepTreeF p a -> b forall p a. (a -> a -> a) -> DepTreeF p a -> a forall p m a. Monoid m => (a -> m) -> DepTreeF p a -> m forall p b a. (b -> a -> b) -> b -> DepTreeF p a -> b forall p a b. (a -> b -> b) -> b -> DepTreeF p a -> b forall (t :: * -> *). (forall m. Monoid m => t m -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall m a. Monoid m => (a -> m) -> t a -> m) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall a b. (a -> b -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall b a. (b -> a -> b) -> b -> t a -> b) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. (a -> a -> a) -> t a -> a) -> (forall a. t a -> [a]) -> (forall a. t a -> Bool) -> (forall a. t a -> Int) -> (forall a. Eq a => a -> t a -> Bool) -> (forall a. Ord a => t a -> a) -> (forall a. Ord a => t a -> a) -> (forall a. Num a => t a -> a) -> (forall a. Num a => t a -> a) -> Foldable t $cfold :: forall p m. Monoid m => DepTreeF p m -> m fold :: forall m. Monoid m => DepTreeF p m -> m $cfoldMap :: forall p m a. Monoid m => (a -> m) -> DepTreeF p a -> m foldMap :: forall m a. Monoid m => (a -> m) -> DepTreeF p a -> m $cfoldMap' :: forall p m a. Monoid m => (a -> m) -> DepTreeF p a -> m foldMap' :: forall m a. Monoid m => (a -> m) -> DepTreeF p a -> m $cfoldr :: forall p a b. (a -> b -> b) -> b -> DepTreeF p a -> b foldr :: forall a b. (a -> b -> b) -> b -> DepTreeF p a -> b $cfoldr' :: forall p a b. (a -> b -> b) -> b -> DepTreeF p a -> b foldr' :: forall a b. (a -> b -> b) -> b -> DepTreeF p a -> b $cfoldl :: forall p b a. (b -> a -> b) -> b -> DepTreeF p a -> b foldl :: forall b a. (b -> a -> b) -> b -> DepTreeF p a -> b $cfoldl' :: forall p b a. (b -> a -> b) -> b -> DepTreeF p a -> b foldl' :: forall b a. (b -> a -> b) -> b -> DepTreeF p a -> b $cfoldr1 :: forall p a. (a -> a -> a) -> DepTreeF p a -> a foldr1 :: forall a. (a -> a -> a) -> DepTreeF p a -> a $cfoldl1 :: forall p a. (a -> a -> a) -> DepTreeF p a -> a foldl1 :: forall a. (a -> a -> a) -> DepTreeF p a -> a $ctoList :: forall p x. DepTreeF p x -> [x] toList :: forall a. DepTreeF p a -> [a] $cnull :: forall p x. DepTreeF p x -> Bool null :: forall a. DepTreeF p a -> Bool $clength :: forall p a. DepTreeF p a -> Int length :: forall a. DepTreeF p a -> Int $celem :: forall p a. Eq a => a -> DepTreeF p a -> Bool elem :: forall a. Eq a => a -> DepTreeF p a -> Bool $cmaximum :: forall p a. Ord a => DepTreeF p a -> a maximum :: forall a. Ord a => DepTreeF p a -> a $cminimum :: forall p a. Ord a => DepTreeF p a -> a minimum :: forall a. Ord a => DepTreeF p a -> a $csum :: forall p a. Num a => DepTreeF p a -> a sum :: forall a. Num a => DepTreeF p a -> a $cproduct :: forall p a. Num a => DepTreeF p a -> a product :: forall a. Num a => DepTreeF p a -> a Foldable, Functor (DepTreeF p) Foldable (DepTreeF p) (Functor (DepTreeF p), Foldable (DepTreeF p)) => (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTreeF p a -> f (DepTreeF p b)) -> (forall (f :: * -> *) a. Applicative f => DepTreeF p (f a) -> f (DepTreeF p a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTreeF p a -> m (DepTreeF p b)) -> (forall (m :: * -> *) a. Monad m => DepTreeF p (m a) -> m (DepTreeF p a)) -> Traversable (DepTreeF p) forall p. Functor (DepTreeF p) forall p. Foldable (DepTreeF p) forall p (m :: * -> *) a. Monad m => DepTreeF p (m a) -> m (DepTreeF p a) forall p (f :: * -> *) a. Applicative f => DepTreeF p (f a) -> f (DepTreeF p a) forall p (m :: * -> *) a b. Monad m => (a -> m b) -> DepTreeF p a -> m (DepTreeF p b) forall p (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTreeF p a -> f (DepTreeF p b) forall (t :: * -> *). (Functor t, Foldable t) => (forall (f :: * -> *) a b. Applicative f => (a -> f b) -> t a -> f (t b)) -> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a)) -> (forall (m :: * -> *) a b. Monad m => (a -> m b) -> t a -> m (t b)) -> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a)) -> Traversable t forall (m :: * -> *) a. Monad m => DepTreeF p (m a) -> m (DepTreeF p a) forall (f :: * -> *) a. Applicative f => DepTreeF p (f a) -> f (DepTreeF p a) forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTreeF p a -> m (DepTreeF p b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTreeF p a -> f (DepTreeF p b) $ctraverse :: forall p (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTreeF p a -> f (DepTreeF p b) traverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> DepTreeF p a -> f (DepTreeF p b) $csequenceA :: forall p (f :: * -> *) a. Applicative f => DepTreeF p (f a) -> f (DepTreeF p a) sequenceA :: forall (f :: * -> *) a. Applicative f => DepTreeF p (f a) -> f (DepTreeF p a) $cmapM :: forall p (m :: * -> *) a b. Monad m => (a -> m b) -> DepTreeF p a -> m (DepTreeF p b) mapM :: forall (m :: * -> *) a b. Monad m => (a -> m b) -> DepTreeF p a -> m (DepTreeF p b) $csequence :: forall p (m :: * -> *) a. Monad m => DepTreeF p (m a) -> m (DepTreeF p a) sequence :: forall (m :: * -> *) a. Monad m => DepTreeF p (m a) -> m (DepTreeF p a) Traversable, (forall x. DepTreeF p x -> Rep (DepTreeF p x) x) -> (forall x. Rep (DepTreeF p x) x -> DepTreeF p x) -> Generic (DepTreeF p x) forall x. Rep (DepTreeF p x) x -> DepTreeF p x forall x. DepTreeF p x -> Rep (DepTreeF p x) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall p x x. Rep (DepTreeF p x) x -> DepTreeF p x forall p x x. DepTreeF p x -> Rep (DepTreeF p x) x $cfrom :: forall p x x. DepTreeF p x -> Rep (DepTreeF p x) x from :: forall x. DepTreeF p x -> Rep (DepTreeF p x) x $cto :: forall p x x. Rep (DepTreeF p x) x -> DepTreeF p x to :: forall x. Rep (DepTreeF p x) x -> DepTreeF p x Generic) type instance Base (DepTree a) = DepTreeF a asBldDep :: DepTree p -> DepTree p asBldDep :: forall p. DepTree p -> DepTree p asBldDep (DepNode p p Bool _ [DepTree p] ps) = p -> [DepTree p] -> DepTree p forall p. p -> [DepTree p] -> DepTree p BldDepNode p p ((DepTree p -> DepTree p) -> [DepTree p] -> [DepTree p] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap DepTree p -> DepTree p forall p. DepTree p -> DepTree p asBldDep [DepTree p] ps) asBldDep (BldDepNode p p [DepTree p] ps) = p -> [DepTree p] -> DepTree p forall p. p -> [DepTree p] -> DepTree p BldDepNode p p ((DepTree p -> DepTree p) -> [DepTree p] -> [DepTree p] forall a b. (a -> b) -> [a] -> [b] forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap DepTree p -> DepTree p forall p. DepTree p -> DepTree p asBldDep [DepTree p] ps)