module Biobase.Turner.Tables where
import qualified Data.Map as M
import Data.PrimitiveArray
import Data.PrimitiveArray.Ix
data Turner2004 a b c = Turner2004
{ stack :: PrimArray (a,a) c
, dangle3 :: PrimArray (a,b) c
, dangle5 :: PrimArray (a,b) c
, hairpinL :: PrimArray Int c
, hairpinMM :: PrimArray (a,b,b) c
, hairpinLookup :: M.Map [b] c
, bulgeL :: PrimArray Int c
, iloop1x1 :: PrimArray (a,a,b,b) c
, iloop1x2 :: PrimArray (a,a,b,b,b) c
, iloop2x2 :: PrimArray (a,a,b,b,b,b) c
, iloopMM :: PrimArray (a,b,b) c
, iloop2x3MM :: PrimArray (a,b,b) c
, iloop1xnMM :: PrimArray (a,b,b) c
, iloopL :: PrimArray Int c
, multiMM :: PrimArray (a,b,b) c
, ninio :: c
, maxNinio :: c
, multiOffset :: c
, multiNuc :: c
, multiHelix :: c
, extMM :: PrimArray (a,b,b) c
, largeLoop :: Double
, termAU :: c
, intermolecularInit :: c
}
dmap f Turner2004{..} = Turner2004
{ stack = amap f stack
, dangle3 = amap f dangle3
, dangle5 = amap f dangle5
, hairpinL = amap f hairpinL
, hairpinMM = amap f hairpinMM
, hairpinLookup = fmap f hairpinLookup
, bulgeL = amap f bulgeL
, iloop1x1 = amap f iloop1x1
, iloop1x2 = amap f iloop1x2
, iloop2x2 = amap f iloop2x2
, iloopMM = amap f iloopMM
, iloop2x3MM = amap f iloop2x3MM
, iloop1xnMM = amap f iloop1xnMM
, iloopL = amap f iloopL
, multiMM = amap f multiMM
, ninio = f ninio
, maxNinio = f maxNinio
, multiOffset = f multiOffset
, multiNuc = f multiNuc
, multiHelix = f multiHelix
, extMM = amap f extMM
, largeLoop = largeLoop
, termAU = f termAU
, intermolecularInit = f intermolecularInit
}
dZipWith f t1 t2 = Turner2004
{ stack = zipWithPA f (stack t1) (stack t2)
, dangle3 = zipWithPA f (dangle3 t1) (dangle3 t2)
, dangle5 = zipWithPA f (dangle5 t1) (dangle5 t2)
, hairpinL = zipWithPA f (hairpinL t1) (hairpinL t2)
, hairpinMM = zipWithPA f (hairpinMM t1) (hairpinMM t2)
, hairpinLookup = undefined
, bulgeL = zipWithPA f (bulgeL t1) (bulgeL t2)
, iloop1x1 = zipWithPA f (iloop1x1 t1) (iloop1x1 t2)
, iloop1x2 = zipWithPA f (iloop1x2 t1) (iloop1x2 t2)
, iloop2x2 = zipWithPA f (iloop2x2 t1) (iloop2x2 t2)
, iloopMM = zipWithPA f (iloopMM t1) (iloopMM t2)
, iloop2x3MM = zipWithPA f (iloop2x3MM t1) (iloop2x3MM t2)
, iloop1xnMM = zipWithPA f (iloop1xnMM t1) (iloop1xnMM t2)
, iloopL = zipWithPA f (iloopL t1) (iloopL t2)
, multiMM = zipWithPA f (multiMM t1) (multiMM t2)
, ninio = f (ninio t1) (ninio t2)
, maxNinio = f (maxNinio t1) (maxNinio t2)
, multiOffset = f (multiOffset t1) (multiOffset t2)
, multiNuc = f (multiNuc t1) (multiNuc t2)
, multiHelix = f (multiHelix t1) (multiHelix t2)
, extMM = zipWithPA f (extMM t1) (extMM t2)
, largeLoop = largeLoop t1
, termAU = f (termAU t1) (termAU t2)
, intermolecularInit = f (intermolecularInit t1) (intermolecularInit t2)
}
zipWithPA f a1 a2 = let (l,u) = bounds a1 in fromList l u $ zipWith f (toList a1) (toList a2)