module ELynx.Tree.Export.Newick
( toNewick,
toNewickBuilder,
)
where
import qualified Data.ByteString.Builder as BB
import qualified Data.ByteString.Lazy.Char8 as BL
import Data.List (intersperse)
import ELynx.Tree.Named
import ELynx.Tree.Phylogeny
import ELynx.Tree.Rooted
buildBrSup :: Double -> BB.Builder
buildBrSup bs = BB.char8 '[' <> BB.doubleDec bs <> BB.char8 ']'
buildBrLen :: Double -> BB.Builder
buildBrLen bl = BB.char8 ':' <> BB.doubleDec bl
toNewickBuilder :: Named a => Tree Phylo a -> BB.Builder
toNewickBuilder t = go t <> BB.char8 ';'
where
go (Node b l []) = lbl b l
go (Node b l ts) =
BB.char8 '('
<> mconcat (intersperse (BB.char8 ',') $ map go ts)
<> BB.char8 ')'
<> lbl b l
mBrSupBuilder x = maybe mempty buildBrSup (brSup x)
mBrLenBuilder x = maybe mempty buildBrLen (brLen x)
lbl x y =
BB.lazyByteString (getName y)
<> mBrLenBuilder x
<> mBrSupBuilder x
toNewick :: Named a => Tree Phylo a -> BL.ByteString
toNewick = BB.toLazyByteString . toNewickBuilder