diff options
Diffstat (limited to 'src/Language/GraphQL/AST/Encoder.hs')
| -rw-r--r-- | src/Language/GraphQL/AST/Encoder.hs | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/src/Language/GraphQL/AST/Encoder.hs b/src/Language/GraphQL/AST/Encoder.hs index afc425f..056ae2c 100644 --- a/src/Language/GraphQL/AST/Encoder.hs +++ b/src/Language/GraphQL/AST/Encoder.hs @@ -18,6 +18,7 @@ import Data.Monoid ((<>)) import qualified Data.List.NonEmpty as NonEmpty (toList) import Data.Text.Lazy (Text) import qualified Data.Text.Lazy as Text.Lazy +import qualified Data.Text.Lazy.Builder as Builder import Data.Text.Lazy.Builder (toLazyText) import Data.Text.Lazy.Builder.Int (decimal) import Data.Text.Lazy.Builder.RealFloat (realFloat) @@ -191,10 +192,18 @@ booleanValue True = "true" booleanValue False = "false" stringValue :: Text -> Text -stringValue - = quotes - . Text.Lazy.replace "\"" "\\\"" - . Text.Lazy.replace "\\" "\\\\" +stringValue string = Builder.toLazyText + $ quote + <> Text.Lazy.foldr replace quote string + where + replace '\\' = mappend $ Builder.fromLazyText "\\\\" + replace '\"' = mappend $ Builder.fromLazyText "\\\"" + replace '\b' = mappend $ Builder.fromLazyText "\\b" + replace '\f' = mappend $ Builder.fromLazyText "\\f" + replace '\n' = mappend $ Builder.fromLazyText "\\n" + replace '\r' = mappend $ Builder.fromLazyText "\\r" + replace char = mappend $ Builder.singleton char + quote = Builder.singleton '\"' listValue :: Formatter -> [Full.Value] -> Text listValue formatter = bracketsCommas formatter $ value formatter @@ -243,9 +252,6 @@ brackets = between '[' ']' braces :: Text -> Text braces = between '{' '}' -quotes :: Text -> Text -quotes = between '"' '"' - spaces :: forall a. (a -> Text) -> [a] -> Text spaces f = Text.Lazy.intercalate "\SP" . fmap f |
