module BioInf.Params.Import where
import Data.PrimitiveArray as PA
import Data.PrimitiveArray.Ix as PA
import Data.Ix (rangeSize)
import BioInf.Params
fromList :: [Double] -> Params
fromList xs = Params
{ hairpinLength = PA.fromList 0 maxLength hpl
, hairpinClose = PA.fromList minExtPairNN maxExtPairNN hpc
, stem = PA.fromList min2ExtPairs max2ExtPairs sp
, stemTriplet = PA.fromList minTriplet maxTriplet tp
, interiorLength = PA.fromList 0 maxLength il
, interiorAsym = PA.fromList 0 maxLength ia
, interiorClose = PA.fromList minExtPairNN maxExtPairNN ip
, bulgeLength = PA.fromList 0 maxLength bl
, bulgeTriplet = PA.fromList minTriplet maxTriplet bt
, bulgeClose = PA.fromList minExtPair maxExtPair bu
, mbClose = PA.fromList minExtPairNN maxExtPairNN mbc
, multiBranched = head mbranched
, multiHelix = head mhelix
, multiUnpaired = head munpaired
, pairDistance = PA.fromList 0 maxDistance dst
, interMolInit = head intermol
} where
rsExtPair = rangeSize (minExtPair,maxExtPair)
rs2ExtPairs = rangeSize (min2ExtPairs,max2ExtPairs)
rsTriplet = rangeSize (minTriplet,maxTriplet)
rsExtPairNN = rangeSize (minExtPairNN,maxExtPairNN)
[hpl,hpc,sp,tp,il,ia,ip,bl,bt,bu,mbc,mbranched,mhelix,munpaired,dst,intermol] = splitXs
[ maxLength+1
, rsExtPairNN
, rs2ExtPairs
, rsTriplet
, maxLength+1
, maxLength+1
, rsExtPairNN
, maxLength+1
, rsTriplet
, rsExtPair
, rsExtPairNN
, 1
, 1
, 1
, maxDistance+1
, 1
]
xs
splitXs :: [Int] -> [Double] -> [[Double]]
splitXs [k] xs
| length xs == k = [xs]
| otherwise = error "splitXs encountered wrong key length on last element"
splitXs (k:ks) xs = let (here,rest) = splitAt k xs in here : splitXs ks rest