module Biobase.Types.Sequence where
import Control.Lens
import Control.DeepSeq
import Data.ByteString (ByteString)
import Data.Char (ord,chr,toUpper)
import Data.Data (Data)
import Data.Typeable (Typeable)
import GHC.Generics (Generic)
import qualified Data.ByteString.Char8 as BS
import qualified Data.ByteString.UTF8 as BSU
import GHC.Exts (IsString(..))
newtype SequenceID = SequenceID { _sequenceID ∷ ByteString }
deriving (Data, Typeable, Generic, Eq, Ord, Read, Show, IsString)
makeLenses ''SequenceID
instance NFData SequenceID
sequenceIDstring ∷ Iso' SequenceID String
sequenceIDstring = sequenceID . iso BSU.toString BSU.fromString
newtype RNAseq = RNAseq { _rnaseq ∷ ByteString }
deriving (Data, Typeable, Generic, Eq, Ord, Read, Show)
makeLenses ''RNAseq
instance NFData RNAseq
type instance Index RNAseq = Int
type instance IxValue RNAseq = Char
instance Ixed RNAseq where
ix k = rnaseq . ix k . iso (chr . fromIntegral) (fromIntegral . ord)
deriving instance Reversing RNAseq
mkRNAseq ∷ ByteString → RNAseq
mkRNAseq = RNAseq . BS.map go . BS.map toUpper
where go x | x `elem` acgu = x
| otherwise = 'N'
acgu ∷ String
acgu = "ACGU"
instance IsString RNAseq where
fromString = mkRNAseq . BS.pack
newtype DNAseq = DNAseq { _dnaseq ∷ ByteString }
deriving (Data, Typeable, Generic, Eq, Ord, Read, Show)
makeLenses ''DNAseq
instance NFData DNAseq
type instance Index DNAseq = Int
type instance IxValue DNAseq = Char
instance Ixed DNAseq where
ix k = dnaseq . ix k . iso (chr . fromIntegral) (fromIntegral . ord)
mkDNAseq ∷ ByteString → DNAseq
mkDNAseq = DNAseq . BS.map go . BS.map toUpper
where go x | x `elem` acgt = x
| otherwise = 'N'
acgt ∷ String
acgt = "ACGT"
instance IsString DNAseq where
fromString = mkDNAseq . BS.pack
deriving instance Reversing DNAseq
rna2dna ∷ Char → Char
rna2dna = \case
'U' → 'T'
'u' → 't'
x → x
rnaComplement ∷ Char → Char
rnaComplement = \case
'A' → 'U'
'a' → 'u'
'C' → 'G'
'c' → 'g'
'G' → 'C'
'g' → 'c'
'U' → 'A'
'u' → 'a'
x → x
dna2rna ∷ Char → Char
dna2rna = \case
'T' → 'U'
't' → 'u'
x → x
dnaComplement ∷ Char → Char
dnaComplement = \case
'A' → 'T'
'a' → 't'
'C' → 'G'
'c' → 'g'
'G' → 'C'
'g' → 'c'
'T' → 'A'
't' → 'a'
x → x
class Transcribe f where
type TranscribeTo f ∷ *
transcribe ∷ Iso' f (TranscribeTo f)
instance Transcribe DNAseq where
type TranscribeTo DNAseq = RNAseq
transcribe = iso (RNAseq . BS.map dna2rna . _dnaseq) (DNAseq . BS.map rna2dna . _rnaseq)
instance Transcribe RNAseq where
type TranscribeTo RNAseq = DNAseq
transcribe = from transcribe
class Complement f where
complement ∷ Iso' f f
instance Complement DNAseq where
complement = iso (DNAseq . BS.map dnaComplement . _dnaseq) (DNAseq . BS.map dnaComplement . _dnaseq)
instance Complement RNAseq where
complement = iso (RNAseq . BS.map rnaComplement . _rnaseq) (RNAseq . BS.map rnaComplement . _rnaseq)