module Bio.RNAalifoldParser (
parseRNAalifold,
readRNAalifold,
module Bio.RNAalifoldData
) where
import Bio.RNAalifoldData
import Text.ParserCombinators.Parsec
readDouble :: String -> Double
readDouble = read
genParserRNAalifold :: GenParser Char st RNAalifoldOutput
genParserRNAalifold = do
_sequence <- many1 (noneOf "\n")
newline
secondaryStructure <- many1 (oneOf "&().,")
string (" (")
foldingEnergy <- many1 (noneOf " ")
string " ="
many1 space
initialFoldingEnergy <- many1 (noneOf " ")
string (" +")
many1 space
covarianceContributionEnergy <- many1 (noneOf ")")
string (")")
many1 space
eof
return $ RNAalifoldOutput _sequence secondaryStructure (readDouble foldingEnergy) (readDouble initialFoldingEnergy) (readDouble covarianceContributionEnergy)
parseRNAalifold :: [Char] -> Either ParseError RNAalifoldOutput
parseRNAalifold input = parse genParserRNAalifold "genParseRNAalifold" input
readRNAalifold :: String -> IO (Either ParseError RNAalifoldOutput)
readRNAalifold filePath = parseFromFile genParserRNAalifold filePath