{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
module Types where
import Data.Aeson
import Data.Tree
import GHC.Generics
import qualified Data.Sequence as Seq
import qualified Data.Text as T
import qualified Data.Clustering.Hierarchical as H
data NodeLabel = NodeLabel { nodeID :: !T.Text
, nodeLabels :: !Labels
} deriving (Generic, Eq, Ord, Read, Show)
data Format = JSON | RJSON | Haskell HaskellFormat | Newick | Lineage T.Text deriving (Read)
data HaskellFormat = BaseFormat | TreeFormat | DendrogramFormat deriving (Read)
data Exclusivity = Exclusive | AllExclusive | Majority deriving (Read)
newtype Separator = Separator T.Text deriving (Show)
newtype Field = Field Int deriving (Show)
type Label = T.Text
type Labels = Seq.Seq Label
instance FromJSON NodeLabel
class WorkableTree a where
makeWorkable :: a -> Tree NodeLabel
instance WorkableTree (Tree NodeLabel) where
makeWorkable = id
instance WorkableTree (Tree (Seq.Seq T.Text)) where
makeWorkable (Node { rootLabel = ls, subForest = xs}) =
Node { rootLabel = NodeLabel { nodeID = "", nodeLabels = ls}
, subForest = fmap makeWorkable xs
}
instance WorkableTree (H.Dendrogram (Seq.Seq T.Text)) where
makeWorkable (H.Leaf x) =
Node { rootLabel = NodeLabel { nodeID = "", nodeLabels = x}
, subForest = []
}
makeWorkable (H.Branch _ l r) =
Node { rootLabel = NodeLabel { nodeID = "", nodeLabels = Seq.empty }
, subForest = [makeWorkable l, makeWorkable r]
}