module ELynx.Export.Tree.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.Data.Tree.Named
import ELynx.Data.Tree.Phylogeny
import ELynx.Data.Tree.Rooted
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 (\bs -> BB.char8 '[' <> BB.doubleDec bs <> BB.char8 ']') (brSup x)
mBrLenBuilder x = maybe mempty (\bl -> BB.char8 ':' <> BB.doubleDec bl) (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