BiobaseTypes-0.2.1.0: Biobase/Types/Taxonomy.hs
-- | Biological classification of species.
module Biobase.Types.Taxonomy where
import Control.DeepSeq
import Data.Aeson
import Data.Binary
import Data.Hashable (Hashable, hashWithSalt)
import Data.Primitive.Types
import Data.Serialize
import Data.Text (Text)
import Data.Vector.Binary
import Data.Vector.Serialize
import Data.Vector.Unboxed.Deriving
import Data.Vector (Vector)
import GHC.Generics (Generic)
import Biobase.Types.Accession (Accession,Species)
import Biobase.Types.Names (SpeciesName, TaxonomicRank)
-- | Taxonomic classification. @Enum@ together with a final @Unknown@ is
-- somewhat fishy.
--
-- TODO What should the order be? Kingdom > Species or Kingdom < Species?
data Classification
= Kingdom
| Phylum
| Class
| Order
| SubOrder
| Family
| Genus
| Species
| Unknown
deriving (Eq,Ord,Read,Show,Enum,Generic)
instance Binary Classification
instance FromJSON Classification
instance Hashable Classification
instance Serialize Classification
instance ToJSON Classification
instance NFData Classification
derivingUnbox "Classification"
[t| Classification -> Int |] [| fromEnum |] [| toEnum |]
-- | A somewhat generic representation of a species within a taxonomic
-- context.
data Taxon = Taxon
{ species :: !SpeciesName -- ^ the full, formal name of a species
, accession :: !(Accession Species) -- ^ the accession for the species (or @""@ if unknown)
, classification :: !(Vector (TaxonomicRank,Classification)) -- ^ vector with classification information
}
deriving (Eq,Read,Show,Generic)
instance Binary Taxon
instance FromJSON Taxon
instance Serialize Taxon
instance ToJSON Taxon
instance NFData Taxon
instance Hashable Taxon where
hashWithSalt h (Taxon s a _) = hashWithSalt h (s,a)