Emit.hs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Data.Adnot.Emit where
  3. import Control.Monad (sequence)
  4. import Data.ByteString.Lazy (ByteString)
  5. import Data.ByteString.Builder
  6. import Data.List (intersperse)
  7. import qualified Data.Map.Strict as M
  8. import Data.Monoid ((<>))
  9. import Data.Text (Text)
  10. import Data.Text.Encoding (encodeUtf8)
  11. import qualified Data.Vector as V
  12. import Data.Adnot.Type
  13. encodeValue :: Value -> ByteString
  14. encodeValue = toLazyByteString . buildValue
  15. buildValue :: Value -> Builder
  16. buildValue (Sum n vs)
  17. | V.null vs = char7 '(' <> ident n <> char7 ')'
  18. | otherwise =
  19. char7 '(' <> ident n <> char7 ' ' <> spaceSepArr vs <> char7 ')'
  20. buildValue (Product ps) =
  21. char7 '{' <> buildPairs ps <> char7 '}'
  22. buildValue (List vs) =
  23. char7 '[' <> spaceSepArr vs <> char7 ']'
  24. buildValue (Integer i) = integerDec i
  25. buildValue (Double d) = doubleDec d
  26. buildValue (Symbol t) = ident t
  27. buildValue (String t) =
  28. char7 '"' <> byteString (encodeUtf8 t) <> char7 '"'
  29. spaceSep :: [Builder] -> Builder
  30. spaceSep = mconcat . intersperse (char7 ' ')
  31. spaceSepArr :: Array -> Builder
  32. spaceSepArr = spaceSep . map buildValue . V.toList
  33. ident :: Text -> Builder
  34. ident = byteString . encodeUtf8
  35. buildPairs :: Product -> Builder
  36. buildPairs ps = spaceSep [ go k v | (k, v) <- M.toList ps ]
  37. where go k v = ident k <> char7 ' ' <> buildValue v