packages feed

uniprot-kb 0.1.1.2 → 0.1.2.0

raw patch · 5 files changed

+205/−132 lines, 5 filesdep ~QuickCheckdep ~hspecPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: QuickCheck, hspec

API changes (from Hackage documentation)

+ Bio.Uniprot.Parser: parseEvidence :: Parser Text
+ Bio.Uniprot.Parser: parseTillChar :: Char -> Parser String
+ Bio.Uniprot.Type: RN :: Int -> [Text] -> RN
+ Bio.Uniprot.Type: [evidence] :: RN -> [Text]
+ Bio.Uniprot.Type: [number] :: RN -> Int
+ Bio.Uniprot.Type: data RN
+ Bio.Uniprot.Type: instance GHC.Classes.Eq Bio.Uniprot.Type.RN
+ Bio.Uniprot.Type: instance GHC.Classes.Ord Bio.Uniprot.Type.RN
+ Bio.Uniprot.Type: instance GHC.Generics.Generic Bio.Uniprot.Type.RN
+ Bio.Uniprot.Type: instance GHC.Show.Show Bio.Uniprot.Type.RN
- Bio.Uniprot.Parser: parseDefItem :: Text -> (Parser Text -> Parser a) -> Parser a
+ Bio.Uniprot.Parser: parseDefItem :: Text -> Parser Text
- Bio.Uniprot.Parser: parseNodes :: Char -> Char -> Text -> ([Text] -> a) -> Parser a
+ Bio.Uniprot.Parser: parseNodes :: Text -> Char -> Char -> Parser [Text]
- Bio.Uniprot.Type: DE :: Maybe Name -> [AltName] -> [Name] -> [DE] -> [DE] -> Maybe Flag -> DE
+ Bio.Uniprot.Type: DE :: Maybe Name -> [AltName] -> [Name] -> [DE] -> [DE] -> [Flag] -> DE
- Bio.Uniprot.Type: Record :: ID -> AC -> DT -> DE -> [GN] -> OS -> Maybe OG -> OC -> OX -> [OH] -> [Reference] -> [CC] -> [DR] -> PE -> Maybe KW -> [FT] -> SQ -> Record
+ Bio.Uniprot.Type: Record :: ID -> AC -> DT -> DE -> [GN] -> OS -> [OG] -> OC -> OX -> [OH] -> [Reference] -> [CC] -> [DR] -> PE -> Maybe KW -> [FT] -> SQ -> Record
- Bio.Uniprot.Type: Reference :: Int -> Text -> [(Token, Text)] -> [(BibliographicDB, Text)] -> Maybe Text -> [Text] -> Maybe Text -> Text -> Reference
+ Bio.Uniprot.Type: Reference :: Int -> Text -> [(Token, Text)] -> [(BibliographicDB, Text)] -> [Text] -> [Text] -> Maybe Text -> Text -> Reference
- Bio.Uniprot.Type: [flags] :: DE -> Maybe Flag
+ Bio.Uniprot.Type: [flags] :: DE -> [Flag]
- Bio.Uniprot.Type: [og] :: Record -> Maybe OG
+ Bio.Uniprot.Type: [og] :: Record -> [OG]
- Bio.Uniprot.Type: [rg] :: Reference -> Maybe Text
+ Bio.Uniprot.Type: [rg] :: Reference -> [Text]

Files

