module Data.GraphViz.Types.Internal where
import Data.Char( isAsciiUpper
, isAsciiLower
, isDigit
)
isIDString :: String -> Bool
isIDString [] = True
isIDString (f:os) = frstIDString f
&& all restIDString os
frstIDString :: Char -> Bool
frstIDString c = any ($c) [ isAsciiUpper
, isAsciiLower
, (==) '_'
, \ x -> x >= '\200' && x <= '\377'
]
restIDString :: Char -> Bool
restIDString c = frstIDString c || isDigit c
isNumString :: String -> Bool
isNumString "" = False
isNumString str = case str of
('-':str') -> go str'
_ -> go str
where
go [] = False
go cs = case dropWhile isDigit cs of
[] -> True
('.':ds) -> not (null ds) && all isDigit ds
_ -> False
escapeQuotes :: String -> String
escapeQuotes [] = []
escapeQuotes ('"':str) = '\\':'"': escapeQuotes str
escapeQuotes (c:str) = c : escapeQuotes str
descapeQuotes :: String -> String
descapeQuotes [] = []
descapeQuotes ('\\':'"':str) = '"' : descapeQuotes str
descapeQuotes (c:str) = c : descapeQuotes str
bool :: a -> a -> Bool -> a
bool t f b = if b
then t
else f