buffer-builder 0.2.4.4 → 0.2.4.5
raw patch · 4 files changed
+57/−9 lines, 4 filesPVP: minor bump suggested
API additions: PVP suggests at least a minor version bump
API changes (from Hackage documentation)
+ Data.BufferBuilder.Json: instance Data.Semigroup.Semigroup Data.BufferBuilder.Json.ObjectBuilder
Files
- bench/JsonBench.hs +40/−1
- buffer-builder.cabal +1/−1
- changelog.md +4/−0
- src/Data/BufferBuilder/Json.hs +12/−7
bench/JsonBench.hs view
@@ -129,23 +129,38 @@ Green -> "green" :: Text Blue -> "blue" Brown -> "brown"+ toEncoding ec = Aeson.toEncoding $ case ec of+ Green -> "green" :: Text+ Blue -> "blue"+ Brown -> "brown" instance Aeson.ToJSON Gender where toJSON g = Aeson.toJSON $ case g of Male -> "male" :: Text Female -> "female"+ toEncoding g = Aeson.toEncoding $ case g of+ Male -> "male" :: Text+ Female -> "female" instance Aeson.ToJSON Fruit where toJSON f = Aeson.toJSON $ case f of Apple -> "apple" :: Text Banana -> "banana" Strawberry -> "strawberry"+ toEncoding f = Aeson.toEncoding $ case f of+ Apple -> "apple" :: Text+ Banana -> "banana"+ Strawberry -> "strawberry" instance Aeson.ToJSON Friend where toJSON Friend {..} = Aeson.object [ "id" Aeson..= fId , "name" Aeson..= fName ]+ toEncoding Friend {..} = Aeson.pairs+ ( "id" Aeson..= fId+ <> "name" Aeson..= fName+ ) instance Aeson.ToJSON User where toJSON User{..} = Aeson.object@@ -172,7 +187,30 @@ , "greeting" Aeson..= uGreeting , "favoriteFruit" Aeson..= uFavouriteFruit ]-+ toEncoding User{..} = Aeson.pairs+ ( "_id" Aeson..= uId+ <> "index" Aeson..= uIndex+ <> "guid" Aeson..= uGuid+ <> "isActive" Aeson..= uIsActive+ <> "balance" Aeson..= uBalance+ <> "picture" Aeson..= uPicture+ <> "age" Aeson..= uAge+ <> "eyeColor" Aeson..= uEyeColor+ <> "name" Aeson..= uName+ <> "gender" Aeson..= uGender+ <> "company" Aeson..= uCompany+ <> "email" Aeson..= uEmail+ <> "phone" Aeson..= uPhone+ <> "address" Aeson..= uAddress+ <> "about" Aeson..= uAbout+ <> "registered" Aeson..= uRegistered+ <> "latitude" Aeson..= uLatitude+ <> "longitude" Aeson..= uLongitude+ <> "tags" Aeson..= uTags+ <> "friends" Aeson..= uFriends+ <> "greeting" Aeson..= uGreeting+ <> "favoriteFruit" Aeson..= uFavouriteFruit+ ) --- BufferBuilder instances --- instance Json.ToJson EyeColor where@@ -329,6 +367,7 @@ , bgroup "render" [ bench "bufferbuilder" $ nf Json.encodeJson parsedUserList , bench "aeson" $ nf Aeson.encode parsedUserList+ , bench "aeson-value" $ nf (Aeson.encode . Aeson.toJSON) parsedUserList , bench "json-builder" $ nf JB.toJsonLBS parsedUserList ] , bgroup "addr vs text keys"
buffer-builder.cabal view
@@ -1,5 +1,5 @@ name: buffer-builder-version: 0.2.4.4+version: 0.2.4.5 synopsis: Library for efficiently building up buffers, one piece at a time description:
changelog.md view
@@ -1,3 +1,7 @@+0.2.4.5++* Add Semigroup instance for ObjectBuilder+ 0.2.4.4 * Add 'stdc++' as an explicit library dependency. (Thanks Rob Dockins!)
src/Data/BufferBuilder/Json.hs view
@@ -55,7 +55,8 @@ import Data.BufferBuilder.Utf8 (Utf8Builder) import qualified Data.BufferBuilder.Utf8 as UB import Data.ByteString (ByteString)-import Data.Monoid+import Data.Monoid hiding ((<>))+import Data.Semigroup import Data.Text (Text) import Data.Foldable (Foldable, foldMap) import qualified Data.Vector as Vector@@ -142,17 +143,21 @@ -- resulting JSON document will be illegal. data ObjectBuilder = NoPair | Pair !(Utf8Builder ()) +instance Semigroup ObjectBuilder where+ {-# INLINE (<>) #-}+ NoPair <> a = a+ a <> NoPair = a+ (Pair a) <> (Pair b) = Pair $ do+ a+ UB.appendChar7 ','+ b+ instance Monoid ObjectBuilder where {-# INLINE mempty #-} mempty = NoPair {-# INLINE mappend #-}- mappend NoPair a = a- mappend a NoPair = a- mappend (Pair a) (Pair b) = Pair $ do - a- UB.appendChar7 ','- b+ mappend = (<>) instance ToJson ObjectBuilder where {-# INLINE toJson #-}