packages feed

Biobase-0.3.1.0: Biobase/RNA/Complex.hs

{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

-- | Internal representation of RNA complexes. Ideally, each DataSource should
-- define an instance of 'MkComplex' for easy importing of foreign data.
--
-- TODO unify with Biobase.Structure.Complex

module Biobase.RNA.Complex where

import Control.DeepSeq
import qualified Data.Vector.Unboxed as VU

import Biobase.RNA
import Biobase.RNA.Pairs



-- | An RNA complex. One or more RNA molecules linearly encoding as a
-- 'sequence'. Structure is stored as an unboxed vector. The (unspecified) type
-- is most likely either a 'CwwPair' or an 'ExtPair'. The 'chain' encodes (for
-- more than one participating nucleotide sequence) to which chain each
-- nucleotide in the sequence belongs.
--
-- NOTE 'chain' may be empty and there may be "ampersand" markers in the
-- 'sequence' which then define split positions.

data (VU.Unbox a, Show a, Read a) => Complex a = Complex
  { sequence :: Primary
  , structure :: Pairs a
  , chain :: VU.Vector Char
  }
  deriving (Read,Show)

-- | Create 'Complex'es from data sources.

class MkComplex a b where
  mkComplex :: a -> Complex b



-- * 'CwwPair' instances

-- | Create a complex where only sequence is given.

instance MkComplex String CwwPair where
  mkComplex s = error "write me" -- Complex (mkPrimary s) (mkSecondary "") (VU.empty)

-- | Default interactive instance. Given sequence and dot-bracket string, both
-- as strings, create an instance.

instance MkComplex (String,String) CwwPair where
  mkComplex (s,p) = error "write me" -- Complex (mkPrimary s) (mkSecondary p) (VU.empty)



-- * 'ExtPair' instances

instance MkComplex String ExtPair where
  mkComplex s = error "write me" -- Complex (mkPrimary s) (mkExtended "") (VU.empty)



-- * Instances for Complex

-- | The NFData instance. Since these are unboxed vectors, we just need to make
-- sure that evaluation begins.

instance (NFData a, Read a, Show a, VU.Unbox a) => NFData (Complex a) where
  rnf Complex{..} = rnf (VU.length sequence) `seq` rnf structure `seq` rnf (VU.length chain) `seq` ()