fast-builder 0.0.0.2 → 0.0.0.3
raw patch · 4 files changed
+22/−44 lines, 4 filesdep ~true-namePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: true-name
API changes (from Hackage documentation)
- Data.ByteString.FastBuilder.Internal: [BoundedGrowingBuffer] :: {-# UNPACK #-} !(ForeignPtr Word8) -> !Int -> DynamicSink
- Data.ByteString.FastBuilder.Internal: [BuildM] :: ((a -> Builder) -> Builder) -> BuildM a
- Data.ByteString.FastBuilder.Internal: [BuilderState] :: !(Ptr Word8) -> !(Ptr Word8) -> (State# RealWorld) -> BuilderState
- Data.ByteString.FastBuilder.Internal: [Builder] :: (DataSink -> BuilderState -> BuilderState) -> Builder
- Data.ByteString.FastBuilder.Internal: [ChunkOverflowException] :: !ByteString -> !(MVar Request) -> !(MVar Response) -> !Int -> ChunkOverflowException
- Data.ByteString.FastBuilder.Internal: [Done] :: !(Ptr Word8) -> Response
- Data.ByteString.FastBuilder.Internal: [DynamicSink] :: !(IORef DynamicSink) -> DataSink
- Data.ByteString.FastBuilder.Internal: [Error] :: SomeException -> Response
- Data.ByteString.FastBuilder.Internal: [GrowingBuffer] :: !(IORef (ForeignPtr Word8)) -> DataSink
- Data.ByteString.FastBuilder.Internal: [HandleSink] :: !Handle -> !(IORef Queue) -> DataSink
- Data.ByteString.FastBuilder.Internal: [InsertByteString] :: !(Ptr Word8) -> !ByteString -> Response
- Data.ByteString.FastBuilder.Internal: [MoreBuffer] :: !(Ptr Word8) -> !Int -> Response
- Data.ByteString.FastBuilder.Internal: [Queue] :: !(ForeignPtr Word8) -> !Int -> Queue
- Data.ByteString.FastBuilder.Internal: [Request] :: {-# UNPACK #-} !(Ptr Word8) -> {-# UNPACK #-} !(Ptr Word8) -> Request
- Data.ByteString.FastBuilder.Internal: [SuspendBuilderException] :: !(MVar ()) -> SuspendBuilderException
- Data.ByteString.FastBuilder.Internal: [ThreadedSink] :: !(MVar Request) -> !(MVar Response) -> DynamicSink
- Data.ByteString.FastBuilder.Internal: instance Applicative BuildM
- Data.ByteString.FastBuilder.Internal: instance Exception ChunkOverflowException
- Data.ByteString.FastBuilder.Internal: instance Exception SuspendBuilderException
- Data.ByteString.FastBuilder.Internal: instance Functor BuildM
- Data.ByteString.FastBuilder.Internal: instance IsString Builder
- Data.ByteString.FastBuilder.Internal: instance Monad BuildM
- Data.ByteString.FastBuilder.Internal: instance Monoid Builder
- Data.ByteString.FastBuilder.Internal: instance Monoid Write
- Data.ByteString.FastBuilder.Internal: instance Show ChunkOverflowException
- Data.ByteString.FastBuilder.Internal: instance Show Response
- Data.ByteString.FastBuilder.Internal: instance Show SuspendBuilderException
+ Data.ByteString.FastBuilder.Internal: BoundedGrowingBuffer :: {-# UNPACK #-} !(ForeignPtr Word8) -> !Int -> DynamicSink
+ Data.ByteString.FastBuilder.Internal: BuildM :: ((a -> Builder) -> Builder) -> BuildM a
+ Data.ByteString.FastBuilder.Internal: Builder :: (DataSink -> BuilderState -> BuilderState) -> Builder
+ Data.ByteString.FastBuilder.Internal: BuilderState :: !(Ptr Word8) -> !(Ptr Word8) -> (State# RealWorld) -> BuilderState
+ Data.ByteString.FastBuilder.Internal: ChunkOverflowException :: !ByteString -> !(MVar Request) -> !(MVar Response) -> !Int -> ChunkOverflowException
+ Data.ByteString.FastBuilder.Internal: Done :: !(Ptr Word8) -> Response
+ Data.ByteString.FastBuilder.Internal: DynamicSink :: !(IORef DynamicSink) -> DataSink
+ Data.ByteString.FastBuilder.Internal: Error :: SomeException -> Response
+ Data.ByteString.FastBuilder.Internal: GrowingBuffer :: !(IORef (ForeignPtr Word8)) -> DataSink
+ Data.ByteString.FastBuilder.Internal: HandleSink :: !Handle -> !(IORef Queue) -> DataSink
+ Data.ByteString.FastBuilder.Internal: InsertByteString :: !(Ptr Word8) -> !ByteString -> Response
+ Data.ByteString.FastBuilder.Internal: MoreBuffer :: !(Ptr Word8) -> !Int -> Response
+ Data.ByteString.FastBuilder.Internal: Queue :: !(ForeignPtr Word8) -> !Int -> Queue
+ Data.ByteString.FastBuilder.Internal: Request :: {-# UNPACK #-} !(Ptr Word8) -> {-# UNPACK #-} !(Ptr Word8) -> Request
+ Data.ByteString.FastBuilder.Internal: SuspendBuilderException :: !(MVar ()) -> SuspendBuilderException
+ Data.ByteString.FastBuilder.Internal: ThreadedSink :: !(MVar Request) -> !(MVar Response) -> DynamicSink
+ Data.ByteString.FastBuilder.Internal: instance Data.String.IsString Data.ByteString.FastBuilder.Internal.Builder
+ Data.ByteString.FastBuilder.Internal: instance GHC.Base.Applicative Data.ByteString.FastBuilder.Internal.BuildM
+ Data.ByteString.FastBuilder.Internal: instance GHC.Base.Functor Data.ByteString.FastBuilder.Internal.BuildM
+ Data.ByteString.FastBuilder.Internal: instance GHC.Base.Monad Data.ByteString.FastBuilder.Internal.BuildM
+ Data.ByteString.FastBuilder.Internal: instance GHC.Base.Monoid Data.ByteString.FastBuilder.Internal.Builder
+ Data.ByteString.FastBuilder.Internal: instance GHC.Base.Monoid Data.ByteString.FastBuilder.Internal.Write
+ Data.ByteString.FastBuilder.Internal: instance GHC.Exception.Exception Data.ByteString.FastBuilder.Internal.ChunkOverflowException
+ Data.ByteString.FastBuilder.Internal: instance GHC.Exception.Exception Data.ByteString.FastBuilder.Internal.SuspendBuilderException
+ Data.ByteString.FastBuilder.Internal: instance GHC.Show.Show Data.ByteString.FastBuilder.Internal.ChunkOverflowException
+ Data.ByteString.FastBuilder.Internal: instance GHC.Show.Show Data.ByteString.FastBuilder.Internal.Response
+ Data.ByteString.FastBuilder.Internal: instance GHC.Show.Show Data.ByteString.FastBuilder.Internal.SuspendBuilderException
Files
- Data/ByteString/FastBuilder/Internal.hs +4/−1
- benchmarks/aeson/HashMapExts.hs +12/−13
- benchmarks/aeson/HashMapNames.hs +0/−27
- fast-builder.cabal +6/−3
Data/ByteString/FastBuilder/Internal.hs view
@@ -110,7 +110,10 @@ instance Monoid Builder where mempty = Builder $ \_ bs -> bs {-# INLINE mempty #-}- mappend (Builder a) (Builder b) = oneShotBuilder $+ mappend (Builder a) (Builder b) = rebuild $+ -- This rebuild means we basically give up on write/write rewrites.+ -- However this can make a big difference in some cases, and seems+ -- important enough. TODO: get rid of it once GHC 8.0 is out. Builder $ \dex bs -> b dex (a dex bs) {-# INLINE mappend #-} mconcat xs = foldr mappend mempty xs
benchmarks/aeson/HashMapExts.hs view
@@ -4,28 +4,27 @@ {-# LANGUAGE UnboxedTuples #-} module HashMapExts where -import qualified Data.HashMap.Strict as H+import Data.HashMap.Strict (HashMap) import Data.Monoid import GHC.Exts (Array#, sizeofArray#, indexArray#, Int(..))-import Unsafe.TrueName (quasiName)--import HashMapNames+import Unsafe.TrueName (truename) -foldMapWithKey :: (Monoid m) => (k -> a -> m) -> H.HashMap k a -> m+foldMapWithKey :: (Monoid m) => (k -> a -> m) -> HashMap k a -> m foldMapWithKey f = go where go hm = case hm of- [quasiName|Empty ''H.HashMap|] -> mempty- [quasiName|BitmapIndexed ''H.HashMap _ ary|] -> foldMapArray go ary- [quasiName|Full ''H.HashMap ary|] -> foldMapArray go ary- [quasiName|Collision ''H.HashMap _ ary|] -> foldMapArray leaf ary- [quasiName|Leaf ''H.HashMap _ l|] -> leaf l+ [truename| ''HashMap Empty |] -> mempty+ [truename| ''HashMap BitmapIndexed | _ ary |] -> foldMapArray go ary+ [truename| ''HashMap Full | ary |] -> foldMapArray go ary+ [truename| ''HashMap Collision | _ ary |] -> foldMapArray leaf ary+ [truename| ''HashMap Leaf | _ l |] -> leaf l - leaf $(lPat "k" "v") = f k v+ leaf [truename| ''HashMap Leaf Leaf L | k v|] = f k v {-# INLINE foldMapWithKey #-} -foldMapArray :: (Monoid m) => (a -> m) -> $(arrayType) a -> m-foldMapArray f $(arrayPat "arr") = foldMapArray' f arr+foldMapArray :: (Monoid m) =>+ (a -> m) -> [truename| ''HashMap Full Array |] a -> m+foldMapArray f [truename| ''HashMap Full Array Array | a |] = foldMapArray' f a foldMapArray' :: (Monoid m) => (a -> m) -> Array# a -> m foldMapArray' f arr = go 0
− benchmarks/aeson/HashMapNames.hs
@@ -1,27 +0,0 @@-{-# LANGUAGE TemplateHaskell #-}-module HashMapNames where--import qualified Data.HashMap.Strict as H-import Language.Haskell.TH-import Unsafe.TrueName (trueName)--lPat :: String -> String -> Q Pat-lPat a b = do- leafConName <- trueName "Leaf" ''H.HashMap- leafTyName <- trueName "Leaf" leafConName- lName <- trueName "L" leafTyName- conP lName [varP (mkName a), varP (mkName b)]--arrayTypeName :: Q Name-arrayTypeName = do- fullConName <- trueName "Full" ''H.HashMap- trueName "Array" fullConName--arrayType :: Q Type-arrayType = conT =<< arrayTypeName--arrayPat :: String -> Q Pat-arrayPat a = do- arrayTyName <- arrayTypeName- arrayConName <- trueName "Array" arrayTyName- conP arrayConName [varP (mkName a)]
fast-builder.cabal view
@@ -1,5 +1,5 @@ name: fast-builder-version: 0.0.0.2+version: 0.0.0.3 synopsis: Fast ByteString Builder description: An efficient implementation of ByteString builder. It should be faster than the standard implementation in most cases.@@ -15,6 +15,7 @@ build-type: Simple -- extra-source-files: cabal-version: >=1.10+tested-with: GHC >= 7.10.1 && < 8 library exposed-modules: Data.ByteString.FastBuilder,@@ -31,8 +32,10 @@ type: exitcode-stdio-1.0 main-is: main.hs hs-source-dirs: benchmarks/aeson- other-modules: Fast, Bstr, HashMapExts, HashMapNames- build-depends: base, fast-builder, aeson, criterion, bytestring, scientific, text, vector, deepseq, unordered-containers, ghc-prim, true-name, template-haskell+ other-modules: Fast, Bstr, HashMapExts+ build-depends: base, fast-builder, aeson, criterion, bytestring,+ scientific, text, vector, deepseq, unordered-containers, ghc-prim,+ template-haskell, true-name >= 0.1.0.0 ghc-options: -fsimpl-tick-factor=120 ghc-options: -Wall -threaded -g -rtsopts