-- ------------------------------------------------------------

{- |
   Module     : Data.Tree.Class
   Copyright  : Copyright (C) 2005 Uwe Schmidt
   License    : MIT

   Maintainer : Uwe Schmidt (uwe\@fh-wedel.de)
   Stability  : experimental
   Portability: portable

   Interface definition for trees
-}

-- ------------------------------------------------------------

module Data.Tree.Class
    ( module Data.Tree.Class )
where

-- | The interface for trees

class Tree t where
    -- | tree construction: a new tree is constructed by a node attribute and a list of children
    mkTree		::              a -> [t a] -> t a

    -- | leaf construction: leafs don't have any children
    --
    -- definition: @ mkLeaf n = mkTree n [] @

    mkLeaf		::                       a -> t a
    mkLeaf n		= mkTree n []

    -- | leaf test: list of children empty?

    isLeaf		::		       t a -> Bool
    isLeaf		= null . getChildren

    -- | innner node test: @ not . isLeaf @

    isInner		::		       t a -> Bool
    isInner		= not . isLeaf

    -- | select node attribute

    getNode		::                     t a -> a

    -- | select children

    getChildren		::                     t a -> [t a]

    -- | edit node attribute

    changeNode		::         (a -> a) -> t a -> t a

    -- | edit children

    changeChildren	:: ([t a] -> [t a]) -> t a -> t a

    -- | substitute node: @ setNode n = changeNode (const n) @

    setNode		::                a -> t a -> t a
    setNode n		= changeNode (const n)

    -- | substitute children: @ setChildren cl = changeChildren (const cl) @

    setChildren		::            [t a] -> t a -> t a
    setChildren cl	= changeChildren (const cl)

    -- | fold for trees

    foldTree		::  (a -> [b] -> b) -> t a -> b

    -- | all nodes of a tree

    nodesTree		::		       t a -> [a]

    -- | depth of a tree

    depthTree		::		       t a -> Int

    -- | number of nodes in a tree

    cardTree		::                     t a -> Int

    -- | format tree for readable trace output
    --
    -- a /graphical/ representation of the tree in text format

    formatTree		::    (a -> String) -> t a -> String

-- ------------------------------------------------------------