-- TODO: Topology data type.
-- data Topology a = Node (NonEmptySet (Topology a)) | Leaf a

-- |
-- Module      :  ELynx.Data.Tree
-- Description :  Phylogenetic trees
-- Copyright   :  (c) Dominik Schrempf 2020
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Sat Mar 21 16:27:20 2020.
module ELynx.Data.Tree
  ( -- * Rooted trees
    module ELynx.Data.Tree.Rooted,
    module ELynx.Data.Tree.Zipper,

    -- * Branch label classes
    module ELynx.Data.Tree.Measurable,
    module ELynx.Data.Tree.Splittable,
    module ELynx.Data.Tree.Supported,

    -- * Node label classes
    module ELynx.Data.Tree.Named,

    -- * Phylogenies
    module ELynx.Data.Tree.Phylogeny,

    -- * Partitions and distances
    module ELynx.Data.Tree.Bipartition,
    module ELynx.Data.Tree.Partition,
    module ELynx.Data.Tree.Distance,
  )
where

import ELynx.Data.Tree.Bipartition
import ELynx.Data.Tree.Distance
import ELynx.Data.Tree.Measurable
import ELynx.Data.Tree.Named
import ELynx.Data.Tree.Partition
import ELynx.Data.Tree.Phylogeny
import ELynx.Data.Tree.Rooted
import ELynx.Data.Tree.Splittable
import ELynx.Data.Tree.Supported
import ELynx.Data.Tree.Zipper

-- -- | An evolutionary label has some information about where the corresponding
-- -- node is on the tree, and if the node is 'extant', 'extinct', 'internal', or
-- -- 'external'. The latter two could also be determined from the tree. This could
-- -- be species, genes or individuals; probably more.
-- class EvoLabel n where
--   extant          :: n -> Bool
--   extinct         :: n -> Bool

--   internal        :: n -> Bool
--   internal n = not $ extant n || extinct n

--   external        :: n -> Bool
--   external   = not . internal

-- -- -- | Glue branches together, so that one new tree emerges. It's root node is
-- -- -- new, the sub-forest has to be given (a list of trees).
-- -- glue :: (NodeType c)
-- --      => PhyloLabel a b c       -- ^ New root node.
-- --      -> [PhyloTree a b c]      -- ^ Sub-forest.
-- --      -> PhyloTree a b c
-- -- glue s@(PhyloLabel _ _ n) ts
-- --   | extant n  = error "Root node cannot be of type 'Exant'."
-- --   | extinct n = error "Root node cannot be of type 'Extinct'."
-- --   | otherwise = Node s ts