ADTN.hs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Data.ADTN where
  3. import Control.Applicative((<|>))
  4. import Data.Attoparsec.ByteString
  5. import Data.Attoparsec.ByteString.Char8
  6. import Data.ByteString (ByteString)
  7. import qualified Data.ByteString as BS
  8. import Data.Map.Strict (Map)
  9. import qualified Data.Map as M
  10. import Data.Text (Text)
  11. import qualified Data.Text as T
  12. import Data.Vector (Vector)
  13. import qualified Data.Vector as V
  14. data Value
  15. = Sum Text Array
  16. | Product Object
  17. | List Array
  18. | Integer Integer
  19. | Double Double
  20. | Symbol Text
  21. | String Text
  22. deriving (Eq, Show)
  23. type Array = Vector Value
  24. type Object = Map Text Value
  25. decodeValue :: ByteString -> Either String Value
  26. decodeValue = parseOnly pVal
  27. where pVal :: Parser Value
  28. pVal = skipSpace *> (pSum <|> pProd <|> pList <|> pLit)
  29. pSum = Sum <$> (char '(' *> skipSpace *> pIdent)
  30. <*> (pValueList <* char ')')
  31. pProd = Product . M.fromList
  32. <$> (char '{' *> pProdBody <* skipSpace <* char '}')
  33. pProdBody = many' pPair
  34. pPair = (,) <$> (skipSpace *> pIdent) <*> pVal
  35. pList = List <$> (char '[' *> pValueList <* skipSpace <* char ']')
  36. pLit = Symbol <$> pIdent
  37. <|> String <$> pString
  38. <|> Integer <$> decimal
  39. pValueList = V.fromList <$> many' pVal
  40. pIdent = T.pack <$> many1' letter_ascii
  41. pString = T.pack <$> (char '"' *> manyTill pStrChar (char '"'))
  42. pStrChar = '\n' <$ string "\\n"
  43. <|> '\t' <$ string "\\t"
  44. <|> '\r' <$ string "\\r"
  45. <|> '\b' <$ string "\\b"
  46. <|> '\f' <$ string "\\f"
  47. <|> '\'' <$ string "\\'"
  48. <|> '\"' <$ string "\\\""
  49. <|> '\\' <$ string "\\\\"
  50. <|> anyChar