{-# LANGUAGE NoMonomorphismRestriction #-}

-- | Turner energy data as used in the ViennaRNA package.
--
-- TODO should use energy type for tables, not int!

module Biobase.Vienna where

import Data.Map (Map,empty)

import Data.Ix.Tuple
import Data.PrimitiveArray.Ix
import Data.PrimitiveArray
import Biobase.Types.Partition
import Biobase.Types.Energy

import Biobase.RNA
import Biobase.Turner.Tables
import Biobase.Constants



-- Type for Vienna Tables

-- type ViennaEnergySet = (Temperature, ViennaTables, ViennaTables)

type ViennaIntTables = Turner2004 ViennaPair Nucleotide Int
type ViennaEnergyTables = Turner2004 ViennaPair Nucleotide Energy
type ViennaPartitionTables = Turner2004 ViennaPair Nucleotide Partition

type Temperature = Double



-- | An empty Turner2004 set, with Vienna-style keys for tables. Unused fields
-- are commented out. Activate them in BiobaseTurner before doing the same
-- here!

emptyTables :: ViennaIntTables
emptyTables = Turner2004
  --stack
  { stack = emptyIV
  --dangle
  , dangle3 = emptyIV
  , dangle5 = emptyIV
  --hairpin
  , hairpinL = emptyV
  , hairpinMM = emptyIV
  , hairpinLookup = empty
  --eInf
  --eInf
  --eInf
  --eInf
  --bulge
  , bulgeL = emptyV
  --eInf
  --internal
  , iloop1x1 = emptyIV
  , iloop1x2 = emptyIV
  , iloop2x2 = emptyIV
  , iloopMM = emptyIV
  , iloop2x3MM = emptyIV
  , iloop1xnMM = emptyIV
  , iloopL = emptyV
  --multibranch
  , multiMM = emptyIV
  , ninio = eInf
  , maxNinio = eInf
  , multiOffset = eInf
  , multiNuc = eInf
  , multiHelix = eInf
  --eInf
  --eInf
  --exterior
  , extMM = emptyIV
  --coaxial stacking
  --emptyIV
  --emptyIV
  --emptyIV
  --scalar values
  , largeLoop = fInf -- large loop is always double
  , termAU = eInf
  , intermolecularInit = eInf
  }

emptyIV = fromAssocs minBound maxBound eInf []

-- TODO should be an empty a
emptyV = fromAssocs 0 30 eInf []