{-# LANGUAGE PatternSignatures #-} {- GraphViz ------------------------------------------------------\ | | | Copyright (c) 2008, Matthew Sackman (matthew@wellquite.org) | | | | DisTract is freely distributable under the terms of a 3-Clause | | BSD-style license. | | | \-----------------------------------------------------------------} module Data.GraphViz.ParserCombinators where import Text.ParserCombinators.PolyLazy import Control.Monad string :: String -> Parser Char String string = mapM char char :: Char -> Parser Char Char char = satisfy . (==) noneOf :: (Eq a) => [a] -> Parser a a noneOf t = satisfy (\x -> and . map ((/= x) $) $ t) digit :: Parser Char Char digit = oneOf . map char $ ['0'..'9'] number :: (Num a, Read a) => Parser Char a number = liftM read $ many1 digit floatingNumber :: (Floating a, Read a) => Parser Char a floatingNumber = do { a::Integer <- number ; char '.' ; b::Integer <- number ; return . read $ (show a) ++ ('.':(show b)) } whitespace :: Parser Char String whitespace = many1 (oneOf . map char $ [' ', '\t']) optionalQuotedString :: String -> Parser Char String optionalQuotedString s = oneOf [string s, char '"' >> string s >>= \s' -> char '"' >> return s'] optionalQuoted :: Parser Char a -> Parser Char a optionalQuoted p = oneOf [p, char '"' >> p >>= \r -> char '"' >> return r] newline :: Parser Char String newline = oneOf . map string $ ["\r\n", "\n", "\r"] skipToNewline :: Parser Char () skipToNewline = many (noneOf ['\n','\r']) >> newline >> return ()