{- NewickConvert
By Gregory W. Schwartz
Collects functions pertaining to converting the Newick format to the
workable tree
-}
{-# LANGUAGE OverloadedStrings #-}
module NewickConvert
( newickToTree
) where
-- Standard
import Data.Maybe
import Data.Tree
import qualified Data.Sequence as Seq
-- Cabal
import qualified Data.List.Safe as Safe
import qualified Data.Text as T
import Biobase.Newick
-- Local
import Types
-- | Convert a newick format into the workable tree format.
newickToTree :: Separator -> Field -> NewickTree -> Tree NodeLabel
newickToTree sep field = go . getNewickTree
where
go (Node { rootLabel = x, subForest = ls }) =
Node { rootLabel = NodeLabel { nodeID = label x
, nodeLabels = getLabels sep field
. label
$ x
}
, subForest = map go ls
}
-- | Get the label by splitting the original label by a separator and
-- choosing the 1 indexed field.
getLabels :: Separator -> Field -> T.Text -> Labels
getLabels (Separator sep) (Field field) =
Seq.singleton . fromMaybe "" . (Safe.!! (field - 1)) . T.splitOn sep