{-# LANGUAGE BangPatterns #-}{-# LANGUAGE PatternGuards #-}{-# LANGUAGE CPP #-} #if __GLASGOW_HASKELL__ {-# LANGUAGE DeriveDataTypeable #-}{-# LANGUAGE DeriveGeneric #-}{-# LANGUAGE DeriveLift #-}{-# LANGUAGE Trustworthy #-} #endif #include "containers.h" ------------------------------------------------------------------------------- |-- Module : Data.Tree-- Copyright : (c) The University of Glasgow 2002-- License : BSD-style (see the file libraries/base/LICENSE)---- Maintainer : libraries@haskell.org-- Portability : portable---- = Multi-way Trees and Forests---- The @'Tree' a@ type represents a lazy, possibly infinite, multi-way tree-- (also known as a /rose tree/).---- The @'Forest' a@ type represents a forest of @'Tree' a@s.-------------------------------------------------------------------------------moduleData.Tree(-- * Trees and ForestsTree (..),Forest ,PostOrder (..)-- * Construction,unfoldTree ,unfoldForest ,unfoldTreeM ,unfoldForestM ,unfoldTreeM_BF ,unfoldForestM_BF -- * Elimination,foldTree ,flatten ,levels ,leaves ,edges ,pathsToRoot ,pathsFromRoot -- * Ascii Drawings,drawTree ,drawForest )whereimportUtils.Containers.Internal.Prelude asPreludeimportPrelude()importData.Bits((.&.))importData.Foldable(toList)importqualifiedData.FoldableasFoldableimportData.List.NonEmpty(NonEmpty(..))importData.Traversable(foldMapDefault)importControl.Monad(liftM)importControl.Monad.Fix(MonadFix(..),fix)importData.Sequence (Seq ,empty ,singleton ,(<|) ,(|>) ,fromList ,ViewL (..),ViewR (..),viewl ,viewr )importControl.DeepSeq(NFData(rnf),NFData1(liftRnf)) #ifdef __GLASGOW_HASKELL__ importData.Data(Data)importGHC.Generics(Generic,Generic1)importqualifiedGHC.ExtsimportLanguage.Haskell.TH.Syntax(Lift)-- See Note [ Template Haskell Dependencies ]importLanguage.Haskell.TH() #endif importControl.Monad.Zip(MonadZip(..)) #ifdef __GLASGOW_HASKELL__ importData.Coerce(coerce) #endif importData.Functor.Classes #if !MIN_VERSION_base(4,11,0) importData.Semigroup(Semigroup(..)) #endif #if MIN_VERSION_base(4,18,0) importqualifiedData.Foldable1asFoldable1 #endif -- | Non-empty, possibly infinite, multi-way trees; also known as /rose trees/.dataTree a =Node {forall a. Tree a -> a rootLabel ::a ,-- ^ label valueforall a. Tree a -> [Tree a] subForest ::[Tree a ]-- ^ zero or more child trees} #ifdef __GLASGOW_HASKELL__ deriving(Tree a -> Tree a -> Bool (Tree a -> Tree a -> Bool) -> (Tree a -> Tree a -> Bool) -> Eq (Tree a) forall a. Eq a => Tree a -> Tree a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => Tree a -> Tree a -> Bool == :: Tree a -> Tree a -> Bool $c/= :: forall a. Eq a => Tree a -> Tree a -> Bool /= :: Tree a -> Tree a -> Bool Eq,Eq (Tree a) Eq (Tree a) => (Tree a -> Tree a -> Ordering) -> (Tree a -> Tree a -> Bool) -> (Tree a -> Tree a -> Bool) -> (Tree a -> Tree a -> Bool) -> (Tree a -> Tree a -> Bool) -> (Tree a -> Tree a -> Tree a) -> (Tree a -> Tree a -> Tree a) -> Ord (Tree a) Tree a -> Tree a -> Bool Tree a -> Tree a -> Ordering Tree a -> Tree a -> Tree a forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall a. Ord a => Eq (Tree a) forall a. Ord a => Tree a -> Tree a -> Bool forall a. Ord a => Tree a -> Tree a -> Ordering forall a. Ord a => Tree a -> Tree a -> Tree a $ccompare :: forall a. Ord a => Tree a -> Tree a -> Ordering compare :: Tree a -> Tree a -> Ordering $c< :: forall a. Ord a => Tree a -> Tree a -> Bool < :: Tree a -> Tree a -> Bool $c<= :: forall a. Ord a => Tree a -> Tree a -> Bool <= :: Tree a -> Tree a -> Bool $c> :: forall a. Ord a => Tree a -> Tree a -> Bool > :: Tree a -> Tree a -> Bool $c>= :: forall a. Ord a => Tree a -> Tree a -> Bool >= :: Tree a -> Tree a -> Bool $cmax :: forall a. Ord a => Tree a -> Tree a -> Tree a max :: Tree a -> Tree a -> Tree a $cmin :: forall a. Ord a => Tree a -> Tree a -> Tree a min :: Tree a -> Tree a -> Tree a Ord-- ^ @since 0.6.5,ReadPrec [Tree a] ReadPrec (Tree a) Int -> ReadS (Tree a) ReadS [Tree a] (Int -> ReadS (Tree a)) -> ReadS [Tree a] -> ReadPrec (Tree a) -> ReadPrec [Tree a] -> Read (Tree a) forall a. Read a => ReadPrec [Tree a] forall a. Read a => ReadPrec (Tree a) forall a. Read a => Int -> ReadS (Tree a) forall a. Read a => ReadS [Tree a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (Tree a) readsPrec :: Int -> ReadS (Tree a) $creadList :: forall a. Read a => ReadS [Tree a] readList :: ReadS [Tree a] $creadPrec :: forall a. Read a => ReadPrec (Tree a) readPrec :: ReadPrec (Tree a) $creadListPrec :: forall a. Read a => ReadPrec [Tree a] readListPrec :: ReadPrec [Tree a] Read,Int -> Tree a -> ShowS [Tree a] -> ShowS Tree a -> String (Int -> Tree a -> ShowS) -> (Tree a -> String) -> ([Tree a] -> ShowS) -> Show (Tree a) forall a. Show a => Int -> Tree a -> ShowS forall a. Show a => [Tree a] -> ShowS forall a. Show a => Tree a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> Tree a -> ShowS showsPrec :: Int -> Tree a -> ShowS $cshow :: forall a. Show a => Tree a -> String show :: Tree a -> String $cshowList :: forall a. Show a => [Tree a] -> ShowS showList :: [Tree a] -> ShowS Show,Typeable (Tree a) Typeable (Tree a) => (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Tree a -> c (Tree a)) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tree a)) -> (Tree a -> Constr) -> (Tree a -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Tree a))) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tree a))) -> ((forall b. Data b => b -> b) -> Tree a -> Tree a) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r) -> (forall u. (forall d. Data d => d -> u) -> Tree a -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> Tree a -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a)) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a)) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a)) -> Data (Tree a) Tree a -> Constr Tree a -> DataType (forall b. Data b => b -> b) -> Tree a -> Tree a forall a. Data a => Typeable (Tree a) forall a. Data a => Tree a -> Constr forall a. Data a => Tree a -> DataType forall a. Data a => (forall b. Data b => b -> b) -> Tree a -> Tree a forall a u. Data a => Int -> (forall d. Data d => d -> u) -> Tree a -> u forall a u. Data a => (forall d. Data d => d -> u) -> Tree a -> [u] forall a r r'. Data a => (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r forall a r r'. Data a => (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r forall a (m :: * -> *). (Data a, Monad m) => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) forall a (c :: * -> *). Data a => (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tree a) forall a (c :: * -> *). Data a => (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Tree a -> c (Tree a) forall a (t :: * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d. Data d => c (t d)) -> Maybe (c (Tree a)) forall a (t :: * -> * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tree a)) forall a. Typeable a => (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> a -> c a) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c a) -> (a -> Constr) -> (a -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c a)) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)) -> ((forall b. Data b => b -> b) -> a -> a) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall u. (forall d. Data d => d -> u) -> a -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> Data a forall u. Int -> (forall d. Data d => d -> u) -> Tree a -> u forall u. (forall d. Data d => d -> u) -> Tree a -> [u] forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tree a) forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Tree a -> c (Tree a) forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Tree a)) forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tree a)) $cgfoldl :: forall a (c :: * -> *). Data a => (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Tree a -> c (Tree a) gfoldl :: forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Tree a -> c (Tree a) $cgunfold :: forall a (c :: * -> *). Data a => (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tree a) gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Tree a) $ctoConstr :: forall a. Data a => Tree a -> Constr toConstr :: Tree a -> Constr $cdataTypeOf :: forall a. Data a => Tree a -> DataType dataTypeOf :: Tree a -> DataType $cdataCast1 :: forall a (t :: * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d. Data d => c (t d)) -> Maybe (c (Tree a)) dataCast1 :: forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Tree a)) $cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tree a)) dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Tree a)) $cgmapT :: forall a. Data a => (forall b. Data b => b -> b) -> Tree a -> Tree a gmapT :: (forall b. Data b => b -> b) -> Tree a -> Tree a $cgmapQl :: forall a r r'. Data a => (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r gmapQl :: forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r $cgmapQr :: forall a r r'. Data a => (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Tree a -> r $cgmapQ :: forall a u. Data a => (forall d. Data d => d -> u) -> Tree a -> [u] gmapQ :: forall u. (forall d. Data d => d -> u) -> Tree a -> [u] $cgmapQi :: forall a u. Data a => Int -> (forall d. Data d => d -> u) -> Tree a -> u gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> Tree a -> u $cgmapM :: forall a (m :: * -> *). (Data a, Monad m) => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) gmapM :: forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) $cgmapMp :: forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) gmapMp :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) $cgmapMo :: forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) gmapMo :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> Tree a -> m (Tree a) Data,(forall x. Tree a -> Rep (Tree a) x) -> (forall x. Rep (Tree a) x -> Tree a) -> Generic (Tree a) forall x. Rep (Tree a) x -> Tree a forall x. Tree a -> Rep (Tree a) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall a x. Rep (Tree a) x -> Tree a forall a x. Tree a -> Rep (Tree a) x $cfrom :: forall a x. Tree a -> Rep (Tree a) x from :: forall x. Tree a -> Rep (Tree a) x $cto :: forall a x. Rep (Tree a) x -> Tree a to :: forall x. Rep (Tree a) x -> Tree a Generic-- ^ @since 0.5.8,(forall a. Tree a -> Rep1 Tree a) -> (forall a. Rep1 Tree a -> Tree a) -> Generic1 Tree forall a. Rep1 Tree a -> Tree a forall a. Tree a -> Rep1 Tree a forall k (f :: k -> *). (forall (a :: k). f a -> Rep1 f a) -> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f $cfrom1 :: forall a. Tree a -> Rep1 Tree a from1 :: forall a. Tree a -> Rep1 Tree a $cto1 :: forall a. Rep1 Tree a -> Tree a to1 :: forall a. Rep1 Tree a -> Tree a Generic1-- ^ @since 0.5.8,(forall (m :: * -> *). Quote m => Tree a -> m Exp) -> (forall (m :: * -> *). Quote m => Tree a -> Code m (Tree a)) -> Lift (Tree a) forall a (m :: * -> *). (Lift a, Quote m) => Tree a -> m Exp forall a (m :: * -> *). (Lift a, Quote m) => Tree a -> Code m (Tree a) forall t. (forall (m :: * -> *). Quote m => t -> m Exp) -> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t forall (m :: * -> *). Quote m => Tree a -> m Exp forall (m :: * -> *). Quote m => Tree a -> Code m (Tree a) $clift :: forall a (m :: * -> *). (Lift a, Quote m) => Tree a -> m Exp lift :: forall (m :: * -> *). Quote m => Tree a -> m Exp $cliftTyped :: forall a (m :: * -> *). (Lift a, Quote m) => Tree a -> Code m (Tree a) liftTyped :: forall (m :: * -> *). Quote m => Tree a -> Code m (Tree a) Lift-- ^ @since 0.6.6) #else deriving(Eq,Ord,Read,Show) #endif -- | This type synonym exists primarily for historical-- reasons.typeForest a =[Tree a ]-- | @since 0.5.9instanceEq1Tree whereliftEq :: forall a b. (a -> b -> Bool) -> Tree a -> Tree b -> Bool liftEq a -> b -> Bool eq =Tree a -> Tree b -> Bool leq whereleq :: Tree a -> Tree b -> Bool leq (Node a a [Tree a] fr )(Node b a' [Tree b] fr' )=a -> b -> Bool eq a a b a' Bool -> Bool -> Bool &&(Tree a -> Tree b -> Bool) -> [Tree a] -> [Tree b] -> Bool forall a b. (a -> b -> Bool) -> [a] -> [b] -> Bool forall (f :: * -> *) a b. Eq1 f => (a -> b -> Bool) -> f a -> f b -> Bool liftEqTree a -> Tree b -> Bool leq [Tree a] fr [Tree b] fr' -- | @since 0.5.9instanceOrd1Tree whereliftCompare :: forall a b. (a -> b -> Ordering) -> Tree a -> Tree b -> Ordering liftCompare a -> b -> Ordering cmp =Tree a -> Tree b -> Ordering lcomp wherelcomp :: Tree a -> Tree b -> Ordering lcomp (Node a a [Tree a] fr )(Node b a' [Tree b] fr' )=a -> b -> Ordering cmp a a b a' Ordering -> Ordering -> Ordering forall a. Semigroup a => a -> a -> a <>(Tree a -> Tree b -> Ordering) -> [Tree a] -> [Tree b] -> Ordering forall a b. (a -> b -> Ordering) -> [a] -> [b] -> Ordering forall (f :: * -> *) a b. Ord1 f => (a -> b -> Ordering) -> f a -> f b -> Ordering liftCompareTree a -> Tree b -> Ordering lcomp [Tree a] fr [Tree b] fr' -- | @since 0.5.9instanceShow1Tree whereliftShowsPrec :: forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> Tree a -> ShowS liftShowsPrec Int -> a -> ShowS shw [a] -> ShowS shwl Int p (Node a a [Tree a] fr )=Bool -> ShowS -> ShowS showParen(Int p Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >Int 10)(ShowS -> ShowS) -> ShowS -> ShowS forall a b. (a -> b) -> a -> b $String -> ShowS showStringString "Node {rootLabel = "ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c .Int -> a -> ShowS shw Int 0a a ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> ShowS showStringString ", "ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> ShowS showStringString "subForest = "ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c .(Int -> a -> ShowS) -> ([a] -> ShowS) -> [Tree a] -> ShowS forall a. (Int -> a -> ShowS) -> ([a] -> ShowS) -> [Tree a] -> ShowS forall (f :: * -> *) a. Show1 f => (Int -> a -> ShowS) -> ([a] -> ShowS) -> [f a] -> ShowS liftShowListInt -> a -> ShowS shw [a] -> ShowS shwl [Tree a] fr ShowS -> ShowS -> ShowS forall b c a. (b -> c) -> (a -> b) -> a -> c .String -> ShowS showStringString "}"-- | @since 0.5.9instanceRead1Tree whereliftReadsPrec :: forall a. (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (Tree a) liftReadsPrec Int -> ReadS a rd ReadS [a] rdl Int p =Bool -> ReadS (Tree a) -> ReadS (Tree a) forall a. Bool -> ReadS a -> ReadS a readParen(Int p Int -> Int -> Bool forall a. Ord a => a -> a -> Bool >Int 10)(ReadS (Tree a) -> ReadS (Tree a)) -> ReadS (Tree a) -> ReadS (Tree a) forall a b. (a -> b) -> a -> b $\String s ->do(String "Node",String s1 )<-ReadS String lexString s (String "{",String s2 )<-ReadS String lexString s1 (String "rootLabel",String s3 )<-ReadS String lexString s2 (String "=",String s4 )<-ReadS String lexString s3 (a a ,String s5 )<-Int -> ReadS a rd Int 0String s4 (String ",",String s6 )<-ReadS String lexString s5 (String "subForest",String s7 )<-ReadS String lexString s6 (String "=",String s8 )<-ReadS String lexString s7 ([Tree a] fr ,String s9 )<-(Int -> ReadS a) -> ReadS [a] -> ReadS [Tree a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadS [Tree a] forall (f :: * -> *) a. Read1 f => (Int -> ReadS a) -> ReadS [a] -> ReadS [f a] liftReadListInt -> ReadS a rd ReadS [a] rdl String s8 (String "}",String s10 )<-ReadS String lexString s9 (Tree a, String) -> [(Tree a, String)] forall a. a -> [a] forall (f :: * -> *) a. Applicative f => a -> f a pure(a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a a [Tree a] fr ,String s10 )instanceFunctorTree wherefmap :: forall a b. (a -> b) -> Tree a -> Tree b fmap=(a -> b) -> Tree a -> Tree b forall a b. (a -> b) -> Tree a -> Tree b fmapTree a x <$ :: forall a b. a -> Tree b -> Tree a <$ Node b _[Tree b] ts =a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a x ((Tree b -> Tree a) -> [Tree b] -> [Tree a] forall a b. (a -> b) -> [a] -> [b] map(a x a -> Tree b -> Tree a forall a b. a -> Tree b -> Tree a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$)[Tree b] ts )fmapTree ::(a ->b )->Tree a ->Tree b fmapTree :: forall a b. (a -> b) -> Tree a -> Tree b fmapTree a -> b f (Node a x [Tree a] ts )=b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node (a -> b f a x )((Tree a -> Tree b) -> [Tree a] -> [Tree b] forall a b. (a -> b) -> [a] -> [b] map((a -> b) -> Tree a -> Tree b forall a b. (a -> b) -> Tree a -> Tree b fmapTree a -> b f )[Tree a] ts ) #ifdef __GLASGOW_HASKELL__ {-# NOINLINE[1]fmapTree #-}{-# RULES"fmapTree/coerce"fmapTree coerce=coerce#-} #endif instanceApplicativeTree wherepure :: forall a. a -> Tree a purea x =a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a x []Node a -> b f [Tree (a -> b)] tfs <*> :: forall a b. Tree (a -> b) -> Tree a -> Tree b <*>tx :: Tree a tx @(Node a x [Tree a] txs )=b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node (a -> b f a x )((Tree a -> Tree b) -> [Tree a] -> [Tree b] forall a b. (a -> b) -> [a] -> [b] map(a -> b f (a -> b) -> Tree a -> Tree b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>)[Tree a] txs [Tree b] -> [Tree b] -> [Tree b] forall a. [a] -> [a] -> [a] ++(Tree (a -> b) -> Tree b) -> [Tree (a -> b)] -> [Tree b] forall a b. (a -> b) -> [a] -> [b] map(Tree (a -> b) -> Tree a -> Tree b forall a b. Tree (a -> b) -> Tree a -> Tree b forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b <*>Tree a tx )[Tree (a -> b)] tfs )liftA2 :: forall a b c. (a -> b -> c) -> Tree a -> Tree b -> Tree c liftA2 a -> b -> c f (Node a x [Tree a] txs )ty :: Tree b ty @(Node b y [Tree b] tys )=c -> [Tree c] -> Tree c forall a. a -> [Tree a] -> Tree a Node (a -> b -> c f a x b y )((Tree b -> Tree c) -> [Tree b] -> [Tree c] forall a b. (a -> b) -> [a] -> [b] map(a -> b -> c f a x (b -> c) -> Tree b -> Tree c forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>)[Tree b] tys [Tree c] -> [Tree c] -> [Tree c] forall a. [a] -> [a] -> [a] ++(Tree a -> Tree c) -> [Tree a] -> [Tree c] forall a b. (a -> b) -> [a] -> [b] map(\Tree a tx ->(a -> b -> c) -> Tree a -> Tree b -> Tree c forall a b c. (a -> b -> c) -> Tree a -> Tree b -> Tree c forall (f :: * -> *) a b c. Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2a -> b -> c f Tree a tx Tree b ty )[Tree a] txs )Node a x [Tree a] txs <* :: forall a b. Tree a -> Tree b -> Tree a <* ty :: Tree b ty @(Node b _[Tree b] tys )=a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a x ((Tree b -> Tree a) -> [Tree b] -> [Tree a] forall a b. (a -> b) -> [a] -> [b] map(a x a -> Tree b -> Tree a forall a b. a -> Tree b -> Tree a forall (f :: * -> *) a b. Functor f => a -> f b -> f a <$)[Tree b] tys [Tree a] -> [Tree a] -> [Tree a] forall a. [a] -> [a] -> [a] ++(Tree a -> Tree a) -> [Tree a] -> [Tree a] forall a b. (a -> b) -> [a] -> [b] map(Tree a -> Tree b -> Tree a forall a b. Tree a -> Tree b -> Tree a forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a <*Tree b ty )[Tree a] txs )Node a _[Tree a] txs *> :: forall a b. Tree a -> Tree b -> Tree b *>ty :: Tree b ty @(Node b y [Tree b] tys )=b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node b y ([Tree b] tys [Tree b] -> [Tree b] -> [Tree b] forall a. [a] -> [a] -> [a] ++(Tree a -> Tree b) -> [Tree a] -> [Tree b] forall a b. (a -> b) -> [a] -> [b] map(Tree a -> Tree b -> Tree b forall a b. Tree a -> Tree b -> Tree b forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b *>Tree b ty )[Tree a] txs )instanceMonadTree whereNode a x [Tree a] ts >>= :: forall a b. Tree a -> (a -> Tree b) -> Tree b >>=a -> Tree b f =casea -> Tree b f a x ofNode b x' [Tree b] ts' ->b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node b x' ([Tree b] ts' [Tree b] -> [Tree b] -> [Tree b] forall a. [a] -> [a] -> [a] ++(Tree a -> Tree b) -> [Tree a] -> [Tree b] forall a b. (a -> b) -> [a] -> [b] map(Tree a -> (a -> Tree b) -> Tree b forall a b. Tree a -> (a -> Tree b) -> Tree b forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>=a -> Tree b f )[Tree a] ts )-- | @since 0.5.11instanceMonadFixTree wheremfix :: forall a. (a -> Tree a) -> Tree a mfix=(a -> Tree a) -> Tree a forall a. (a -> Tree a) -> Tree a mfixTree mfixTree ::(a ->Tree a )->Tree a mfixTree :: forall a. (a -> Tree a) -> Tree a mfixTree a -> Tree a f |Node a a [Tree a] children <-(Tree a -> Tree a) -> Tree a forall a. (a -> a) -> a fix(a -> Tree a f (a -> Tree a) -> (Tree a -> a) -> Tree a -> Tree a forall b c a. (b -> c) -> (a -> b) -> a -> c .Tree a -> a forall a. Tree a -> a rootLabel )=a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a a ((Int -> Tree a -> Tree a) -> [Int] -> [Tree a] -> [Tree a] forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] zipWith(\Int i Tree a _->(a -> Tree a) -> Tree a forall a. (a -> Tree a) -> Tree a mfixTree (([Tree a] -> Int -> Tree a forall a. HasCallStack => [a] -> Int -> a !!Int i )([Tree a] -> Tree a) -> (a -> [Tree a]) -> a -> Tree a forall b c a. (b -> c) -> (a -> b) -> a -> c .Tree a -> [Tree a] forall a. Tree a -> [Tree a] subForest (Tree a -> [Tree a]) -> (a -> Tree a) -> a -> [Tree a] forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> Tree a f ))[Int 0..][Tree a] children )-- | Traverses in pre-order.instanceTraversableTree wheretraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> Tree a -> f (Tree b) traverse a -> f b f =Tree a -> f (Tree b) go wherego :: Tree a -> f (Tree b) go (Node a x [Tree a] ts )=(b -> [Tree b] -> Tree b) -> f b -> f [Tree b] -> f (Tree b) forall a b c. (a -> b -> c) -> f a -> f b -> f c forall (f :: * -> *) a b c. Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node (a -> f b f a x )((Tree a -> f (Tree b)) -> [Tree a] -> f [Tree b] forall (t :: * -> *) (f :: * -> *) a b. (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> [a] -> f [b] traverseTree a -> f (Tree b) go [Tree a] ts ){-# INLINEtraverse#-}-- | Folds in pre-order.-- See Note [Implemented Foldable Tree functions]instanceFoldableTree wherefold :: forall m. Monoid m => Tree m -> m fold =(m -> m) -> Tree m -> m forall m a. Monoid m => (a -> m) -> Tree a -> m forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMapm -> m forall a. a -> a id{-# INLINABLEfold#-}foldMap :: forall m a. Monoid m => (a -> m) -> Tree a -> m foldMap=(a -> m) -> Tree a -> m forall (t :: * -> *) m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m foldMapDefault{-# INLINEfoldMap#-}foldr :: forall a b. (a -> b -> b) -> b -> Tree a -> b foldr a -> b -> b f b z =\Tree a t ->Tree a -> b -> b go Tree a t b z -- Use a lambda to allow inlining with two argumentswherego :: Tree a -> b -> b go (Node a x [Tree a] ts )=a -> b -> b f a x (b -> b) -> (b -> b) -> b -> b forall b c a. (b -> c) -> (a -> b) -> a -> c .(Tree a -> (b -> b) -> b -> b) -> (b -> b) -> [Tree a] -> b -> b forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr(\Tree a t b -> b k ->Tree a -> b -> b go Tree a t (b -> b) -> (b -> b) -> b -> b forall b c a. (b -> c) -> (a -> b) -> a -> c .b -> b k )b -> b forall a. a -> a id[Tree a] ts -- This is equivalent to the following simpler definition, but has been found to optimize-- better in benchmarks:-- go (Node x ts) z' = f x (foldr go z' ts){-# INLINEfoldr#-}foldl' :: forall b a. (b -> a -> b) -> b -> Tree a -> b foldl' b -> a -> b f =b -> Tree a -> b go wherego :: b -> Tree a -> b go !b z (Node a x [Tree a] ts )=(b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'b -> Tree a -> b go (b -> a -> b f b z a x )[Tree a] ts {-# INLINEfoldl'#-}foldr1 :: forall a. (a -> a -> a) -> Tree a -> a foldr1 =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (a -> b -> b) -> Tree a -> b foldrMap1 a -> a forall a. a -> a idfoldl1 :: forall a. (a -> a -> a) -> Tree a -> a foldl1 =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1 a -> a forall a. a -> a idnull :: forall a. Tree a -> Bool null Tree a _=Bool False{-# INLINEnull#-}elem :: forall a. Eq a => a -> Tree a -> Bool elem =(a -> Bool) -> Tree a -> Bool forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool any((a -> Bool) -> Tree a -> Bool) -> (a -> a -> Bool) -> a -> Tree a -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> a -> Bool forall a. Eq a => a -> a -> Bool (==){-# INLINABLEelem#-}maximum :: forall a. Ord a => Tree a -> a maximum =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> a forall a. a -> a ida -> a -> a forall a. Ord a => a -> a -> a max{-# INLINABLEmaximum#-}minimum :: forall a. Ord a => Tree a -> a minimum =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> a forall a. a -> a ida -> a -> a forall a. Ord a => a -> a -> a min{-# INLINABLEminimum#-}sum :: forall a. Num a => Tree a -> a sum =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> a forall a. a -> a ida -> a -> a forall a. Num a => a -> a -> a (+){-# INLINABLEsum#-}product :: forall a. Num a => Tree a -> a product =(a -> a) -> (a -> a -> a) -> Tree a -> a forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> a forall a. a -> a ida -> a -> a forall a. Num a => a -> a -> a (*){-# INLINABLEproduct#-} #if MIN_VERSION_base(4,18,0) -- | Folds in pre-order.---- @since 0.6.7-- See Note [Implemented Foldable1 Tree functions]instanceFoldable1.Foldable1Tree wherefoldMap1 :: forall m a. Semigroup m => (a -> m) -> Tree a -> m foldMap1 a -> m f =Tree a -> m go where-- We'd like to write---- go (Node x (t : ts)) = f x <> Foldable1.foldMap1 go (t :| ts)---- but foldMap1 for NonEmpty isn't very good, so we don't. See-- https://github.com/haskell/containers/pull/921#issuecomment-1410398618go :: Tree a -> m go (Node a x [])=a -> m f a x go (Node a x (Tree a t :[Tree a] ts ))=a -> m f a x m -> m -> m forall a. Semigroup a => a -> a -> a <>(Tree a -> m) -> (Tree a -> m -> m) -> NonEmpty (Tree a) -> m forall a b. (a -> b) -> (a -> b -> b) -> NonEmpty a -> b forall (t :: * -> *) a b. Foldable1 t => (a -> b) -> (a -> b -> b) -> t a -> b Foldable1.foldrMap1Tree a -> m go (\Tree a t' m z ->Tree a -> m go Tree a t' m -> m -> m forall a. Semigroup a => a -> a -> a <>m z )(Tree a t Tree a -> [Tree a] -> NonEmpty (Tree a) forall a. a -> [a] -> NonEmpty a :|[Tree a] ts ){-# INLINEfoldMap1#-}foldMap1' :: forall m a. Semigroup m => (a -> m) -> Tree a -> m foldMap1' a -> m f =(a -> m) -> (m -> a -> m) -> Tree a -> m forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> m f (\m z a x ->m z m -> m -> m forall a. Semigroup a => a -> a -> a <>a -> m f a x ){-# INLINEfoldMap1'#-}toNonEmpty :: forall a. Tree a -> NonEmpty a toNonEmpty (Node a x [Tree a] ts )=a x a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|(Tree a -> [a]) -> [Tree a] -> [a] forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b] concatMapTree a -> [a] forall a. Tree a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] toList[Tree a] ts maximum :: forall a. Ord a => Tree a -> a maximum =Tree a -> a forall a. Ord a => Tree a -> a forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a Foldable.maximum{-# INLINABLEmaximum#-}minimum :: forall a. Ord a => Tree a -> a minimum =Tree a -> a forall a. Ord a => Tree a -> a forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a Foldable.minimum{-# INLINABLEminimum#-}foldrMap1 :: forall a b. (a -> b) -> (a -> b -> b) -> Tree a -> b foldrMap1=(a -> b) -> (a -> b -> b) -> Tree a -> b forall a b. (a -> b) -> (a -> b -> b) -> Tree a -> b foldrMap1 foldlMap1' :: forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' =(a -> b) -> (b -> a -> b) -> Tree a -> b forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' foldlMap1 :: forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1 =(a -> b) -> (b -> a -> b) -> Tree a -> b forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1 #endif foldrMap1 ::(a ->b )->(a ->b ->b )->Tree a ->b foldrMap1 :: forall a b. (a -> b) -> (a -> b -> b) -> Tree a -> b foldrMap1 a -> b f a -> b -> b g =Tree a -> b go wherego :: Tree a -> b go (Node a x [])=a -> b f a x go (Node a x (Tree a t :[Tree a] ts ))=a -> b -> b g a x ((Tree a -> b) -> (Tree a -> b -> b) -> Tree a -> [Tree a] -> b forall a b. (a -> b) -> (a -> b -> b) -> a -> [a] -> b foldrMap1NE Tree a -> b go (\Tree a t' b z ->(a -> b -> b) -> b -> Tree a -> b forall a b. (a -> b -> b) -> b -> Tree a -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldra -> b -> b g b z Tree a t' )Tree a t [Tree a] ts ){-# INLINEfoldrMap1 #-}-- This is foldrMap1 for Data.List.NonEmpty, but is not available before-- base 4.18.foldrMap1NE ::(a ->b )->(a ->b ->b )->a ->[a ]->b foldrMap1NE :: forall a b. (a -> b) -> (a -> b -> b) -> a -> [a] -> b foldrMap1NE a -> b f a -> b -> b g =a -> [a] -> b go wherego :: a -> [a] -> b go a x []=a -> b f a x go a x (a x' :[a] xs )=a -> b -> b g a x (a -> [a] -> b go a x' [a] xs ){-# INLINEfoldrMap1NE #-}foldlMap1' ::(a ->b )->(b ->a ->b )->Tree a ->b foldlMap1' :: forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1' a -> b f b -> a -> b g =-- Use a lambda to allow inlining with two arguments\(Node a x [Tree a] ts )->(b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'((b -> a -> b) -> b -> Tree a -> b forall b a. (b -> a -> b) -> b -> Tree a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'b -> a -> b g )(a -> b f a x )[Tree a] ts {-# INLINEfoldlMap1' #-}foldlMap1 ::(a ->b )->(b ->a ->b )->Tree a ->b foldlMap1 :: forall a b. (a -> b) -> (b -> a -> b) -> Tree a -> b foldlMap1 a -> b f b -> a -> b g =-- Use a lambda to allow inlining with two arguments\(Node a x [Tree a] ts )->(b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl((b -> a -> b) -> b -> Tree a -> b forall b a. (b -> a -> b) -> b -> Tree a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldlb -> a -> b g )(a -> b f a x )[Tree a] ts {-# INLINEfoldlMap1 #-}instanceNFDataa =>NFData(Tree a )wherernf :: Tree a -> () rnf(Node a x [Tree a] ts )=a -> () forall a. NFData a => a -> () rnfa x () -> () -> () forall a b. a -> b -> b `seq`[Tree a] -> () forall a. NFData a => a -> () rnf[Tree a] ts -- | @since 0.8instanceNFData1Tree whereliftRnf :: forall a. (a -> ()) -> Tree a -> () liftRnfa -> () rnfx =Tree a -> () go wherego :: Tree a -> () go (Node a x [Tree a] ts )=a -> () rnfx a x () -> () -> () forall a b. a -> b -> b `seq`(Tree a -> ()) -> [Tree a] -> () forall a. (a -> ()) -> [a] -> () forall (f :: * -> *) a. NFData1 f => (a -> ()) -> f a -> () liftRnfTree a -> () go [Tree a] ts -- | @since 0.5.10.1instanceMonadZipTree wheremzipWith :: forall a b c. (a -> b -> c) -> Tree a -> Tree b -> Tree c mzipWith a -> b -> c f (Node a a [Tree a] as )(Node b b [Tree b] bs )=c -> [Tree c] -> Tree c forall a. a -> [Tree a] -> Tree a Node (a -> b -> c f a a b b )((Tree a -> Tree b -> Tree c) -> [Tree a] -> [Tree b] -> [Tree c] forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] forall (m :: * -> *) a b c. MonadZip m => (a -> b -> c) -> m a -> m b -> m c mzipWith((a -> b -> c) -> Tree a -> Tree b -> Tree c forall a b c. (a -> b -> c) -> Tree a -> Tree b -> Tree c forall (m :: * -> *) a b c. MonadZip m => (a -> b -> c) -> m a -> m b -> m c mzipWitha -> b -> c f )[Tree a] as [Tree b] bs )munzip :: forall a b. Tree (a, b) -> (Tree a, Tree b) munzip (Node (a a ,b b )[Tree (a, b)] ts )=(a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a a [Tree a] as ,b -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node b b [Tree b] bs )where([Tree a] as ,[Tree b] bs )=[(Tree a, Tree b)] -> ([Tree a], [Tree b]) forall a b. [(a, b)] -> ([a], [b]) forall (m :: * -> *) a b. MonadZip m => m (a, b) -> (m a, m b) munzip((Tree (a, b) -> (Tree a, Tree b)) -> [Tree (a, b)] -> [(Tree a, Tree b)] forall a b. (a -> b) -> [a] -> [b] mapTree (a, b) -> (Tree a, Tree b) forall a b. Tree (a, b) -> (Tree a, Tree b) forall (m :: * -> *) a b. MonadZip m => m (a, b) -> (m a, m b) munzip[Tree (a, b)] ts )-- | 2-dimensional ASCII drawing of a tree.---- ==== __Examples__---- > putStr $ drawTree $ fmap show (Node 1 [Node 2 [], Node 3 []])---- @-- 1-- |-- +- 2-- |-- `- 3-- @--drawTree ::Tree String->StringdrawTree :: Tree String -> String drawTree =[String] -> String unlines([String] -> String) -> (Tree String -> [String]) -> Tree String -> String forall b c a. (b -> c) -> (a -> b) -> a -> c .Tree String -> [String] draw -- | 2-dimensional ASCII drawing of a forest.---- ==== __Examples__---- > putStr $ drawForest $ map (fmap show) [(Node 1 [Node 2 [], Node 3 []]), (Node 10 [Node 20 []])]---- @-- 1-- |-- +- 2-- |-- `- 3---- 10-- |-- `- 20-- @--drawForest ::[Tree String]->StringdrawForest :: [Tree String] -> String drawForest =[String] -> String unlines([String] -> String) -> ([Tree String] -> [String]) -> [Tree String] -> String forall b c a. (b -> c) -> (a -> b) -> a -> c .(Tree String -> String) -> [Tree String] -> [String] forall a b. (a -> b) -> [a] -> [b] mapTree String -> String drawTree draw ::Tree String->[String]draw :: Tree String -> [String] draw (Node String x [Tree String] ts0 )=String -> [String] linesString x [String] -> [String] -> [String] forall a. [a] -> [a] -> [a] ++[Tree String] -> [String] drawSubTrees [Tree String] ts0 wheredrawSubTrees :: [Tree String] -> [String] drawSubTrees []=[]drawSubTrees [Tree String t ]=String "|"String -> [String] -> [String] forall a. a -> [a] -> [a] :String -> String -> [String] -> [String] forall {a}. [a] -> [a] -> [[a]] -> [[a]] shift String "`- "String " "(Tree String -> [String] draw Tree String t )drawSubTrees (Tree String t :[Tree String] ts )=String "|"String -> [String] -> [String] forall a. a -> [a] -> [a] :String -> String -> [String] -> [String] forall {a}. [a] -> [a] -> [[a]] -> [[a]] shift String "+- "String "| "(Tree String -> [String] draw Tree String t )[String] -> [String] -> [String] forall a. [a] -> [a] -> [a] ++[Tree String] -> [String] drawSubTrees [Tree String] ts shift :: [a] -> [a] -> [[a]] -> [[a]] shift [a] first [a] other =([a] -> [a] -> [a]) -> [[a]] -> [[a]] -> [[a]] forall a b c. (a -> b -> c) -> [a] -> [b] -> [c] zipWith[a] -> [a] -> [a] forall a. [a] -> [a] -> [a] (++)([a] first [a] -> [[a]] -> [[a]] forall a. a -> [a] -> [a] :[a] -> [[a]] forall a. a -> [a] repeat[a] other )-- | Returns the elements of a tree in pre-order.---- @flatten == Data.Foldable.'toList'@---- @---- a-- / \\ => [a,b,c]-- b c-- @---- ==== __Examples__---- > flatten (Node 1 [Node 2 [], Node 3 []]) == [1,2,3]flatten ::Tree a ->[a ]flatten :: forall a. Tree a -> [a] flatten =Tree a -> [a] forall a. Tree a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] toList-- | Returns the list of nodes at each level of the tree.---- @---- a-- / \\ => [[a], [b,c]]-- b c-- @---- ==== __Examples__---- > levels (Node 1 [Node 2 [], Node 3 []]) == [[1],[2,3]]--levels ::Tree a ->[[a ]]levels :: forall a. Tree a -> [[a]] levels Tree a t =([Tree a] -> [a]) -> [[Tree a]] -> [[a]] forall a b. (a -> b) -> [a] -> [b] map((Tree a -> a) -> [Tree a] -> [a] forall a b. (a -> b) -> [a] -> [b] mapTree a -> a forall a. Tree a -> a rootLabel )([[Tree a]] -> [[a]]) -> [[Tree a]] -> [[a]] forall a b. (a -> b) -> a -> b $([Tree a] -> Bool) -> [[Tree a]] -> [[Tree a]] forall a. (a -> Bool) -> [a] -> [a] takeWhile(Bool -> Bool not(Bool -> Bool) -> ([Tree a] -> Bool) -> [Tree a] -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c .[Tree a] -> Bool forall a. [a] -> Bool forall (t :: * -> *) a. Foldable t => t a -> Bool null)([[Tree a]] -> [[Tree a]]) -> [[Tree a]] -> [[Tree a]] forall a b. (a -> b) -> a -> b $([Tree a] -> [Tree a]) -> [Tree a] -> [[Tree a]] forall a. (a -> a) -> a -> [a] iterate((Tree a -> [Tree a]) -> [Tree a] -> [Tree a] forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b] concatMapTree a -> [Tree a] forall a. Tree a -> [Tree a] subForest )[Tree a t ]-- | Fold a tree into a "summary" value.---- For each node in the tree, apply @f@ to the @rootLabel@ and the result-- of applying @f@ to each @subForest@.---- This is also known as the catamorphism on trees.---- ==== __Examples__---- Sum the values in a tree:---- > foldTree (\x xs -> sum (x:xs)) (Node 1 [Node 2 [], Node 3 []]) == 6---- Find the maximum value in the tree:---- > foldTree (\x xs -> maximum (x:xs)) (Node 1 [Node 2 [], Node 3 []]) == 3---- Count the number of leaves in the tree:---- > foldTree (\_ xs -> if null xs then 1 else sum xs) (Node 1 [Node 2 [], Node 3 []]) == 2---- Find depth of the tree; i.e. the number of branches from the root of the tree to the furthest leaf:---- > foldTree (\_ xs -> if null xs then 0 else 1 + maximum xs) (Node 1 [Node 2 [], Node 3 []]) == 1---- You can even implement traverse using foldTree:---- > traverse' f = foldTree (\x xs -> liftA2 Node (f x) (sequenceA xs))------ @since 0.5.8foldTree ::(a ->[b ]->b )->Tree a ->b foldTree :: forall a b. (a -> [b] -> b) -> Tree a -> b foldTree a -> [b] -> b f =Tree a -> b go wherego :: Tree a -> b go (Node a x [Tree a] ts )=a -> [b] -> b f a x ((Tree a -> b) -> [Tree a] -> [b] forall a b. (a -> b) -> [a] -> [b] mapTree a -> b go [Tree a] ts )-- | Build a (possibly infinite) tree from a seed value.---- @unfoldTree f b@ constructs a tree by starting with the tree-- @Node { rootLabel=b, subForest=[] }@ and repeatedly applying @f@ to each-- 'rootLabel' value in the tree's leaves to generate its 'subForest'.---- For a monadic version, see 'unfoldTreeM' (depth-first) and-- 'unfoldTreeM_BF' (breadth-first).---- ==== __Examples__---- Construct the tree of @Integer@s where each node has two children:-- @left = 2*x@ and @right = 2*x + 1@, where @x@ is the 'rootLabel' of the node.-- Stop when the values exceed 7.---- > let buildNode x = if 2*x + 1 > 7 then (x, []) else (x, [2*x, 2*x+1])-- > putStr $ drawTree $ fmap show $ unfoldTree buildNode 1---- @---- 1-- |-- +- 2-- | |-- | +- 4-- | |-- | `- 5-- |-- `- 3-- |-- +- 6-- |-- `- 7-- @--unfoldTree ::(b ->(a ,[b ]))->b ->Tree a unfoldTree :: forall b a. (b -> (a, [b])) -> b -> Tree a unfoldTree b -> (a, [b]) f b b =let(a a ,[b] bs )=b -> (a, [b]) f b b ina -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a a ((b -> (a, [b])) -> [b] -> [Tree a] forall b a. (b -> (a, [b])) -> [b] -> [Tree a] unfoldForest b -> (a, [b]) f [b] bs )-- | Build a (possibly infinite) forest from a list of seed values.---- @unfoldForest f seeds@ invokes 'unfoldTree' on each seed value.---- For a monadic version, see 'unfoldForestM' (depth-first) and-- 'unfoldForestM_BF' (breadth-first).--unfoldForest ::(b ->(a ,[b ]))->[b ]->[Tree a ]unfoldForest :: forall b a. (b -> (a, [b])) -> [b] -> [Tree a] unfoldForest b -> (a, [b]) f =(b -> Tree a) -> [b] -> [Tree a] forall a b. (a -> b) -> [a] -> [b] map((b -> (a, [b])) -> b -> Tree a forall b a. (b -> (a, [b])) -> b -> Tree a unfoldTree b -> (a, [b]) f )-- | Monadic tree builder, in depth-first order.unfoldTreeM ::Monadm =>(b ->m (a ,[b ]))->b ->m (Tree a )unfoldTreeM :: forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> b -> m (Tree a) unfoldTreeM b -> m (a, [b]) f b b =do(a a ,[b] bs )<-b -> m (a, [b]) f b b [Tree a] ts <-(b -> m (a, [b])) -> [b] -> m [Tree a] forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> [b] -> m [Tree a] unfoldForestM b -> m (a, [b]) f [b] bs Tree a -> m (Tree a) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a a [Tree a] ts )-- | Monadic forest builder, in depth-first order.unfoldForestM ::Monadm =>(b ->m (a ,[b ]))->[b ]->m ([Tree a ])unfoldForestM :: forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> [b] -> m [Tree a] unfoldForestM b -> m (a, [b]) f =(b -> m (Tree a)) -> [b] -> m [Tree a] forall (t :: * -> *) (m :: * -> *) a b. (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b) forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b] Prelude.mapM((b -> m (a, [b])) -> b -> m (Tree a) forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> b -> m (Tree a) unfoldTreeM b -> m (a, [b]) f )-- | Monadic tree builder, in breadth-first order.---- See 'unfoldTree' for more info.---- Implemented using an algorithm adapted from-- /Breadth-First Numbering: Lessons from a Small Exercise in Algorithm Design/,-- by Chris Okasaki, /ICFP'00/.unfoldTreeM_BF ::Monadm =>(b ->m (a ,[b ]))->b ->m (Tree a )unfoldTreeM_BF :: forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> b -> m (Tree a) unfoldTreeM_BF b -> m (a, [b]) f b b =(Seq (Tree a) -> Tree a) -> m (Seq (Tree a)) -> m (Tree a) forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftMSeq (Tree a) -> Tree a forall {a}. Seq a -> a getElement (m (Seq (Tree a)) -> m (Tree a)) -> m (Seq (Tree a)) -> m (Tree a) forall a b. (a -> b) -> a -> b $(b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) unfoldForestQ b -> m (a, [b]) f (b -> Seq b forall a. a -> Seq a singleton b b )wheregetElement :: Seq a -> a getElement Seq a xs =caseSeq a -> ViewL a forall a. Seq a -> ViewL a viewl Seq a xs ofa x :< Seq a _->a x ViewL a EmptyL ->String -> a forall a. HasCallStack => String -> a errorString "unfoldTreeM_BF"-- | Monadic forest builder, in breadth-first order.---- See 'unfoldForest' for more info.---- Implemented using an algorithm adapted from-- /Breadth-First Numbering: Lessons from a Small Exercise in Algorithm Design/,-- by Chris Okasaki, /ICFP'00/.unfoldForestM_BF ::Monadm =>(b ->m (a ,[b ]))->[b ]->m ([Tree a ])unfoldForestM_BF :: forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> [b] -> m [Tree a] unfoldForestM_BF b -> m (a, [b]) f =(Seq (Tree a) -> [Tree a]) -> m (Seq (Tree a)) -> m [Tree a] forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftMSeq (Tree a) -> [Tree a] forall a. Seq a -> [a] forall (t :: * -> *) a. Foldable t => t a -> [a] toList(m (Seq (Tree a)) -> m [Tree a]) -> ([b] -> m (Seq (Tree a))) -> [b] -> m [Tree a] forall b c a. (b -> c) -> (a -> b) -> a -> c .(b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) unfoldForestQ b -> m (a, [b]) f (Seq b -> m (Seq (Tree a))) -> ([b] -> Seq b) -> [b] -> m (Seq (Tree a)) forall b c a. (b -> c) -> (a -> b) -> a -> c .[b] -> Seq b forall a. [a] -> Seq a fromList -- Takes a sequence (queue) of seeds and produces a sequence (reversed queue) of-- trees of the same length.unfoldForestQ ::Monadm =>(b ->m (a ,[b ]))->Seq b ->m (Seq (Tree a ))unfoldForestQ :: forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) unfoldForestQ b -> m (a, [b]) f Seq b aQ =caseSeq b -> ViewL b forall a. Seq a -> ViewL a viewl Seq b aQ ofViewL b EmptyL ->Seq (Tree a) -> m (Seq (Tree a)) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a returnSeq (Tree a) forall a. Seq a empty b a :< Seq b aQ' ->do(a b ,[b] as )<-b -> m (a, [b]) f b a Seq (Tree a) tQ <-(b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) forall (m :: * -> *) b a. Monad m => (b -> m (a, [b])) -> Seq b -> m (Seq (Tree a)) unfoldForestQ b -> m (a, [b]) f ((Seq b -> b -> Seq b) -> Seq b -> [b] -> Seq b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b Prelude.foldlSeq b -> b -> Seq b forall a. Seq a -> a -> Seq a (|>) Seq b aQ' [b] as )let(Seq (Tree a) tQ' ,[Tree a] ts )=[Tree a] -> [b] -> Seq (Tree a) -> (Seq (Tree a), [Tree a]) forall a' b'. [a'] -> [b'] -> Seq a' -> (Seq a', [a']) splitOnto [][b] as Seq (Tree a) tQ Seq (Tree a) -> m (Seq (Tree a)) forall a. a -> m a forall (m :: * -> *) a. Monad m => a -> m a return(a -> [Tree a] -> Tree a forall a. a -> [Tree a] -> Tree a Node a b [Tree a] ts Tree a -> Seq (Tree a) -> Seq (Tree a) forall a. a -> Seq a -> Seq a <| Seq (Tree a) tQ' )wheresplitOnto ::[a' ]->[b' ]->Seq a' ->(Seq a' ,[a' ])splitOnto :: forall a' b'. [a'] -> [b'] -> Seq a' -> (Seq a', [a']) splitOnto [a'] as []Seq a' q =(Seq a' q ,[a'] as )splitOnto [a'] as (b' _:[b'] bs )Seq a' q =caseSeq a' -> ViewR a' forall a. Seq a -> ViewR a viewr Seq a' q ofSeq a' q' :> a' a ->[a'] -> [b'] -> Seq a' -> (Seq a', [a']) forall a' b'. [a'] -> [b'] -> Seq a' -> (Seq a', [a']) splitOnto (a' a a' -> [a'] -> [a'] forall a. a -> [a] -> [a] :[a'] as )[b'] bs Seq a' q' ViewR a' EmptyR ->String -> (Seq a', [a']) forall a. HasCallStack => String -> a errorString "unfoldForestQ"-- | \(O(n)\). The leaves of the tree in left-to-right order.---- A leaf is a node with no children.---- ==== __Examples__---- >>> :{-- leaves $-- Node 1-- [ Node 2-- [ Node 4 []-- , Node 5 []-- ]-- , Node 3-- [ Node 6 []-- ]-- ]-- :}-- [4,5,6]-- >>> leaves (Node "root" [])-- ["root"]---- @since 0.8leaves ::Tree a ->[a ] #ifdef __GLASGOW_HASKELL__ leaves :: forall a. Tree a -> [a] leaves Tree a t =(forall b. (a -> b -> b) -> b -> b) -> [a] forall a. (forall b. (a -> b -> b) -> b -> b) -> [a] GHC.Exts.build((forall b. (a -> b -> b) -> b -> b) -> [a]) -> (forall b. (a -> b -> b) -> b -> b) -> [a] forall a b. (a -> b) -> a -> b $\a -> b -> b cons b nil ->letgo :: Tree a -> b -> b go (Node a x [])b z =a -> b -> b cons a x b z go (Node a _[Tree a] ts )b z =(Tree a -> b -> b) -> b -> [Tree a] -> b forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldrTree a -> b -> b go b z [Tree a] ts inTree a -> b -> b go Tree a t b nil {-# INLINEleaves #-}-- Inline for list fusion #else leavest=letgo(Nodex[])z=x:zgo(Node_ts)z=foldrgoztsingot[] #endif -- | \(O(n)\). The edges of the tree as parent-child pairs in pre-order.---- A tree with \(n\) nodes has \(n-1\) edges.---- ==== __Examples__---- >>> :{-- edges $-- Node 1-- [ Node 2-- [ Node 4 []-- , Node 5 []-- ]-- , Node 3-- [ Node 6 []-- ]-- ]-- :}-- [(1,2),(2,4),(2,5),(1,3),(3,6)]-- >>> edges (Node "root" [])-- []---- @since 0.8edges ::Tree a ->[(a ,a )] #ifdef __GLASGOW_HASKELL__ edges :: forall a. Tree a -> [(a, a)] edges (Node a x0 [Tree a] ts0 )=(forall b. ((a, a) -> b -> b) -> b -> b) -> [(a, a)] forall a. (forall b. (a -> b -> b) -> b -> b) -> [a] GHC.Exts.build((forall b. ((a, a) -> b -> b) -> b -> b) -> [(a, a)]) -> (forall b. ((a, a) -> b -> b) -> b -> b) -> [(a, a)] forall a b. (a -> b) -> a -> b $\(a, a) -> b -> b cons b nil ->letgo :: a -> b -> [Tree a] -> b go a p =(Tree a -> b -> b) -> b -> [Tree a] -> b forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr(\(Node a x [Tree a] ts )b z ->(a, a) -> b -> b cons (a p ,a x )(a -> b -> [Tree a] -> b go a x b z [Tree a] ts ))ina -> b -> [Tree a] -> b go a x0 b nil [Tree a] ts0 {-# INLINEedges #-}-- Inline for list fusion #else edges(Nodex0ts0)=letgop=foldr(\(Nodexts)z->(p,x):goxzts)ingox0[]ts0 #endif -- | \(O(n)\). Labels on the paths from each node to the root.---- ==== __Examples__---- >>> :{-- pathsToRoot $-- Node 1-- [ Node 2 []-- , Node 3 []-- ]-- :}-- Node {rootLabel = 1 :| [], subForest = [Node {rootLabel = 2 :| [1], subForest = []},Node {rootLabel = 3 :| [1], subForest = []}]}-- >>> pathsToRoot (Node "root" [])-- Node {rootLabel = "root" :| [], subForest = []}---- @since 0.8pathsToRoot ::Tree a ->Tree (NonEmptya )pathsToRoot :: forall a. Tree a -> Tree (NonEmpty a) pathsToRoot =[a] -> Tree a -> Tree (NonEmpty a) forall {a}. [a] -> Tree a -> Tree (NonEmpty a) go []wherego :: [a] -> Tree a -> Tree (NonEmpty a) go [a] ps (Node a x [Tree a] ts )=NonEmpty a -> [Tree (NonEmpty a)] -> Tree (NonEmpty a) forall a. a -> [Tree a] -> Tree a Node (a x a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|[a] ps )((Tree a -> Tree (NonEmpty a)) -> [Tree a] -> [Tree (NonEmpty a)] forall a b. (a -> b) -> [a] -> [b] map([a] -> Tree a -> Tree (NonEmpty a) go (a x a -> [a] -> [a] forall a. a -> [a] -> [a] :[a] ps ))[Tree a] ts )-- | Labels on the paths from the root to each node.---- If the path orientation is not important, consider using 'pathsToRoot'-- instead because it is more efficient.---- ==== __Examples__---- >>> :{-- pathsFromRoot $-- Node 1-- [ Node 2 []-- , Node 3 []-- ]-- :}-- Node {rootLabel = 1 :| [], subForest = [Node {rootLabel = 1 :| [2], subForest = []},Node {rootLabel = 1 :| [3], subForest = []}]}-- >>> pathsFromRoot (Node "root" [])-- Node {rootLabel = "root" :| [], subForest = []}---- @since 0.8-- See Note [pathsFromRoot implementation]pathsFromRoot ::Tree a ->Tree (NonEmptya )pathsFromRoot :: forall a. Tree a -> Tree (NonEmpty a) pathsFromRoot (Node a x0 [Tree a] ts0 )=NonEmpty a -> [Tree (NonEmpty a)] -> Tree (NonEmpty a) forall a. a -> [Tree a] -> Tree a Node (a x0 a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|[])((Tree a -> Tree (NonEmpty a)) -> [Tree a] -> [Tree (NonEmpty a)] forall a b. (a -> b) -> [a] -> [b] map(BQ a -> Tree a -> Tree (NonEmpty a) forall {a}. BQ a -> Tree a -> Tree (NonEmpty a) go (a -> BQ a forall a. a -> BQ a singletonBQ a x0 ))[Tree a] ts0 )wherego :: BQ a -> Tree a -> Tree (NonEmpty a) go !BQ a q (Node a x [Tree a] ts )=NonEmpty a -> [Tree (NonEmpty a)] -> Tree (NonEmpty a) forall a. a -> [Tree a] -> Tree a Node (BQ a -> NonEmpty a forall a. BQ a -> NonEmpty a toNonEmptyBQ BQ a q' )((Tree a -> Tree (NonEmpty a)) -> [Tree a] -> [Tree (NonEmpty a)] forall a b. (a -> b) -> [a] -> [b] map(BQ a -> Tree a -> Tree (NonEmpty a) go BQ a q' )[Tree a] ts )where!q' :: BQ a q' =BQ a -> a -> BQ a forall a. BQ a -> a -> BQ a snocBQ BQ a q a x -- An implementation of Chris Okasaki's banker's queue.-- Invariant: length front >= length reardataBQ a =BQ a -- head{-# UNPACK#-}!Word-- length front + length rear[a ]-- front![a ]-- rear (reversed)singletonBQ ::a ->BQ a singletonBQ :: forall a. a -> BQ a singletonBQ a x =a -> Word -> [a] -> [a] -> BQ a forall a. a -> Word -> [a] -> [a] -> BQ a BQ a x Word 0[][]snocBQ ::BQ a ->a ->BQ a snocBQ :: forall a. BQ a -> a -> BQ a snocBQ (BQ a x0 Word n [a] f [a] r )a x |Bool doReverse =a -> Word -> [a] -> [a] -> BQ a forall a. a -> Word -> [a] -> [a] -> BQ a BQ a x0 (Word n Word -> Word -> Word forall a. Num a => a -> a -> a +Word 1)([a] f [a] -> [a] -> [a] forall a. [a] -> [a] -> [a] ++[a] -> [a] forall a. [a] -> [a] reverse(a x a -> [a] -> [a] forall a. a -> [a] -> [a] :[a] r ))[]|Bool otherwise=a -> Word -> [a] -> [a] -> BQ a forall a. a -> Word -> [a] -> [a] -> BQ a BQ a x0 (Word n Word -> Word -> Word forall a. Num a => a -> a -> a +Word 1)[a] f (a x a -> [a] -> [a] forall a. a -> [a] -> [a] :[a] r )wheredoReverse :: Bool doReverse =(Word n Word -> Word -> Word forall a. Num a => a -> a -> a +Word 2)Word -> Word -> Word forall a. Bits a => a -> a -> a .&.(Word n Word -> Word -> Word forall a. Num a => a -> a -> a +Word 1)Word -> Word -> Bool forall a. Eq a => a -> a -> Bool ==Word 0-- We reverse whenever the length of r would exceed that of f.-- This happens every time n+2 is a power of 2.toNonEmptyBQ ::BQ a ->NonEmptya toNonEmptyBQ :: forall a. BQ a -> NonEmpty a toNonEmptyBQ (BQ a x0 Word _[a] f [a] r )=case[a] r of[]->a x0 a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|[a] f -- optimization, no need to rebuild f[a] _->a x0 a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|([a] f [a] -> [a] -> [a] forall a. [a] -> [a] -> [a] ++[a] -> [a] forall a. [a] -> [a] reverse[a] r )-- | A newtype over 'Tree' that folds and traverses in post-order.---- @since 0.8newtypePostOrder a =PostOrder {forall a. PostOrder a -> Tree a unPostOrder ::Tree a } #ifdef __GLASGOW_HASKELL__ deriving(PostOrder a -> PostOrder a -> Bool (PostOrder a -> PostOrder a -> Bool) -> (PostOrder a -> PostOrder a -> Bool) -> Eq (PostOrder a) forall a. Eq a => PostOrder a -> PostOrder a -> Bool forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a $c== :: forall a. Eq a => PostOrder a -> PostOrder a -> Bool == :: PostOrder a -> PostOrder a -> Bool $c/= :: forall a. Eq a => PostOrder a -> PostOrder a -> Bool /= :: PostOrder a -> PostOrder a -> Bool Eq,Eq (PostOrder a) Eq (PostOrder a) => (PostOrder a -> PostOrder a -> Ordering) -> (PostOrder a -> PostOrder a -> Bool) -> (PostOrder a -> PostOrder a -> Bool) -> (PostOrder a -> PostOrder a -> Bool) -> (PostOrder a -> PostOrder a -> Bool) -> (PostOrder a -> PostOrder a -> PostOrder a) -> (PostOrder a -> PostOrder a -> PostOrder a) -> Ord (PostOrder a) PostOrder a -> PostOrder a -> Bool PostOrder a -> PostOrder a -> Ordering PostOrder a -> PostOrder a -> PostOrder a forall a. Eq a => (a -> a -> Ordering) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> Bool) -> (a -> a -> a) -> (a -> a -> a) -> Ord a forall a. Ord a => Eq (PostOrder a) forall a. Ord a => PostOrder a -> PostOrder a -> Bool forall a. Ord a => PostOrder a -> PostOrder a -> Ordering forall a. Ord a => PostOrder a -> PostOrder a -> PostOrder a $ccompare :: forall a. Ord a => PostOrder a -> PostOrder a -> Ordering compare :: PostOrder a -> PostOrder a -> Ordering $c< :: forall a. Ord a => PostOrder a -> PostOrder a -> Bool < :: PostOrder a -> PostOrder a -> Bool $c<= :: forall a. Ord a => PostOrder a -> PostOrder a -> Bool <= :: PostOrder a -> PostOrder a -> Bool $c> :: forall a. Ord a => PostOrder a -> PostOrder a -> Bool > :: PostOrder a -> PostOrder a -> Bool $c>= :: forall a. Ord a => PostOrder a -> PostOrder a -> Bool >= :: PostOrder a -> PostOrder a -> Bool $cmax :: forall a. Ord a => PostOrder a -> PostOrder a -> PostOrder a max :: PostOrder a -> PostOrder a -> PostOrder a $cmin :: forall a. Ord a => PostOrder a -> PostOrder a -> PostOrder a min :: PostOrder a -> PostOrder a -> PostOrder a Ord,ReadPrec [PostOrder a] ReadPrec (PostOrder a) Int -> ReadS (PostOrder a) ReadS [PostOrder a] (Int -> ReadS (PostOrder a)) -> ReadS [PostOrder a] -> ReadPrec (PostOrder a) -> ReadPrec [PostOrder a] -> Read (PostOrder a) forall a. Read a => ReadPrec [PostOrder a] forall a. Read a => ReadPrec (PostOrder a) forall a. Read a => Int -> ReadS (PostOrder a) forall a. Read a => ReadS [PostOrder a] forall a. (Int -> ReadS a) -> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a $creadsPrec :: forall a. Read a => Int -> ReadS (PostOrder a) readsPrec :: Int -> ReadS (PostOrder a) $creadList :: forall a. Read a => ReadS [PostOrder a] readList :: ReadS [PostOrder a] $creadPrec :: forall a. Read a => ReadPrec (PostOrder a) readPrec :: ReadPrec (PostOrder a) $creadListPrec :: forall a. Read a => ReadPrec [PostOrder a] readListPrec :: ReadPrec [PostOrder a] Read,Int -> PostOrder a -> ShowS [PostOrder a] -> ShowS PostOrder a -> String (Int -> PostOrder a -> ShowS) -> (PostOrder a -> String) -> ([PostOrder a] -> ShowS) -> Show (PostOrder a) forall a. Show a => Int -> PostOrder a -> ShowS forall a. Show a => [PostOrder a] -> ShowS forall a. Show a => PostOrder a -> String forall a. (Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a $cshowsPrec :: forall a. Show a => Int -> PostOrder a -> ShowS showsPrec :: Int -> PostOrder a -> ShowS $cshow :: forall a. Show a => PostOrder a -> String show :: PostOrder a -> String $cshowList :: forall a. Show a => [PostOrder a] -> ShowS showList :: [PostOrder a] -> ShowS Show,Typeable (PostOrder a) Typeable (PostOrder a) => (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PostOrder a -> c (PostOrder a)) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (PostOrder a)) -> (PostOrder a -> Constr) -> (PostOrder a -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (PostOrder a))) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (PostOrder a))) -> ((forall b. Data b => b -> b) -> PostOrder a -> PostOrder a) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r) -> (forall u. (forall d. Data d => d -> u) -> PostOrder a -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> PostOrder a -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a)) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a)) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a)) -> Data (PostOrder a) PostOrder a -> Constr PostOrder a -> DataType (forall b. Data b => b -> b) -> PostOrder a -> PostOrder a forall a. Data a => Typeable (PostOrder a) forall a. Data a => PostOrder a -> Constr forall a. Data a => PostOrder a -> DataType forall a. Data a => (forall b. Data b => b -> b) -> PostOrder a -> PostOrder a forall a u. Data a => Int -> (forall d. Data d => d -> u) -> PostOrder a -> u forall a u. Data a => (forall d. Data d => d -> u) -> PostOrder a -> [u] forall a r r'. Data a => (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r forall a r r'. Data a => (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r forall a (m :: * -> *). (Data a, Monad m) => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) forall a (c :: * -> *). Data a => (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (PostOrder a) forall a (c :: * -> *). Data a => (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PostOrder a -> c (PostOrder a) forall a (t :: * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d. Data d => c (t d)) -> Maybe (c (PostOrder a)) forall a (t :: * -> * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (PostOrder a)) forall a. Typeable a => (forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> a -> c a) -> (forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c a) -> (a -> Constr) -> (a -> DataType) -> (forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c a)) -> (forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a)) -> ((forall b. Data b => b -> b) -> a -> a) -> (forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r) -> (forall u. (forall d. Data d => d -> u) -> a -> [u]) -> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u) -> (forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> (forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a) -> Data a forall u. Int -> (forall d. Data d => d -> u) -> PostOrder a -> u forall u. (forall d. Data d => d -> u) -> PostOrder a -> [u] forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (PostOrder a) forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PostOrder a -> c (PostOrder a) forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (PostOrder a)) forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (PostOrder a)) $cgfoldl :: forall a (c :: * -> *). Data a => (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PostOrder a -> c (PostOrder a) gfoldl :: forall (c :: * -> *). (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> PostOrder a -> c (PostOrder a) $cgunfold :: forall a (c :: * -> *). Data a => (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (PostOrder a) gunfold :: forall (c :: * -> *). (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (PostOrder a) $ctoConstr :: forall a. Data a => PostOrder a -> Constr toConstr :: PostOrder a -> Constr $cdataTypeOf :: forall a. Data a => PostOrder a -> DataType dataTypeOf :: PostOrder a -> DataType $cdataCast1 :: forall a (t :: * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d. Data d => c (t d)) -> Maybe (c (PostOrder a)) dataCast1 :: forall (t :: * -> *) (c :: * -> *). Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (PostOrder a)) $cdataCast2 :: forall a (t :: * -> * -> *) (c :: * -> *). (Data a, Typeable t) => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (PostOrder a)) dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *). Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (PostOrder a)) $cgmapT :: forall a. Data a => (forall b. Data b => b -> b) -> PostOrder a -> PostOrder a gmapT :: (forall b. Data b => b -> b) -> PostOrder a -> PostOrder a $cgmapQl :: forall a r r'. Data a => (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r gmapQl :: forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r $cgmapQr :: forall a r r'. Data a => (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> PostOrder a -> r $cgmapQ :: forall a u. Data a => (forall d. Data d => d -> u) -> PostOrder a -> [u] gmapQ :: forall u. (forall d. Data d => d -> u) -> PostOrder a -> [u] $cgmapQi :: forall a u. Data a => Int -> (forall d. Data d => d -> u) -> PostOrder a -> u gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> PostOrder a -> u $cgmapM :: forall a (m :: * -> *). (Data a, Monad m) => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) gmapM :: forall (m :: * -> *). Monad m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) $cgmapMp :: forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) gmapMp :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) $cgmapMo :: forall a (m :: * -> *). (Data a, MonadPlus m) => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) gmapMo :: forall (m :: * -> *). MonadPlus m => (forall d. Data d => d -> m d) -> PostOrder a -> m (PostOrder a) Data,(forall x. PostOrder a -> Rep (PostOrder a) x) -> (forall x. Rep (PostOrder a) x -> PostOrder a) -> Generic (PostOrder a) forall x. Rep (PostOrder a) x -> PostOrder a forall x. PostOrder a -> Rep (PostOrder a) x forall a. (forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a forall a x. Rep (PostOrder a) x -> PostOrder a forall a x. PostOrder a -> Rep (PostOrder a) x $cfrom :: forall a x. PostOrder a -> Rep (PostOrder a) x from :: forall x. PostOrder a -> Rep (PostOrder a) x $cto :: forall a x. Rep (PostOrder a) x -> PostOrder a to :: forall x. Rep (PostOrder a) x -> PostOrder a Generic,(forall a. PostOrder a -> Rep1 PostOrder a) -> (forall a. Rep1 PostOrder a -> PostOrder a) -> Generic1 PostOrder forall a. Rep1 PostOrder a -> PostOrder a forall a. PostOrder a -> Rep1 PostOrder a forall k (f :: k -> *). (forall (a :: k). f a -> Rep1 f a) -> (forall (a :: k). Rep1 f a -> f a) -> Generic1 f $cfrom1 :: forall a. PostOrder a -> Rep1 PostOrder a from1 :: forall a. PostOrder a -> Rep1 PostOrder a $cto1 :: forall a. Rep1 PostOrder a -> PostOrder a to1 :: forall a. Rep1 PostOrder a -> PostOrder a Generic1,(forall (m :: * -> *). Quote m => PostOrder a -> m Exp) -> (forall (m :: * -> *). Quote m => PostOrder a -> Code m (PostOrder a)) -> Lift (PostOrder a) forall a (m :: * -> *). (Lift a, Quote m) => PostOrder a -> m Exp forall a (m :: * -> *). (Lift a, Quote m) => PostOrder a -> Code m (PostOrder a) forall t. (forall (m :: * -> *). Quote m => t -> m Exp) -> (forall (m :: * -> *). Quote m => t -> Code m t) -> Lift t forall (m :: * -> *). Quote m => PostOrder a -> m Exp forall (m :: * -> *). Quote m => PostOrder a -> Code m (PostOrder a) $clift :: forall a (m :: * -> *). (Lift a, Quote m) => PostOrder a -> m Exp lift :: forall (m :: * -> *). Quote m => PostOrder a -> m Exp $cliftTyped :: forall a (m :: * -> *). (Lift a, Quote m) => PostOrder a -> Code m (PostOrder a) liftTyped :: forall (m :: * -> *). Quote m => PostOrder a -> Code m (PostOrder a) Lift) #else deriving(Eq,Ord,Read,Show) #endif instanceFunctorPostOrder where #ifdef __GLASGOW_HASKELL__ fmap :: forall a b. (a -> b) -> PostOrder a -> PostOrder b fmap=(((a -> b) -> Tree a -> Tree b) -> (a -> b) -> PostOrder a -> PostOrder b forall {a} {b}. ((a -> b) -> Tree a -> Tree b) -> (a -> b) -> PostOrder a -> PostOrder b forall a b. Coercible a b => a -> b coerce::((a ->b )->Tree a ->Tree b )->(a ->b )->PostOrder a ->PostOrder b )(a -> b) -> Tree a -> Tree b forall a b. (a -> b) -> Tree a -> Tree b fmapTree <$ :: forall a b. a -> PostOrder b -> PostOrder a (<$)=((b -> Tree a -> Tree b) -> b -> PostOrder a -> PostOrder b forall {b} {a}. (b -> Tree a -> Tree b) -> b -> PostOrder a -> PostOrder b forall a b. Coercible a b => a -> b coerce::(b ->Tree a ->Tree b )->b ->PostOrder a ->PostOrder b )a -> Tree b -> Tree a forall a b. a -> Tree b -> Tree a forall (f :: * -> *) a b. Functor f => a -> f b -> f a (<$) #else fmapf=PostOrder.fmapTreef.unPostOrder(<$)x=PostOrder.(x<$).unPostOrder #endif -- See Note [Implemented Foldable Tree functions]instanceFoldablePostOrder wherefold :: forall m. Monoid m => PostOrder m -> m fold=(m -> m) -> PostOrder m -> m forall m a. Monoid m => (a -> m) -> PostOrder a -> m forall (t :: * -> *) m a. (Foldable t, Monoid m) => (a -> m) -> t a -> m foldMapm -> m forall a. a -> a id{-# INLINABLEfold#-}foldMap :: forall m a. Monoid m => (a -> m) -> PostOrder a -> m foldMap=(a -> m) -> PostOrder a -> m forall (t :: * -> *) m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m foldMapDefault{-# INLINEfoldMap#-}foldr :: forall a b. (a -> b -> b) -> b -> PostOrder a -> b foldra -> b -> b f b z0 =\(PostOrder Tree a t )->Tree a -> b -> b go Tree a t b z0 -- Use a lambda to inline with two argumentswherego :: Tree a -> b -> b go (Node a x [Tree a] ts )b z =(Tree a -> b -> b) -> b -> [Tree a] -> b forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldrTree a -> b -> b go (a -> b -> b f a x b z )[Tree a] ts {-# INLINEfoldr#-}foldl' :: forall b a. (b -> a -> b) -> b -> PostOrder a -> b foldl'b -> a -> b f b z0 =\(PostOrder Tree a t )->b -> Tree a -> b go b z0 Tree a t -- Use a lambda to inline with two argumentswherego :: b -> Tree a -> b go !b z (Node a x [Tree a] ts )=let!z' :: b z' =(b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'b -> Tree a -> b go b z [Tree a] ts inb -> a -> b f b z' a x {-# INLINEfoldl'#-}foldr1 :: forall a. (a -> a -> a) -> PostOrder a -> a foldr1=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (a -> b -> b) -> PostOrder a -> b foldrMap1PostOrder a -> a forall a. a -> a idfoldl1 :: forall a. (a -> a -> a) -> PostOrder a -> a foldl1=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1PostOrder a -> a forall a. a -> a idnull :: forall a. PostOrder a -> Bool nullPostOrder a _=Bool False{-# INLINEnull#-}elem :: forall a. Eq a => a -> PostOrder a -> Bool elem=(a -> Bool) -> PostOrder a -> Bool forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool any((a -> Bool) -> PostOrder a -> Bool) -> (a -> a -> Bool) -> a -> PostOrder a -> Bool forall b c a. (b -> c) -> (a -> b) -> a -> c .a -> a -> Bool forall a. Eq a => a -> a -> Bool (==){-# INLINABLEelem#-}maximum :: forall a. Ord a => PostOrder a -> a maximum=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> a forall a. a -> a ida -> a -> a forall a. Ord a => a -> a -> a max{-# INLINABLEmaximum#-}minimum :: forall a. Ord a => PostOrder a -> a minimum=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> a forall a. a -> a ida -> a -> a forall a. Ord a => a -> a -> a min{-# INLINABLEminimum#-}sum :: forall a. Num a => PostOrder a -> a sum=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> a forall a. a -> a ida -> a -> a forall a. Num a => a -> a -> a (+){-# INLINABLEsum#-}product :: forall a. Num a => PostOrder a -> a product=(a -> a) -> (a -> a -> a) -> PostOrder a -> a forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> a forall a. a -> a ida -> a -> a forall a. Num a => a -> a -> a (*){-# INLINABLEproduct#-}instanceTraversablePostOrder wheretraverse :: forall (f :: * -> *) a b. Applicative f => (a -> f b) -> PostOrder a -> f (PostOrder b) traversea -> f b f =\(PostOrder Tree a t )->Tree b -> PostOrder b forall a. Tree a -> PostOrder a PostOrder (Tree b -> PostOrder b) -> f (Tree b) -> f (PostOrder b) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$>Tree a -> f (Tree b) go Tree a t wherego :: Tree a -> f (Tree b) go (Node a x [Tree a] ts )=([Tree b] -> b -> Tree b) -> f [Tree b] -> f b -> f (Tree b) forall a b c. (a -> b -> c) -> f a -> f b -> f c forall (f :: * -> *) a b c. Applicative f => (a -> b -> c) -> f a -> f b -> f c liftA2((b -> [Tree b] -> Tree b) -> [Tree b] -> b -> Tree b forall a b c. (a -> b -> c) -> b -> a -> c flipb -> [Tree b] -> Tree b forall a. a -> [Tree a] -> Tree a Node )((Tree a -> f (Tree b)) -> [Tree a] -> f [Tree b] forall (t :: * -> *) (f :: * -> *) a b. (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b) forall (f :: * -> *) a b. Applicative f => (a -> f b) -> [a] -> f [b] traverseTree a -> f (Tree b) go [Tree a] ts )(a -> f b f a x ){-# INLINEtraverse#-} #if MIN_VERSION_base(4,18,0) -- See Note [Implemented Foldable1 Tree functions]instanceFoldable1.Foldable1PostOrder wherefoldMap1 :: forall m a. Semigroup m => (a -> m) -> PostOrder a -> m foldMap1a -> m f =\(PostOrder Tree a t )->Tree a -> m go Tree a t -- Use a lambda to inline with one argumentwherego :: Tree a -> m go (Node a x [])=a -> m f a x go (Node a x (Tree a t :[Tree a] ts ))=(Tree a -> m) -> (Tree a -> m -> m) -> NonEmpty (Tree a) -> m forall a b. (a -> b) -> (a -> b -> b) -> NonEmpty a -> b forall (t :: * -> *) a b. Foldable1 t => (a -> b) -> (a -> b -> b) -> t a -> b Foldable1.foldrMap1Tree a -> m go (\Tree a t' m z' ->Tree a -> m go Tree a t' m -> m -> m forall a. Semigroup a => a -> a -> a <>m z' )(Tree a t Tree a -> [Tree a] -> NonEmpty (Tree a) forall a. a -> [a] -> NonEmpty a :|[Tree a] ts )m -> m -> m forall a. Semigroup a => a -> a -> a <>a -> m f a x {-# INLINEfoldMap1#-}foldMap1' :: forall m a. Semigroup m => (a -> m) -> PostOrder a -> m foldMap1'a -> m f =(a -> m) -> (m -> a -> m) -> PostOrder a -> m forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> m f (\m z a x ->m z m -> m -> m forall a. Semigroup a => a -> a -> a <>a -> m f a x ){-# INLINEfoldMap1'#-}toNonEmpty :: forall a. PostOrder a -> NonEmpty a toNonEmpty(PostOrder Tree a t0 )=Tree a -> [a] -> NonEmpty a forall {a}. Tree a -> [a] -> NonEmpty a go Tree a t0 []wherego :: Tree a -> [a] -> NonEmpty a go (Node a x [])[a] z =a x a -> [a] -> NonEmpty a forall a. a -> [a] -> NonEmpty a :|[a] z go (Node a x (Tree a t :[Tree a] ts ))[a] z =Tree a -> [a] -> NonEmpty a go Tree a t ((Tree a -> [a] -> [a]) -> [a] -> [Tree a] -> [a] forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr(\Tree a t' [a] z' ->(a -> [a] -> [a]) -> [a] -> PostOrder a -> [a] forall a b. (a -> b -> b) -> b -> PostOrder a -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr(:)[a] z' (Tree a -> PostOrder a forall a. Tree a -> PostOrder a PostOrder Tree a t' ))(a x a -> [a] -> [a] forall a. a -> [a] -> [a] :[a] z )[Tree a] ts )maximum :: forall a. Ord a => PostOrder a -> a maximum=PostOrder a -> a forall a. Ord a => PostOrder a -> a forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a Foldable.maximum{-# INLINABLEmaximum#-}minimum :: forall a. Ord a => PostOrder a -> a minimum=PostOrder a -> a forall a. Ord a => PostOrder a -> a forall (t :: * -> *) a. (Foldable t, Ord a) => t a -> a Foldable.minimum{-# INLINABLEminimum#-}foldrMap1 :: forall a b. (a -> b) -> (a -> b -> b) -> PostOrder a -> b foldrMap1=(a -> b) -> (a -> b -> b) -> PostOrder a -> b forall a b. (a -> b) -> (a -> b -> b) -> PostOrder a -> b foldrMap1PostOrder foldlMap1' :: forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'=(a -> b) -> (b -> a -> b) -> PostOrder a -> b forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder foldlMap1 :: forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1=(a -> b) -> (b -> a -> b) -> PostOrder a -> b forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1PostOrder #endif foldrMap1PostOrder ::(a ->b )->(a ->b ->b )->PostOrder a ->b foldrMap1PostOrder :: forall a b. (a -> b) -> (a -> b -> b) -> PostOrder a -> b foldrMap1PostOrder a -> b f a -> b -> b g =\(PostOrder (Node a x [Tree a] ts ))->(Tree a -> b -> b) -> b -> [Tree a] -> b forall a b. (a -> b -> b) -> b -> [a] -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldr(\Tree a t b z ->(a -> b -> b) -> b -> PostOrder a -> b forall a b. (a -> b -> b) -> b -> PostOrder a -> b forall (t :: * -> *) a b. Foldable t => (a -> b -> b) -> b -> t a -> b foldra -> b -> b g b z (Tree a -> PostOrder a forall a. Tree a -> PostOrder a PostOrder Tree a t ))(a -> b f a x )[Tree a] ts {-# INLINEfoldrMap1PostOrder #-}foldlMap1PostOrder ::(a ->b )->(b ->a ->b )->PostOrder a ->b foldlMap1PostOrder :: forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1PostOrder a -> b f b -> a -> b g =\(PostOrder Tree a t )->Tree a -> b go Tree a t wherego :: Tree a -> b go (Node a x [])=a -> b f a x go (Node a x (Tree a t :[Tree a] ts ))=b -> a -> b g ((b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl(\b z Tree a t' ->(b -> a -> b) -> b -> PostOrder a -> b forall b a. (b -> a -> b) -> b -> PostOrder a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldlb -> a -> b g b z (Tree a -> PostOrder a forall a. Tree a -> PostOrder a PostOrder Tree a t' ))(Tree a -> b go Tree a t )[Tree a] ts )a x {-# INLINEfoldlMap1PostOrder #-}foldlMap1'PostOrder ::(a ->b )->(b ->a ->b )->PostOrder a ->b foldlMap1'PostOrder :: forall a b. (a -> b) -> (b -> a -> b) -> PostOrder a -> b foldlMap1'PostOrder a -> b f b -> a -> b g =\(PostOrder Tree a t )->Tree a -> b go Tree a t wherego :: Tree a -> b go (Node a x [])=a -> b f a x go (Node a x (Tree a t :[Tree a] ts ))=let!z' :: b z' =(b -> Tree a -> b) -> b -> [Tree a] -> b forall b a. (b -> a -> b) -> b -> [a] -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'(\b z Tree a t' ->(b -> a -> b) -> b -> PostOrder a -> b forall b a. (b -> a -> b) -> b -> PostOrder a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl'b -> a -> b g b z (Tree a -> PostOrder a forall a. Tree a -> PostOrder a PostOrder Tree a t' ))(Tree a -> b go Tree a t )[Tree a] ts inb -> a -> b g b z' a x {-# INLINEfoldlMap1'PostOrder #-}---------------------------------------------------------------------------------- Note [Implemented Foldable Tree functions]-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~---- Implemented:---- foldMap, foldr, foldl': Basic functions.-- fold, elem: Implemented same as the default definition, but INLINABLE to-- allow specialization.-- foldr1, foldl1, null, maximum, minimum: Implemented more efficiently than-- defaults since trees are non-empty.-- sum, product: Implemented as strict left folds. Defaults use the lazy foldMap-- before base 4.15.1.---- Not implemented:---- foldMap', toList, length: Defaults perform well.-- foldr', foldl: Unlikely to be used.-- Note [Implemented Foldable1 Tree functions]-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~---- Implemented:---- foldMap, foldrMap1, foldlMap1': Basic functions-- foldMap1': Implemented same as the default definition, but INLINABLE to-- allow specialization.-- toNonEmpty, foldlMap1: Implemented more efficiently than default.-- maximum, minimum: Uses Foldable's implementation.---- Not implemented:---- fold1, head: Defaults perform well.-- foldrMap1': Unlikely to be used.-- Note [pathsFromRoot implementation]-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~-- We use Okasaki's banker's queue for pathsFromRoot because it has some-- desirable properties when the result is consumed lazily.---- 1. Fully evaluating a node's NonEmpty takes O(d) time, where d is-- the depth of the node. This is optimal.-- 2. The elements in the NonEmpty are yielded lazily. Note that the worst case-- time to yield an element is not O(1), i.e. it is only amortized O(1).-- More than O(1) work is done when the next element requires forcing (++)-- suspensions or reversing a rear list. For example, yielding the head has-- to force O(log d) (++) and so takes O(log d) time.-- 3. It builds up some beneficial sharing. It is not possible to share the-- results since the lists have different ends, but we can share some-- intermediate structures. Consider m sibling nodes at depth d. The front-- list is shared between them in (front ++ rear1), (front ++ rear2), ...-- (front + rearm). Forcing a prefix of front in one list can take arbitrary-- amounts of time per element (total bounded by O(d)), but once it is-- forced, front is memoized and doing the same for any of the siblings will-- take O(1) per element.---- Alternatives:---- * Implement it like pathsToRoot and reverse the NonEmptys. This does satisfy-- point 1 above. On 2 there's a trade-off, it costs a full O(d) to access the-- head and O(1) per element after that. On 3 it compares poorly because there-- is no sharing. Accessing the heads of m siblings will take O(dm) compared-- to the current O(d + m).-- * Use Okasaki's real-time queues. This would guarantee O(1) per element, but-- has worse constant-factor overall and does not seem worth the trouble.---- GHC base also uses a banker's queue for Data.List.inits. inits is similar-- in nature to pathsFromRoot since a list is a tree where each node has one or-- zero children.