{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
module ELynx.Data.Character.Nucleotide
( Nucleotide (..)
) where
import Data.Vector.Unboxed.Deriving
import Data.Word8
import qualified ELynx.Data.Character.Character as C
import ELynx.Tools.ByteString (c2w, w2c)
data Nucleotide = A | C | G | T
deriving (Show, Read, Eq, Ord, Enum, Bounded)
toWord :: Nucleotide -> Word8
toWord A = c2w 'A'
toWord C = c2w 'C'
toWord G = c2w 'G'
toWord T = c2w 'T'
fromWord :: Word8 -> Nucleotide
fromWord w = case w2c w of
'A' -> A
'C' -> C
'G' -> G
'T' -> T
c -> error $ "fromWord: Cannot convert " ++ show c ++ " to Nucleotide."
derivingUnbox "Nucleotide"
[t| Nucleotide -> Word8 |]
[| toWord |]
[| fromWord |]
instance C.Character Nucleotide where
toWord = toWord
fromWord = fromWord