    -- | Lazy \"many\" combinator for Parsec.
    --   Courtesy of Tomasz Zielonka.

    module Bio.Util.Parsex where
    import Text.ParserCombinators.Parsec

    lazyMany :: GenParser Char () a -> SourceName -> [Char] -> [a]
    lazyMany p file contents = lm state0
          where
            Right state0 = parse getParserState file contents

            lm state = case parse p' "" "" of
                            Left err -> error (show err)
                            Right x -> x
              where
                p' = do
                  setParserState state
                  choice
                    [ do
                        eof
                        return []
                    , do
                        x <- p
                        state' <- getParserState
                        return (x : lm state')
                    ]