packages feed

elynx-tree-0.6.0.0: bench/Tree.hs

-- |
-- Module      :  Tree
-- Description :  Benchmark some tree algorithms
-- Copyright   :  (c) 2021 Dominik Schrempf
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  experimental
-- Portability :  portable
--
-- Creation date: Fri Jul  2 13:10:48 2021.
module Tree
  ( toLengthTreeTraversable,
    toLengthTreeBitraversable,
  )
where

import Data.Bifunctor
import Data.Bitraversable
import ELynx.Tree.Length
import ELynx.Tree.Phylogeny
import ELynx.Tree.Rooted

-- Compare speed of bitraversal and special traversal instances.

toLengthTreeTraversable :: Tree Phylo a -> Tree Length a
toLengthTreeTraversable = either error id . toLengthTree

fromMaybeWithError :: String -> Maybe a -> Either String a
fromMaybeWithError s = maybe (Left s) Right

toLengthTreeBitraversable :: HasMaybeLength e => Tree e a -> Either String (Tree Length a)
toLengthTreeBitraversable t =
  fromMaybeWithError "toLengthTree: Length unavailable for some branches." $ bisequenceA t'
  where
    t' = modifyStem cleanLength $ bimap getMaybeLength pure t
    cleanLength Nothing = pure 0
    cleanLength x = x