ChangeLog.md view
@@ -5,6 +5,13 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.1.2.0+* Every record in UniProt-KB can be parsed.+* Any capital english letter can be an amino acid.+* Schema was changed a little.+* Multiple fixes on specification bugs.+* Evidence is not parsed any more as it's breaks specification in lots of ways.+ ## 0.1.1.2 * Empty FT description bugfix 
src/Bio/Uniprot/Parser.hs view
@@ -3,17 +3,19 @@ {-# LANGUAGE TupleSections     #-} module Bio.Uniprot.Parser where -import           Prelude              hiding (init, null)-import qualified Prelude              as P (concat, id, init)+import           Prelude              hiding (null)+import qualified Prelude              as P (concat, id, init, last, null, tail)  import           Bio.Uniprot.Type import           Control.Applicative  (liftA2, (<|>)) import           Control.Monad        (unless, when) import           Data.Attoparsec.Text import           Data.Bifunctor       (second)+import           Data.Char            (isSpace) import           Data.Functor         (($>))+import           Data.Monoid          ((<>)) import           Data.Text            (Text, append, concat, init, null, pack,-                                       splitOn, unpack, unwords)+                                       splitOn, unpack, unwords, isPrefixOf)  -- |Describes possible name type of DE section. data NameType = RecName | AltName | SubName | Flags | None@@ -79,7 +81,7 @@     subNames <- many' (endOfLine *> parseNameDE 0 SubName)     includes <- many' (endOfLine *> parseInternal "Includes")     contains <- many' (endOfLine *> parseInternal "Contains")-    flags    <- optional (endOfLine *> parseFlagsDE)+    flags    <- option [] (endOfLine *> parseFlagsDE)     pure DE{..}   where     -- |Parses name section like RecName, AltName or SubName.@@ -91,8 +93,9 @@         pure Name{..}      -- |Parses flag line of DE section-    parseFlagsDE :: Parser Flag-    parseFlagsDE = read . unpack <$> parseDELine 0 Flags ""+    parseFlagsDE :: Parser [Flag]+    parseFlagsDE = fmap (read . unpack) .+                       ("; " `splitOn`) <$> parseDELine 0 Flags ""      -- |Parses AltName lines of DE section     parseAltDE :: Int -> Parser AltName@@ -115,9 +118,8 @@             string tpe             string "="             pure ()-        res <- pack <$> many1 (notChar ';')-        char ';'-        pure res+        result <- pack . P.init <$> many1 (satisfy (not . isEndOfLine))+        pure . head $ " {ECO" `splitOn` result      -- |Parses internal DE entities     parseInternal :: Text -> Parser DE@@ -126,13 +128,13 @@         endOfLine         recName  <- optional $ parseNameDE 2 RecName         altNames <- many' (endOfLine *> parseAltDE 2)-        pure $ DE recName altNames [] [] [] Nothing+        pure $ DE recName altNames [] [] [] []  -- |Parses DE lines of UniProt-KB text file. parseGN :: Parser [GN] parseGN = do     string "GN   "-    geneName <- optional parseGNName+    geneName <- optional $ parseDefItem "Name"     optional $ parseBreak "GN"     synonyms <- option [] $ parseGNList "Synonyms"     optional $ parseBreak "GN"@@ -140,64 +142,73 @@     optional $ parseBreak "GN"     orfNames <- option [] $ parseGNList "ORFNames"     let gn = GN{..}+    optional $ parseBreak "GN"     rest <- option [] $ string "and" *> endOfLine *> parseGN     pure $ gn:rest   where-    -- |Parses `Name` item of GN line-    parseGNName :: Parser Text-    parseGNName = parseDefItem "Name" (P.id <$>)-     -- |Parses any list item of GN line (like `Synonyms` or `ORFNames`)     parseGNList :: Text -> Parser [Text]-    parseGNList name = parseDefItem name (splitOn ", " <$>)+    parseGNList name = splitOn ", " <$> parseDefItem name  -- |Parses OS lines for one record of UniProt-KB text file. parseOS :: Parser OS-parseOS = OS . pack <$> parseOSStr-  where-    parseOSStr :: Parser String-    parseOSStr = do-        string "OS   "-        namePart <- many1 (satisfy $ not . isEndOfLine)-        if last namePart == '.'-          then pure $ P.init namePart-          else do-              rest <- endOfLine *> parseOSStr-              pure $ namePart ++ rest+parseOS = OS . pack . P.init <$> (string "OS   " >> parseMultiLineComment "OS" 3)  -- |Parser OG line of UniProt-KB text file. parseOG :: Parser OG-parseOG = parseOGNonPlasmid <|> (Plasmid <$> parseOGPlasmid)+parseOG = (parseOGNonPlasmid <* many' (char ' ' >> parseEvidence) <* char '.') <|>+          (Plasmid <$> parseOGPlasmid)   where     parseOGNonPlasmid :: Parser OG     parseOGNonPlasmid = string "OG   " *>-      (string "Hydrogenosome." $> Hydrogenosome) <|>-      (string "Mitochondrion." $> Mitochondrion) <|>-      (string "Nucleomorph." $> Nucleomorph) <|>-      (string "Plastid." $> Plastid PlastidSimple) <|>-      (string "Plastid; Apicoplast." $> Plastid PlastidApicoplast) <|>-      (string "Plastid; Chloroplast." $> Plastid PlastidChloroplast) <|>-      (string "Plastid; Organellar chromatophore." $> Plastid PlastidOrganellarChromatophore) <|>-      (string "Plastid; Cyanelle." $> Plastid PlastidCyanelle) <|>-      (string "Plastid; Non-photosynthetic plastid." $> Plastid PlastidNonPhotosynthetic)+      ((string "Hydrogenosome" $> Hydrogenosome) <|>+       (string "Mitochondrion" $> Mitochondrion) <|>+       (string "Nucleomorph" $> Nucleomorph) <|>+       (string "Plastid; Apicoplast" $> Plastid PlastidApicoplast) <|>+       (string "Plastid; Chloroplast" $> Plastid PlastidChloroplast) <|>+       (string "Plastid; Organellar chromatophore" $> Plastid PlastidOrganellarChromatophore) <|>+       (string "Plastid; Cyanelle" $> Plastid PlastidCyanelle) <|>+       (string "Plastid; Non-photosynthetic plastid" $> Plastid PlastidNonPhotosynthetic) <|>+       (string "Plastid" $> Plastid PlastidSimple))      parseOGPlasmid :: Parser [Text]     parseOGPlasmid = do         string "OG   "-        name <- parseOnePlasmid-        let separator = string "," >> optional " and"-        rest <- many' $ separator *> space *> parseOnePlasmid-        rest2 <- (char '.' $> []) <|> (separator *> endOfLine *> parseOGPlasmid)+        name <- parseAnyPlasmid+        let separator = char ',' >> optional " and"+        rest <- many' $ separator *> char ' ' *> parseAnyPlasmid+        optional separator+        rest2 <- P.concat <$> many' (endOfLine *> parseOGPlasmid)         pure $ name : rest ++ rest2 +    parseAnyPlasmid :: Parser Text+    parseAnyPlasmid = parseOnePlasmid <|>+                      (("Plasmid" <* optional (char ' ' >> parseEvidence)+                                  <* optional (char '.')) $> "") -- ABSAA_ALCSP hack+     parseOnePlasmid :: Parser Text     parseOnePlasmid = do         string "Plasmid "-        pack <$> many1 (satisfy $ liftA2 (&&) (notInClass ",.") (not . isEndOfLine))+        pack <$> parsePlasmidName +    parsePlasmidName :: Parser String+    parsePlasmidName = do+        let p = many1 (satisfy $ liftA2 (&&) (notInClass ",{") (not . isEndOfLine))+        part <- p+        nextChar <- peekChar+        plasmid <- case nextChar of+          Just '{' -> parseEvidence >> optional (char '.') $> P.init part+          _        -> pure part+        pure $ if P.last plasmid == '.' then P.init plasmid else plasmid++    countElem :: Eq a => [a] -> a -> Int+    countElem []     _             = 0+    countElem (x:xs) y | x == y    = 1 + countElem xs y+                       | otherwise = countElem xs y+ -- |Parser OC line of UniProt-KB text file. parseOC :: Parser OC-parseOC = parseNodes ';' '.' "OC" OC+parseOC = OC <$> parseNodes "OC" ';' '.'  -- |Parses OX lines of UniProt-KB text file. parseOX :: Parser OX@@ -214,9 +225,11 @@ parseOH = do     string "OH   NCBI_TaxID="     taxId <- pack <$> many1 (notChar ';')-    string "; "-    hostName <- pack <$> many1 (notChar '.')-    char '.'+    char ';'+    hostName' <- many' (satisfy $ not . isEndOfLine)+    let hostName = pack $ if P.null hostName'+                            then ""+                            else P.tail . P.init $ hostName'     pure OH{..}  -- |Parses RN, RP, RC, RX, RG, RA, RT and RL lines of UniProt-KB text file.@@ -228,14 +241,18 @@     endOfLine     rc <- option [] (parseRCX STRAIN "RC" <* endOfLine)     rx <- option [] (parseRCX MEDLINE "RX" <* endOfLine)-    rg <- optional  (parseRG <* endOfLine)-    ra <- option [] (parseNodes ',' ';' "RA" P.id <* endOfLine)+    rg <- option [] (many' $ parseRG <* endOfLine)+    ra <- option [] (parseNodes "RA" ',' ';' <* endOfLine)     rt <- optional  (parseRT <* endOfLine)     rl <- parseRL     pure Reference{..}   where     parseRN :: Parser Int-    parseRN = (string "RN   [" *> decimal) <* char ']'+    parseRN = do+        number <- (string "RN   [" *> decimal) <* char ']'+        -- Despite the specification, edivence may be presented here+        _ <- many' (char ' ' *> parseEvidence)+        pure number      parseRP :: Parser Text     parseRP = do@@ -250,7 +267,7 @@      where        parseTokPair :: (Enum a, Show a) => a -> Parser (a, Text)        parseTokPair x = foldl1 (<|>) $-                          (\x -> (x,) <$> parseDefItem (pack . show $ x) (P.id <$>)) <$> [x..]+                          (\x -> (x,) <$> parseDefItem (pack . show $ x)) <$> [x..]      parseRG :: Parser Text     parseRG = pack <$> (string "RG   " *> many1 (satisfy $ not . isEndOfLine))@@ -275,7 +292,7 @@     topic <- pack <$> many1 (notChar ':')     char ':'     (char ' ' $> ()) <|> (endOfLine >> string "CC" >> count 7 space $> ())-    comment <- pack <$> parseMultiLineComment "CC" 7+    comment <- head . (" {ECO" `splitOn`) . pack <$> parseMultiLineComment "CC" 7     pure CC{..}  -- |Parses DR lines of UniProt-KB text file.@@ -283,16 +300,29 @@ parseDR = do     string "DR   "     resourceAbbr <- parseToken-    string "; "+    char ' '     resourceId <- parseToken-    string "; "-    optionalInfo' <- (:) <$> parseToken <*> many' (string "; " *> parseToken)-    let optionalInfo = P.init optionalInfo' ++ [init . last $ optionalInfo']+    optionalInfo <- many1 (char ' ' *> parseToken)     pure DR{..}   where     parseToken :: Parser Text-    parseToken = pack <$> many1 (satisfy $ liftA2 (&&) (notInClass ";") (not . isEndOfLine))+    parseToken = pack <$> parseTokenStr +    parseTokenStr :: Parser String+    parseTokenStr = do+        part <- many1 (satisfy $ liftA2 (&&) (/=';') (not . isEndOfLine))+        nextChar <- peekChar+        case nextChar of+          Nothing  -> pure . P.init $ part+          Just ';' -> do+              char ';'+              nextChar <- peekChar+              case nextChar of+                Nothing -> fail "You cannot be here"+                Just c  | isSpace c -> pure part+                Just c  -> (part <>) . (';':) <$> parseTokenStr+          Just c  -> pure . P.init $ part+ -- |Parses PE line of UniProt-KB text file. parsePE :: Parser PE parsePE = (string "PE   1: Evidence at protein level;" $> EvidenceAtProteinLevel) <|>@@ -303,7 +333,7 @@  -- |Parses KW lines of UniProt-KB text file. parseKW :: Parser KW-parseKW = parseNodes ';' '.' "KW" KW+parseKW = KW <$> parseNodes "KW" ';' '.'  -- |Parses FT lines of UniProt-KB text file. One FT section is parsed. parseFT :: Parser FT@@ -314,7 +344,7 @@     fromEP <- parseFTEndpoint     many1 space     toEP <- parseFTEndpoint-    description <- splitByMagic <$>+    description <- filter (not . ("{ECO" `isPrefixOf`)) . splitByMagic <$>                      ((many' (char ' ') *> parseMultiLineComment "FT" 32) <|>                       (hyphenConcat <$> parseMultiLine "FT" 32))     pure FT{..}@@ -355,7 +385,7 @@     space >> string "CRC64;"     endOfLine     sequence <- pack . P.concat <$>-                  many1 (skipSpace *> many1 (satisfy $ inClass "ACDEFGHIKLMNPQRSTVWY"))+                  many1 (skipSpace *> many1 (satisfy $ inClass "A-Z"))     pure SQ{..}  -- |Parses end of one UniProt record.@@ -370,7 +400,7 @@                      <*>           (parseDE  <* endOfLine)                      <*> option [] (parseGN  <* endOfLine)                      <*>           (parseOS  <* endOfLine)-                     <*> optional  (parseOG  <* endOfLine)+                     <*> many'     (parseOG  <* endOfLine)                      <*>           (parseOC  <* endOfLine)                      <*>           (parseOX  <* endOfLine)                      <*> many'     (parseOH  <* endOfLine)@@ -383,6 +413,10 @@                      <*>           (parseSQ  <* endOfLine)                      <*            parseEnd +parseEvidence :: Parser Text+parseEvidence = (\x y z -> x <> y <> z) <$>+                  string "{" <*> (pack <$> many1 (notChar '}')) <*> string "}"+ -- = Helper parsers  -- |Transforms any parser to a parser of maybe value.@@ -395,22 +429,29 @@ optional :: Parser a -> Parser (Maybe a) optional par = option Nothing (Just <$> par) --- |Parses lines, that contain nodes splitted by ';' and ended by '.'.-parseNodes :: Char          -- ^Delimeter char, that splits the nodes.+-- |Parses lines, that contain nodes splitted by `del` and ended by `end`.+parseNodes :: Text          -- ^Start 2-letter mark.+           -> Char          -- ^Delimeter char, that splits the nodes.            -> Char          -- ^Terminal char, that ends the node list.-           -> Text          -- ^Start 2-letter mark.-           -> ([Text] -> a) -- ^Text modifier-           -> Parser a-parseNodes del end start f = do-    string start >> count 3 space-    name <- parseNode-    rest <- many' $ do-        char del-        string " " <|> (endOfLine >> string start >> count 3 space >> pure "")-        parseNode-    char end-    pure $ f (name:rest)+           -> Parser [Text]+parseNodes start del end = do+    string start >> count 3 (char ' ')+    parseNodesNoStart   where+    parseNodesNoStart :: Parser [Text]+    parseNodesNoStart = do+        part <- parseNode+        c <- char del <|> char end+        if c == del+          then do (char ' ' $> ()) <|> (endOfLine >> string start >> count 3 (char ' ') $> ())+                  (part :) <$> parseNodesNoStart+          else do nextChar <- peekChar+                  case nextChar of+                    Nothing                -> pure [part]+                    Just c | isEndOfLine c -> pure [part]+                    Just c                 -> do (x:xs) <- parseNodesNoStart+                                                 pure (part <> x : xs)+     parseNode :: Parser Text     parseNode = pack <$> many1 (satisfy $ liftA2 (&&) (notInClass [del,end]) (not . isEndOfLine)) @@ -420,10 +461,9 @@  -- |Parses multiline comment as one string. parseMultiLineComment :: Text -> Int -> Parser String-parseMultiLineComment start skip = do-    comm <- (:) <$> parseTillEnd-                <*> parseMultiLine start skip-    pure $ hyphenConcat comm+parseMultiLineComment start skip = hyphenConcat <$>+                                     ((:) <$> parseTillEnd+                                          <*> parseMultiLine start skip)  -- |Parses multiline comment from new line. parseMultiLine :: Text -> Int -> Parser [String]@@ -438,11 +478,31 @@ parseBreak txt = ((endOfLine >> string txt >> string "   ") <|> string " ") $> ()  -- |Parses one item like "Something=Something else;"-parseDefItem :: Text -> (Parser Text -> Parser a) -> Parser a-parseDefItem name f = do+parseDefItem :: Text -> Parser Text+parseDefItem name = do     string name >> char '='-    f (pack <$> many1 (notChar ';')) <* char ';'+    head . (" {" `splitOn`) . pack <$> parseTillChar ';' +-- |Parses line till specific char (e.g. semicolon or dot) before space/endOfLine/endOfInput.+parseTillChar :: Char -> Parser String+parseTillChar c = do+    part <- many1 $ satisfy $ liftA2 (&&) (/=c) (not . isEndOfLine)+    nextChar <- peekChar+    case nextChar of+      Nothing                -> fail "You cannot be here!"+      Just d | d == c        -> do+          char c+          nextChar <- peekChar+          case nextChar of+            Nothing -> pure part+            Just d  | isSpace d -> pure part+            Just d  -> (part <>) . (d:) <$> parseTillChar c+      Just d | isEndOfLine d -> do+          endOfLine+          count 2 anyChar+          count 2 (char ' ')+          (part <>) <$> parseTillChar c+ -- |Delete needless space after hyphen on concat. hyphenConcat :: [String] -> String hyphenConcat []       = []@@ -453,6 +513,6 @@     sy | last x == '-'                  = tail y        | isAA (last x) && isAA (y !! 1) = tail y        | otherwise                      = y-    +     isAA :: Char -> Bool-    isAA = inClass "ACDEFGHIKLMNPQRSTVWY"+    isAA = inClass "A-Z"
src/Bio/Uniprot/Type.hs view
@@ -92,7 +92,7 @@   , subNames :: [Name]     -- ^A name provided by the submitter of the underlying nucleotide sequence.   , includes :: [DE]       -- ^A protein is known to include multiple functional domains each of which is described by a different name.   , contains :: [DE]       -- ^The functional domains of an enzyme are cleaved, but the catalytic activity can only be observed, when the individual chains reorganize in a complex.-  , flags    :: Maybe Flag -- ^Flags whether the entire is a precursor or/and a fragment.+  , flags    :: [Flag]     -- ^Flags whether the entire is a precursor or/and a fragment.   } deriving (Generic, Show, Eq, Ord)  -- |Gene Name - the name(s) of the gene(s) that code for the stored@@ -164,13 +164,19 @@                      | AGRICOLA   deriving (Generic, Show, Eq, Ord, Bounded, Enum) +-- |Reference Number - a sequential number to each reference citation in an entry.+data RN = RN+  { number   :: Int+  , evidence :: [Text]+  } deriving (Generic, Show, Eq, Ord)+ -- |Reference lines. data Reference = Reference   { rn :: Int                       -- ^Reference Number - a sequential number to each reference citation in an entry.   , rp :: Text                      -- ^Reference Position - the extent of the work relevant to the entry carried out by the authors.   , rc :: [(Token, Text)]           -- ^Reference Comment - comments relevant to the reference cited.   , rx :: [(BibliographicDB, Text)] -- ^Reference cross-reference - the identifier assigned to a specific reference in a bibliographic database.-  , rg :: Maybe Text                -- ^Reference Group - the consortium name associated with a given citation.+  , rg :: [Text]                    -- ^Reference Group - the consortium name associated with a given citation.   , ra :: [Text]                    -- ^Reference Author - authors of the paper (or other work) cited.   , rt :: Maybe Text                -- ^Reference Title - the title of the paper (or other work) cited as exactly as possible given the limitations of the computer character set.   , rl :: Text                      -- ^Reference Location - he conventional citation information for the reference.@@ -245,7 +251,7 @@   , de   :: DE   , gn   :: [GN]   , os   :: OS-  , og   :: Maybe OG+  , og   :: [OG]   , oc   :: OC   , ox   :: OX   , oh   :: [OH]
test/Spec.hs view
@@ -707,23 +707,23 @@  deAns :: DE deAns = DE (Just (Name "Programmed cell death protein 1" ["Protein PD-1", "hPD-1"] []))-           [CDAntigen "CD279"] [] [] [] (Just Precursor)+           [CDAntigen "CD279"] [] [] [] [Precursor]  de2Ans :: DE de2Ans = DE (Just (Name "Arginine biosynthesis bifunctional protein argJ" [] [])) [] []             [DE (Just (Name "Glutamate N-acetyltransferase" [] ["2.3.1.35"]))                 [Simple (Name "Ornithine acetyltransferase" ["OATase"] []),                  Simple (Name "Ornithine transacetylase" [] [])]-                [] [] [] Nothing,+                [] [] [] [],              DE (Just (Name "Amino-acid acetyltransferase" [] ["2.3.1.1"]))                 [Simple (Name "N-acetylglutamate synthase" ["AGS"] [])]-                [] [] [] Nothing+                [] [] [] []             ]             [DE (Just (Name "Arginine biosynthesis bifunctional protein argJ alpha chain" [] []))-                [] [] [] [] Nothing,+                [] [] [] [] [],              DE (Just (Name "Arginine biosynthesis bifunctional protein argJ beta chain" [] []))-                [] [] [] [] Nothing]-            Nothing+                [] [] [] [] []]+            []  gnAns :: [GN] gnAns = [GN (Just "PDCD1") ["PD1"] [] []]@@ -747,24 +747,24 @@ oxAns = OX "NCBI_TaxID" "9606"  refAns :: [Reference]-refAns = [Reference 1 "NUCLEOTIDE SEQUENCE [GENOMIC DNA]" [] [(PubMed,"7851902"),(DOI,"10.1006/geno.1994.1562")] Nothing ["Shinohara T.","Taniwaki M.","Ishida Y.","Kawaich M.","Honjo T."] (Just "Structure and chromosomal localization of the human PD-1 gene (PDCD1).") "Genomics 23:704-706(1994)",-          Reference 2 "NUCLEOTIDE SEQUENCE [MRNA]" [] [(PubMed,"9332365"),(DOI,"10.1016/S0378-1119(97)00260-6")] Nothing ["Finger L.R.","Pu J.","Wasserman R.","Vibhakar R.","Louie E.","Hardy R.R.","Burrows P.D.","Billips L.D."] (Just "The human PD-1 gene: complete cDNA, genomic organization, and developmentally regulated expression in B cell progenitors.") "Gene 197:177-187(1997)",-          Reference 3 "ERRATUM" [] [] Nothing ["Finger L.R.","Pu J.","Wasserman R.","Vibhakar R.","Louie E.","Hardy R.R.","Burrows P.D.","Billips L.D."] Nothing "Gene 203:253-253(1997)",-          Reference 4 "NUCLEOTIDE SEQUENCE [GENOMIC DNA], AND INVOLVEMENT IN SLEB2" [] [(PubMed,"12402038"),(DOI,"10.1038/ng1020")] Nothing ["Prokunina L.","Castillejo-Lopez C.","Oberg F.","Gunnarsson I.","Berg L.","Magnusson V.","Brookes A.J.","Tentler D.","Kristjansdottir H.","Grondal G.","Bolstad A.I.","Svenungsson E.","Lundberg I.","Sturfelt G.","Jonssen A.","Truedsson L.","Lima G.","Alcocer-Varela J.","Jonsson R.","Gyllensten U.B.","Harley J.B.","Alarcon-Segovia D.","Steinsson K.","Alarcon-Riquelme M.E."] (Just "A regulatory polymorphism in PDCD1 is associated with susceptibility to systemic lupus erythematosus in humans.") "Nat. Genet. 32:666-669(2002)",-          Reference 5 "NUCLEOTIDE SEQUENCE [MRNA]" [] [] Nothing ["He X.","Xu L.","Liu Y.","Zeng Y."] (Just "Cloning of PD-1 cDNA from activated peripheral leukocytes.") "Submitted (FEB-2003) to the EMBL/GenBank/DDBJ databases",-          Reference 6 "NUCLEOTIDE SEQUENCE [GENOMIC DNA]" [] [] Nothing ["Livingston R.J.","Shaffer T.","McFarland I.","Nguyen C.P.","Stanaway I.B.","Rajkumar N.","Johnson E.J.","da Ponte S.H.","Willa H.","Ahearn M.O.","Bertucci C.","Acklestad J.","Carroll A.","Swanson J.","Gildersleeve H.I.","Nickerson D.A."] Nothing "Submitted (OCT-2006) to the EMBL/GenBank/DDBJ databases",-          Reference 7 "NUCLEOTIDE SEQUENCE [LARGE SCALE MRNA]" [] [(PubMed,"14702039"),(DOI,"10.1038/ng1285")] Nothing ["Ota T.","Suzuki Y.","Nishikawa T.","Otsuki T.","Sugiyama T.","Irie R.","Wakamatsu A.","Hayashi K.","Sato H.","Nagai K.","Kimura K.","Makita H.","Sekine M.","Obayashi M.","Nishi T.","Shibahara T.","Tanaka T.","Ishii S.","Yamamoto J.","Saito K.","Kawai Y.","Isono Y.","Nakamura Y.","Nagahari K.","Murakami K.","Yasuda T.","Iwayanagi T.","Wagatsuma M.","Shiratori A.","Sudo H.","Hosoiri T.","Kaku Y.","Kodaira H.","Kondo H.","Sugawara M.","Takahashi M.","Kanda K.","Yokoi T.","Furuya T.","Kikkawa E.","Omura Y.","Abe K.","Kamihara K.","Katsuta N.","Sato K.","Tanikawa M.","Yamazaki M.","Ninomiya K.","Ishibashi T.","Yamashita H.","Murakawa K.","Fujimori K.","Tanai H.","Kimata M.","Watanabe M.","Hiraoka S.","Chiba Y.","Ishida S.","Ono Y.","Takiguchi S.","Watanabe S.","Yosida M.","Hotuta T.","Kusano J.","Kanehori K.","Takahashi-Fujii A.","Hara H.","Tanase T.-O.","Nomura Y.","Togiya S.","Komai F.","Hara R.","Takeuchi K.","Arita M.","Imose N.","Musashino K.","Yuuki H.","Oshima A.","Sasaki N.","Aotsuka S.","Yoshikawa Y.","Matsunawa H.","Ichihara T.","Shiohata N.","Sano S.","Moriya S.","Momiyama H.","Satoh N.","Takami S.","Terashima Y.","Suzuki O.","Nakagawa S.","Senoh A.","Mizoguchi H.","Goto Y.","Shimizu F.","Wakebe H.","Hishigaki H.","Watanabe T.","Sugiyama A.","Takemoto M.","Kawakami B.","Yamazaki M.","Watanabe K.","Kumagai A.","Itakura S.","Fukuzumi Y.","Fujimori Y.","Komiyama M.","Tashiro H.","Tanigami A.","Fujiwara T.","Ono T.","Yamada K.","Fujii Y.","Ozaki K.","Hirao M.","Ohmori Y.","Kawabata A.","Hikiji T.","Kobatake N.","Inagaki H.","Ikema Y.","Okamoto S.","Okitani R.","Kawakami T.","Noguchi S.","Itoh T.","Shigeta K.","Senba T.","Matsumura K.","Nakajima Y.","Mizuno T.","Morinaga M.","Sasaki M.","Togashi T.","Oyama M.","Hata H.","Watanabe M.","Komatsu T.","Mizushima-Sugano J.","Satoh T.","Shirai Y.","Takahashi Y.","Nakagawa K.","Okumura K.","Nagase T.","Nomura N.","Kikuchi H.","Masuho Y.","Yamashita R.","Nakai K.","Yada T.","Nakamura Y.","Ohara O.","Isogai T.","Sugano S."] (Just "Complete sequencing and characterization of 21,243 full-length human cDNAs.") "Nat. Genet. 36:40-45(2004)",-          Reference 8 "NUCLEOTIDE SEQUENCE [LARGE SCALE MRNA]" [] [(PubMed,"15489334"),(DOI,"10.1101/gr.2596504")] (Just "The MGC Project Team;") [] (Just "The status, quality, and expansion of the NIH full-length cDNA project: the Mammalian Gene Collection (MGC).") "Genome Res. 14:2121-2127(2004)",-          Reference 9 "NUCLEOTIDE SEQUENCE [LARGE SCALE GENOMIC DNA]" [] [] Nothing ["Mural R.J.","Istrail S.","Sutton G.","Florea L.","Halpern A.L.","Mobarry C.M.","Lippert R.","Walenz B.","Shatkay H.","Dew I.","Miller J.R.","Flanigan M.J.","Edwards N.J.","Bolanos R.","Fasulo D.","Halldorsson B.V.","Hannenhalli S.","Turner R.","Yooseph S.","Lu F.","Nusskern D.R.","Shue B.C.","Zheng X.H.","Zhong F.","Delcher A.L.","Huson D.H.","Kravitz S.A.","Mouchard L.","Reinert K.","Remington K.A.","Clark A.G.","Waterman M.S.","Eichler E.E.","Adams M.D.","Hunkapiller M.W.","Myers E.W.","Venter J.C."] Nothing "Submitted (JUL-2005) to the EMBL/GenBank/DDBJ databases",-          Reference 10 "FUNCTION" [] [(PubMed,"21276005"),(DOI,"10.1111/j.1749-6632.2010.05919.x")] Nothing ["Fife B.T.","Pauken K.E."] (Just "The role of the PD-1 pathway in autoimmunity and peripheral tolerance.") "Ann. N. Y. Acad. Sci. 1217:45-59(2011)"]+refAns = [Reference 1 "NUCLEOTIDE SEQUENCE [GENOMIC DNA]" [] [(PubMed,"7851902"),(DOI,"10.1006/geno.1994.1562")] [] ["Shinohara T.","Taniwaki M.","Ishida Y.","Kawaich M.","Honjo T."] (Just "Structure and chromosomal localization of the human PD-1 gene (PDCD1).") "Genomics 23:704-706(1994)",+          Reference 2 "NUCLEOTIDE SEQUENCE [MRNA]" [] [(PubMed,"9332365"),(DOI,"10.1016/S0378-1119(97)00260-6")] [] ["Finger L.R.","Pu J.","Wasserman R.","Vibhakar R.","Louie E.","Hardy R.R.","Burrows P.D.","Billips L.D."] (Just "The human PD-1 gene: complete cDNA, genomic organization, and developmentally regulated expression in B cell progenitors.") "Gene 197:177-187(1997)",+          Reference 3 "ERRATUM" [] [] [] ["Finger L.R.","Pu J.","Wasserman R.","Vibhakar R.","Louie E.","Hardy R.R.","Burrows P.D.","Billips L.D."] Nothing "Gene 203:253-253(1997)",+          Reference 4 "NUCLEOTIDE SEQUENCE [GENOMIC DNA], AND INVOLVEMENT IN SLEB2" [] [(PubMed,"12402038"),(DOI,"10.1038/ng1020")] [] ["Prokunina L.","Castillejo-Lopez C.","Oberg F.","Gunnarsson I.","Berg L.","Magnusson V.","Brookes A.J.","Tentler D.","Kristjansdottir H.","Grondal G.","Bolstad A.I.","Svenungsson E.","Lundberg I.","Sturfelt G.","Jonssen A.","Truedsson L.","Lima G.","Alcocer-Varela J.","Jonsson R.","Gyllensten U.B.","Harley J.B.","Alarcon-Segovia D.","Steinsson K.","Alarcon-Riquelme M.E."] (Just "A regulatory polymorphism in PDCD1 is associated with susceptibility to systemic lupus erythematosus in humans.") "Nat. Genet. 32:666-669(2002)",+          Reference 5 "NUCLEOTIDE SEQUENCE [MRNA]" [] [] [] ["He X.","Xu L.","Liu Y.","Zeng Y."] (Just "Cloning of PD-1 cDNA from activated peripheral leukocytes.") "Submitted (FEB-2003) to the EMBL/GenBank/DDBJ databases",+          Reference 6 "NUCLEOTIDE SEQUENCE [GENOMIC DNA]" [] [] [] ["Livingston R.J.","Shaffer T.","McFarland I.","Nguyen C.P.","Stanaway I.B.","Rajkumar N.","Johnson E.J.","da Ponte S.H.","Willa H.","Ahearn M.O.","Bertucci C.","Acklestad J.","Carroll A.","Swanson J.","Gildersleeve H.I.","Nickerson D.A."] Nothing "Submitted (OCT-2006) to the EMBL/GenBank/DDBJ databases",+          Reference 7 "NUCLEOTIDE SEQUENCE [LARGE SCALE MRNA]" [] [(PubMed,"14702039"),(DOI,"10.1038/ng1285")] [] ["Ota T.","Suzuki Y.","Nishikawa T.","Otsuki T.","Sugiyama T.","Irie R.","Wakamatsu A.","Hayashi K.","Sato H.","Nagai K.","Kimura K.","Makita H.","Sekine M.","Obayashi M.","Nishi T.","Shibahara T.","Tanaka T.","Ishii S.","Yamamoto J.","Saito K.","Kawai Y.","Isono Y.","Nakamura Y.","Nagahari K.","Murakami K.","Yasuda T.","Iwayanagi T.","Wagatsuma M.","Shiratori A.","Sudo H.","Hosoiri T.","Kaku Y.","Kodaira H.","Kondo H.","Sugawara M.","Takahashi M.","Kanda K.","Yokoi T.","Furuya T.","Kikkawa E.","Omura Y.","Abe K.","Kamihara K.","Katsuta N.","Sato K.","Tanikawa M.","Yamazaki M.","Ninomiya K.","Ishibashi T.","Yamashita H.","Murakawa K.","Fujimori K.","Tanai H.","Kimata M.","Watanabe M.","Hiraoka S.","Chiba Y.","Ishida S.","Ono Y.","Takiguchi S.","Watanabe S.","Yosida M.","Hotuta T.","Kusano J.","Kanehori K.","Takahashi-Fujii A.","Hara H.","Tanase T.-O.","Nomura Y.","Togiya S.","Komai F.","Hara R.","Takeuchi K.","Arita M.","Imose N.","Musashino K.","Yuuki H.","Oshima A.","Sasaki N.","Aotsuka S.","Yoshikawa Y.","Matsunawa H.","Ichihara T.","Shiohata N.","Sano S.","Moriya S.","Momiyama H.","Satoh N.","Takami S.","Terashima Y.","Suzuki O.","Nakagawa S.","Senoh A.","Mizoguchi H.","Goto Y.","Shimizu F.","Wakebe H.","Hishigaki H.","Watanabe T.","Sugiyama A.","Takemoto M.","Kawakami B.","Yamazaki M.","Watanabe K.","Kumagai A.","Itakura S.","Fukuzumi Y.","Fujimori Y.","Komiyama M.","Tashiro H.","Tanigami A.","Fujiwara T.","Ono T.","Yamada K.","Fujii Y.","Ozaki K.","Hirao M.","Ohmori Y.","Kawabata A.","Hikiji T.","Kobatake N.","Inagaki H.","Ikema Y.","Okamoto S.","Okitani R.","Kawakami T.","Noguchi S.","Itoh T.","Shigeta K.","Senba T.","Matsumura K.","Nakajima Y.","Mizuno T.","Morinaga M.","Sasaki M.","Togashi T.","Oyama M.","Hata H.","Watanabe M.","Komatsu T.","Mizushima-Sugano J.","Satoh T.","Shirai Y.","Takahashi Y.","Nakagawa K.","Okumura K.","Nagase T.","Nomura N.","Kikuchi H.","Masuho Y.","Yamashita R.","Nakai K.","Yada T.","Nakamura Y.","Ohara O.","Isogai T.","Sugano S."] (Just "Complete sequencing and characterization of 21,243 full-length human cDNAs.") "Nat. Genet. 36:40-45(2004)",+          Reference 8 "NUCLEOTIDE SEQUENCE [LARGE SCALE MRNA]" [] [(PubMed,"15489334"),(DOI,"10.1101/gr.2596504")] ["The MGC Project Team;"] [] (Just "The status, quality, and expansion of the NIH full-length cDNA project: the Mammalian Gene Collection (MGC).") "Genome Res. 14:2121-2127(2004)",+          Reference 9 "NUCLEOTIDE SEQUENCE [LARGE SCALE GENOMIC DNA]" [] [] [] ["Mural R.J.","Istrail S.","Sutton G.","Florea L.","Halpern A.L.","Mobarry C.M.","Lippert R.","Walenz B.","Shatkay H.","Dew I.","Miller J.R.","Flanigan M.J.","Edwards N.J.","Bolanos R.","Fasulo D.","Halldorsson B.V.","Hannenhalli S.","Turner R.","Yooseph S.","Lu F.","Nusskern D.R.","Shue B.C.","Zheng X.H.","Zhong F.","Delcher A.L.","Huson D.H.","Kravitz S.A.","Mouchard L.","Reinert K.","Remington K.A.","Clark A.G.","Waterman M.S.","Eichler E.E.","Adams M.D.","Hunkapiller M.W.","Myers E.W.","Venter J.C."] Nothing "Submitted (JUL-2005) to the EMBL/GenBank/DDBJ databases",+          Reference 10 "FUNCTION" [] [(PubMed,"21276005"),(DOI,"10.1111/j.1749-6632.2010.05919.x")] [] ["Fife B.T.","Pauken K.E."] (Just "The role of the PD-1 pathway in autoimmunity and peripheral tolerance.") "Ann. N. Y. Acad. Sci. 1217:45-59(2011)"]  ccAns :: [CC]-ccAns = [CC "FUNCTION" "Inhibitory cell surface receptor involved in the regulation of T-cell function during immunity and tolerance. Upon ligand binding, inhibits T-cell effector functions in an antigen-specific manner. Possible cell death inducer, in association with other factors. {ECO:0000269|PubMed:21276005}.",-         CC "SUBUNIT" "Monomer. {ECO:0000250}.",+ccAns = [CC "FUNCTION" "Inhibitory cell surface receptor involved in the regulation of T-cell function during immunity and tolerance. Upon ligand binding, inhibits T-cell effector functions in an antigen-specific manner. Possible cell death inducer, in association with other factors.",+         CC "SUBUNIT" "Monomer.",          CC "INTERACTION" "Q9NZQ7:CD274; NbExp=2; IntAct=EBI-4314328, EBI-4314282; Q9NZQ7-1:CD274; NbExp=2; IntAct=EBI-4314328, EBI-15686469; Q06124:PTPN11; NbExp=3; IntAct=EBI-4314328, EBI-297779;",          CC "SUBCELLULAR LOCATION" "Membrane; Single-pass type I membrane protein.",          CC "DEVELOPMENTAL STAGE" "Induced at programmed cell death.",-         CC "DISEASE" "Systemic lupus erythematosus 2 (SLEB2) [MIM:605218]: A chronic, relapsing, inflammatory, and often febrile multisystemic disorder of connective tissue, characterized principally by involvement of the skin, joints, kidneys and serosal membranes. It is of unknown etiology, but is thought to represent a failure of the regulatory mechanisms of the autoimmune system. The disease is marked by a wide range of system dysfunctions, an elevated erythrocyte sedimentation rate, and the formation of LE cells in the blood or bone marrow. {ECO:0000269|PubMed:12402038}. Note=Disease susceptibility is associated with variations affecting the gene represented in this entry."]+         CC "DISEASE" "Systemic lupus erythematosus 2 (SLEB2) [MIM:605218]: A chronic, relapsing, inflammatory, and often febrile multisystemic disorder of connective tissue, characterized principally by involvement of the skin, joints, kidneys and serosal membranes. It is of unknown etiology, but is thought to represent a failure of the regulatory mechanisms of the autoimmune system. The disease is marked by a wide range of system dysfunctions, an elevated erythrocyte sedimentation rate, and the formation of LE cells in the blood or bone marrow."]  drAns :: [DR] drAns = [DR "EMBL" "L27440" ["AAC41700.1","-","Genomic_DNA"],@@ -894,33 +894,33 @@             "Transmembrane", "Transmembrane helix"]  ftAns :: [FT]-ftAns = [FT "SIGNAL"   (ExactEP 1)   (ExactEP 20)  ["{ECO:0000255}"],+ftAns = [FT "SIGNAL"   (ExactEP 1)   (ExactEP 20)  [],          FT "CHAIN"    (ExactEP 21)  (ExactEP 288) ["Programmed cell death protein 1","/FTId=PRO_0000014892"],-         FT "TOPO_DOM" (ExactEP 21)  (ExactEP 170) ["Extracellular","{ECO:0000255}"],-         FT "TRANSMEM" (ExactEP 171) (ExactEP 191) ["Helical","{ECO:0000255}"],-         FT "TOPO_DOM" (ExactEP 192) (ExactEP 288) ["Cytoplasmic","{ECO:0000255}"],+         FT "TOPO_DOM" (ExactEP 21)  (ExactEP 170) ["Extracellular"],+         FT "TRANSMEM" (ExactEP 171) (ExactEP 191) ["Helical"],+         FT "TOPO_DOM" (ExactEP 192) (ExactEP 288) ["Cytoplasmic"],          FT "DOMAIN"   (ExactEP 35)  (ExactEP 145) ["Ig-like V-type"],-         FT "CARBOHYD" (ExactEP 49)  (ExactEP 49)  ["N-linked (GlcNAc...) asparagine","{ECO:0000255}"],-         FT "CARBOHYD" (ExactEP 58)  (ExactEP 58)  ["N-linked (GlcNAc...) asparagine","{ECO:0000255}"],-         FT "CARBOHYD" (ExactEP 74)  (ExactEP 74)  ["N-linked (GlcNAc...) asparagine","{ECO:0000255}"],-         FT "CARBOHYD" (ExactEP 116) (ExactEP 116) ["N-linked (GlcNAc...) asparagine","{ECO:0000255}"],-         FT "DISULFID" (ExactEP 54)  (ExactEP 123) ["{ECO:0000255|PROSITE-ProRule:PRU00114}"],+         FT "CARBOHYD" (ExactEP 49)  (ExactEP 49)  ["N-linked (GlcNAc...) asparagine"],+         FT "CARBOHYD" (ExactEP 58)  (ExactEP 58)  ["N-linked (GlcNAc...) asparagine"],+         FT "CARBOHYD" (ExactEP 74)  (ExactEP 74)  ["N-linked (GlcNAc...) asparagine"],+         FT "CARBOHYD" (ExactEP 116) (ExactEP 116) ["N-linked (GlcNAc...) asparagine"],+         FT "DISULFID" (ExactEP 54)  (ExactEP 123) [],          FT "VARIANT"  (ExactEP 215) (ExactEP 215) ["A -> V (in dbSNP:rs2227982)","/FTId=VAR_031685"],-         FT "CONFLICT" (ExactEP 38)  (ExactEP 38)  ["S -> F (in Ref. 2; AAC51773)","{ECO:0000305}"],-         FT "CONFLICT" (ExactEP 162) (ExactEP 162) ["P -> S (in Ref. 1; AAC41700)","{ECO:0000305}"],-         FT "STRAND"   (ExactEP 27)  (ExactEP 29)  ["{ECO:0000244|PDB:5WT9}"],-         FT "STRAND"   (ExactEP 36)  (ExactEP 38)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 40)  (ExactEP 45)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 50)  (ExactEP 55)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 60)  (ExactEP 70)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 72)  (ExactEP 74)  ["{ECO:0000244|PDB:4ZQK}"],-         FT "STRAND"   (ExactEP 76)  (ExactEP 83)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 95)  (ExactEP 99)  ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 103) (ExactEP 112) ["{ECO:0000244|PDB:5GGS}"],-         FT "HELIX"    (ExactEP 115) (ExactEP 117) ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 119) (ExactEP 131) ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 134) (ExactEP 136) ["{ECO:0000244|PDB:5GGS}"],-         FT "STRAND"   (ExactEP 140) (ExactEP 145) ["{ECO:0000244|PDB:5GGS}"]]+         FT "CONFLICT" (ExactEP 38)  (ExactEP 38)  ["S -> F (in Ref. 2; AAC51773)"],+         FT "CONFLICT" (ExactEP 162) (ExactEP 162) ["P -> S (in Ref. 1; AAC41700)"],+         FT "STRAND"   (ExactEP 27)  (ExactEP 29)  [],+         FT "STRAND"   (ExactEP 36)  (ExactEP 38)  [],+         FT "STRAND"   (ExactEP 40)  (ExactEP 45)  [],+         FT "STRAND"   (ExactEP 50)  (ExactEP 55)  [],+         FT "STRAND"   (ExactEP 60)  (ExactEP 70)  [],+         FT "STRAND"   (ExactEP 72)  (ExactEP 74)  [],+         FT "STRAND"   (ExactEP 76)  (ExactEP 83)  [],+         FT "STRAND"   (ExactEP 95)  (ExactEP 99)  [],+         FT "STRAND"   (ExactEP 103) (ExactEP 112) [],+         FT "HELIX"    (ExactEP 115) (ExactEP 117) [],+         FT "STRAND"   (ExactEP 119) (ExactEP 131) [],+         FT "STRAND"   (ExactEP 134) (ExactEP 136) [],+         FT "STRAND"   (ExactEP 140) (ExactEP 145) []]  sqAns :: SQ sqAns = SQ 288 31647 "A5210FD40C304FB7"@@ -976,7 +976,7 @@     describe "Parse Record" $ do       it "parses PD1 example" $ do         let record = Record idAns acAns dtAns deAns-                            gnAns osAns Nothing ocAns+                            gnAns osAns [] ocAns                             oxAns [] refAns ccAns                             drAns peAns (Just kwAns) ftAns sqAns         parseOnly parseRecord pd1Str `shouldBe` Right record
uniprot-kb.cabal view
@@ -2,10 +2,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: 3ad04521443700a821fc0c490ffa73b63483d95f6b3ac5d48e48355ceeafd473+-- hash: 9af24c0e40ef0eb34e2d32af1de578c10652e2183a255c36438be74a9ce7041f  name:           uniprot-kb-version:        0.1.1.2+version:        0.1.2.0 synopsis:       UniProt-KB format parser description:    Specification implementation of https://web.expasy.org/docs/userman.html category:       Bio