Hello community,

here is the log from the commit of package ghc-superbuffer for openSUSE:Factory 
checked in at 2017-08-31 21:00:00
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-superbuffer (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-superbuffer.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-superbuffer"

Thu Aug 31 21:00:00 2017 rev:2 rq:513504 version:0.3.1.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-superbuffer/ghc-superbuffer.changes  
2017-04-12 18:09:15.432998526 +0200
+++ /work/SRC/openSUSE:Factory/.ghc-superbuffer.new/ghc-superbuffer.changes     
2017-08-31 21:00:03.065172512 +0200
@@ -1,0 +2,5 @@
+Thu Jul 27 14:07:36 UTC 2017 - [email protected]
+
+- Update to version 0.3.1.1.
+
+-------------------------------------------------------------------

Old:
----
  superbuffer-0.2.0.1.tar.gz

New:
----
  superbuffer-0.3.1.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-superbuffer.spec ++++++
--- /var/tmp/diff_new_pack.hV0dz6/_old  2017-08-31 21:00:04.013039335 +0200
+++ /var/tmp/diff_new_pack.hV0dz6/_new  2017-08-31 21:00:04.077030344 +0200
@@ -19,7 +19,7 @@
 %global pkg_name superbuffer
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.2.0.1
+Version:        0.3.1.1
 Release:        0
 Summary:        Efficiently build a bytestring from smaller chunks
 License:        BSD-3-Clause

++++++ superbuffer-0.2.0.1.tar.gz -> superbuffer-0.3.1.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/LICENSE 
new/superbuffer-0.3.1.1/LICENSE
--- old/superbuffer-0.2.0.1/LICENSE     2016-11-30 20:40:56.000000000 +0100
+++ new/superbuffer-0.3.1.1/LICENSE     2017-03-27 22:46:12.000000000 +0200
@@ -1,4 +1,4 @@
-Copyright Alexander Thiemann (c) 2016
+Copyright Alexander Thiemann (c) 2016 - 2017
 
 All rights reserved.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/README.md 
new/superbuffer-0.3.1.1/README.md
--- old/superbuffer-0.2.0.1/README.md   2016-12-03 15:51:11.000000000 +0100
+++ new/superbuffer-0.3.1.1/README.md   2016-12-11 16:26:32.000000000 +0100
@@ -29,372 +29,4 @@
 
 ## Benchmarks
 
-```
-benchmarking main/small/superbuffer (init=128 bytes)
-time                 20.22 ms   (19.77 ms .. 20.76 ms)
-                     0.997 R²   (0.994 R² .. 0.999 R²)
-mean                 20.15 ms   (19.91 ms .. 20.40 ms)
-std dev              575.0 μs   (436.3 μs .. 739.6 μs)
-
-benchmarking main/small/superbuffer (init=4000 bytes)
-time                 20.08 ms   (19.56 ms .. 20.79 ms)
-                     0.996 R²   (0.993 R² .. 0.999 R²)
-mean                 20.17 ms   (19.85 ms .. 20.66 ms)
-std dev              905.1 μs   (625.2 μs .. 1.335 ms)
-variance introduced by outliers: 14% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=8000 bytes)
-time                 23.72 ms   (23.21 ms .. 24.34 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 23.92 ms   (23.55 ms .. 24.52 ms)
-std dev              1.001 ms   (673.0 μs .. 1.587 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=16000 bytes)
-time                 24.15 ms   (23.79 ms .. 24.58 ms)
-                     0.999 R²   (0.998 R² .. 0.999 R²)
-mean                 23.98 ms   (23.69 ms .. 24.55 ms)
-std dev              863.6 μs   (487.1 μs .. 1.517 ms)
-
-benchmarking main/small/superbuffer (init=20000000 bytes)
-time                 11.48 ms   (6.634 ms .. 14.10 ms)
-                     0.645 R²   (0.346 R² .. 0.854 R²)
-mean                 23.80 ms   (20.34 ms .. 27.33 ms)
-std dev              8.484 ms   (7.385 ms .. 9.868 ms)
-variance introduced by outliers: 95% (severely inflated)
-
-benchmarking main/small/superbuffer (init=128 bytes, threadsafe, 2 concurrent 
writes)
-time                 23.15 ms   (22.24 ms .. 24.28 ms)
-                     0.993 R²   (0.987 R² .. 0.997 R²)
-mean                 24.41 ms   (23.96 ms .. 24.85 ms)
-std dev              1.012 ms   (809.8 μs .. 1.434 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=4000 bytes, threadsafe, 2 concurrent 
writes)
-time                 24.99 ms   (23.79 ms .. 26.02 ms)
-                     0.994 R²   (0.990 R² .. 0.997 R²)
-mean                 24.02 ms   (23.60 ms .. 24.48 ms)
-std dev              1.004 ms   (831.7 μs .. 1.228 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=8000 bytes, threadsafe, 2 concurrent 
writes)
-time                 25.30 ms   (24.78 ms .. 26.00 ms)
-                     0.998 R²   (0.996 R² .. 0.999 R²)
-mean                 25.37 ms   (24.98 ms .. 26.10 ms)
-std dev              1.148 ms   (621.8 μs .. 1.891 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=16000 bytes, threadsafe, 2 
concurrent writes)
-time                 25.45 ms   (24.73 ms .. 26.36 ms)
-                     0.996 R²   (0.992 R² .. 0.998 R²)
-mean                 24.24 ms   (23.80 ms .. 24.72 ms)
-std dev              1.020 ms   (825.0 μs .. 1.335 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/small/superbuffer (init=20000000 bytes, threadsafe, 2 
concurrent writes)
-time                 31.89 ms   (30.17 ms .. 34.05 ms)
-                     0.987 R²   (0.979 R² .. 0.994 R²)
-mean                 30.33 ms   (29.35 ms .. 31.28 ms)
-std dev              2.038 ms   (1.752 ms .. 2.381 ms)
-variance introduced by outliers: 22% (moderately inflated)
-
-benchmarking main/small/buffer-builder (init=128 bytes, trim=yes)
-time                 27.32 ms   (26.65 ms .. 28.22 ms)
-                     0.996 R²   (0.991 R² .. 0.999 R²)
-mean                 27.12 ms   (26.62 ms .. 27.58 ms)
-std dev              1.045 ms   (758.8 μs .. 1.413 ms)
-variance introduced by outliers: 10% (moderately inflated)
-
-benchmarking main/small/buffer-builder (init=4000 bytes, trim=yes)
-time                 27.72 ms   (26.43 ms .. 28.85 ms)
-                     0.994 R²   (0.990 R² .. 0.998 R²)
-mean                 26.85 ms   (26.33 ms .. 27.48 ms)
-std dev              1.254 ms   (953.7 μs .. 1.868 ms)
-variance introduced by outliers: 16% (moderately inflated)
-
-benchmarking main/small/buffer-builder (init=8000 bytes, trim=yes)
-time                 26.93 ms   (26.03 ms .. 27.75 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 26.03 ms   (24.99 ms .. 26.46 ms)
-std dev              1.420 ms   (578.2 μs .. 2.534 ms)
-variance introduced by outliers: 21% (moderately inflated)
-
-benchmarking main/small/buffer-builder (init=16000 bytes, trim=yes)
-time                 27.18 ms   (26.63 ms .. 27.72 ms)
-                     0.998 R²   (0.996 R² .. 0.999 R²)
-mean                 26.58 ms   (26.05 ms .. 26.91 ms)
-std dev              907.8 μs   (570.8 μs .. 1.417 ms)
-variance introduced by outliers: 10% (moderately inflated)
-
-benchmarking main/small/buffer-builder (init=20000000 bytes, trim=yes)
-time                 39.64 ms   (37.58 ms .. 41.77 ms)
-                     0.993 R²   (0.988 R² .. 0.997 R²)
-mean                 36.84 ms   (33.85 ms .. 38.83 ms)
-std dev              4.888 ms   (1.424 ms .. 6.918 ms)
-variance introduced by outliers: 52% (severely inflated)
-
-benchmarking main/small/bytestring builder
-time                 25.99 ms   (25.26 ms .. 26.86 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 26.82 ms   (26.10 ms .. 28.67 ms)
-std dev              2.472 ms   (847.5 μs .. 4.346 ms)
-variance introduced by outliers: 40% (moderately inflated)
-
-benchmarking main/small/bytestring fromChunks
-time                 24.71 ms   (23.97 ms .. 25.61 ms)
-                     0.996 R²   (0.994 R² .. 0.999 R²)
-mean                 25.10 ms   (24.78 ms .. 25.46 ms)
-std dev              762.7 μs   (615.2 μs .. 972.1 μs)
-
-benchmarking main/small/bytestring concat
-time                 24.33 ms   (23.59 ms .. 25.07 ms)
-                     0.997 R²   (0.996 R² .. 0.999 R²)
-mean                 24.82 ms   (24.37 ms .. 26.35 ms)
-std dev              1.561 ms   (507.3 μs .. 3.049 ms)
-variance introduced by outliers: 25% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=128 bytes)
-time                 20.24 ms   (19.67 ms .. 20.82 ms)
-                     0.996 R²   (0.993 R² .. 0.998 R²)
-mean                 21.88 ms   (21.34 ms .. 22.69 ms)
-std dev              1.544 ms   (1.054 ms .. 2.186 ms)
-variance introduced by outliers: 32% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=40000 bytes)
-time                 20.93 ms   (20.47 ms .. 21.46 ms)
-                     0.997 R²   (0.994 R² .. 0.999 R²)
-mean                 21.22 ms   (20.87 ms .. 21.75 ms)
-std dev              985.4 μs   (696.1 μs .. 1.269 ms)
-variance introduced by outliers: 18% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=80000 bytes)
-time                 21.63 ms   (21.14 ms .. 22.09 ms)
-                     0.998 R²   (0.997 R² .. 0.999 R²)
-mean                 21.44 ms   (21.26 ms .. 21.61 ms)
-std dev              401.8 μs   (319.6 μs .. 550.9 μs)
-
-benchmarking main/med/superbuffer (init=160000 bytes)
-time                 21.92 ms   (21.58 ms .. 22.35 ms)
-                     0.998 R²   (0.997 R² .. 0.999 R²)
-mean                 22.14 ms   (21.80 ms .. 23.03 ms)
-std dev              1.207 ms   (476.2 μs .. 2.235 ms)
-variance introduced by outliers: 19% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=20000000 bytes)
-time                 36.50 ms   (35.29 ms .. 37.98 ms)
-                     0.995 R²   (0.989 R² .. 0.998 R²)
-mean                 35.84 ms   (34.96 ms .. 36.70 ms)
-std dev              1.785 ms   (1.412 ms .. 2.334 ms)
-variance introduced by outliers: 17% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=128 bytes, threadsafe, 2 concurrent 
writes)
-time                 21.15 ms   (18.68 ms .. 23.97 ms)
-                     0.950 R²   (0.908 R² .. 0.980 R²)
-mean                 24.94 ms   (23.67 ms .. 26.24 ms)
-std dev              2.822 ms   (2.391 ms .. 3.339 ms)
-variance introduced by outliers: 51% (severely inflated)
-
-benchmarking main/med/superbuffer (init=40000 bytes, threadsafe, 2 concurrent 
writes)
-time                 21.79 ms   (21.24 ms .. 22.38 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 21.96 ms   (21.66 ms .. 22.56 ms)
-std dev              946.4 μs   (527.5 μs .. 1.690 ms)
-variance introduced by outliers: 14% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=80000 bytes, threadsafe, 2 concurrent 
writes)
-time                 20.33 ms   (19.97 ms .. 20.79 ms)
-                     0.998 R²   (0.996 R² .. 0.999 R²)
-mean                 21.51 ms   (21.06 ms .. 22.95 ms)
-std dev              1.825 ms   (481.4 μs .. 3.324 ms)
-variance introduced by outliers: 37% (moderately inflated)
-
-benchmarking main/med/superbuffer (init=160000 bytes, threadsafe, 2 concurrent 
writes)
-time                 20.96 ms   (20.72 ms .. 21.25 ms)
-                     0.999 R²   (0.998 R² .. 1.000 R²)
-mean                 20.67 ms   (20.48 ms .. 20.86 ms)
-std dev              427.3 μs   (339.9 μs .. 590.7 μs)
-
-benchmarking main/med/superbuffer (init=20000000 bytes, threadsafe, 2 
concurrent writes)
-time                 15.53 ms   (14.71 ms .. 16.32 ms)
-                     0.990 R²   (0.984 R² .. 0.996 R²)
-mean                 17.04 ms   (16.20 ms .. 19.15 ms)
-std dev              3.153 ms   (803.4 μs .. 5.600 ms)
-variance introduced by outliers: 78% (severely inflated)
-
-benchmarking main/med/buffer-builder (init=128 bytes, trim=yes)
-time                 27.03 ms   (26.42 ms .. 27.71 ms)
-                     0.997 R²   (0.994 R² .. 0.999 R²)
-mean                 27.12 ms   (26.81 ms .. 27.50 ms)
-std dev              764.3 μs   (640.0 μs .. 905.9 μs)
-
-benchmarking main/med/buffer-builder (init=40000 bytes, trim=yes)
-time                 24.45 ms   (23.87 ms .. 25.04 ms)
-                     0.998 R²   (0.997 R² .. 0.999 R²)
-mean                 25.75 ms   (25.17 ms .. 27.17 ms)
-std dev              1.860 ms   (737.2 μs .. 3.305 ms)
-variance introduced by outliers: 30% (moderately inflated)
-
-benchmarking main/med/buffer-builder (init=80000 bytes, trim=yes)
-time                 25.41 ms   (24.69 ms .. 25.96 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 25.03 ms   (24.65 ms .. 25.52 ms)
-std dev              953.1 μs   (712.1 μs .. 1.322 ms)
-
-benchmarking main/med/buffer-builder (init=160000 bytes, trim=yes)
-time                 20.74 ms   (19.45 ms .. 22.54 ms)
-                     0.987 R²   (0.976 R² .. 0.998 R²)
-mean                 21.97 ms   (21.18 ms .. 23.30 ms)
-std dev              2.232 ms   (1.143 ms .. 3.201 ms)
-variance introduced by outliers: 43% (moderately inflated)
-
-benchmarking main/med/buffer-builder (init=20000000 bytes, trim=yes)
-time                 42.12 ms   (40.02 ms .. 45.54 ms)
-                     0.986 R²   (0.972 R² .. 0.996 R²)
-mean                 34.61 ms   (30.88 ms .. 37.15 ms)
-std dev              6.081 ms   (4.260 ms .. 7.559 ms)
-variance introduced by outliers: 67% (severely inflated)
-
-benchmarking main/med/bytestring builder
-time                 21.46 ms   (21.04 ms .. 21.91 ms)
-                     0.998 R²   (0.996 R² .. 0.999 R²)
-mean                 22.20 ms   (21.92 ms .. 22.56 ms)
-std dev              769.1 μs   (561.8 μs .. 1.135 ms)
-
-benchmarking main/med/bytestring fromChunks
-time                 21.76 ms   (21.32 ms .. 22.18 ms)
-                     0.998 R²   (0.996 R² .. 0.999 R²)
-mean                 21.70 ms   (21.44 ms .. 22.49 ms)
-std dev              915.7 μs   (377.2 μs .. 1.650 ms)
-variance introduced by outliers: 14% (moderately inflated)
-
-benchmarking main/med/bytestring concat
-time                 21.71 ms   (20.96 ms .. 22.47 ms)
-                     0.996 R²   (0.993 R² .. 0.998 R²)
-mean                 21.85 ms   (21.52 ms .. 22.36 ms)
-std dev              922.0 μs   (638.6 μs .. 1.303 ms)
-variance introduced by outliers: 14% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=128 bytes)
-time                 20.19 ms   (19.47 ms .. 20.74 ms)
-                     0.996 R²   (0.992 R² .. 0.998 R²)
-mean                 22.49 ms   (21.65 ms .. 23.82 ms)
-std dev              2.533 ms   (1.626 ms .. 3.812 ms)
-variance introduced by outliers: 51% (severely inflated)
-
-benchmarking main/large/superbuffer (init=400000 bytes)
-time                 21.03 ms   (20.42 ms .. 21.69 ms)
-                     0.997 R²   (0.995 R² .. 0.999 R²)
-mean                 21.17 ms   (20.81 ms .. 21.85 ms)
-std dev              1.095 ms   (623.6 μs .. 1.826 ms)
-variance introduced by outliers: 18% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=800000 bytes)
-time                 28.01 ms   (27.01 ms .. 29.08 ms)
-                     0.992 R²   (0.981 R² .. 0.998 R²)
-mean                 27.51 ms   (26.32 ms .. 28.46 ms)
-std dev              2.271 ms   (1.609 ms .. 3.314 ms)
-variance introduced by outliers: 32% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=1600000 bytes)
-time                 22.41 ms   (21.10 ms .. 23.55 ms)
-                     0.991 R²   (0.985 R² .. 0.997 R²)
-mean                 24.47 ms   (23.70 ms .. 25.88 ms)
-std dev              2.373 ms   (1.559 ms .. 3.479 ms)
-variance introduced by outliers: 43% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=20000000 bytes)
-time                 16.26 ms   (15.84 ms .. 16.73 ms)
-                     0.996 R²   (0.993 R² .. 0.998 R²)
-mean                 16.36 ms   (16.15 ms .. 16.71 ms)
-std dev              645.5 μs   (444.5 μs .. 1.039 ms)
-variance introduced by outliers: 12% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=128 bytes, threadsafe, 2 concurrent 
writes)
-time                 21.83 ms   (21.42 ms .. 22.27 ms)
-                     0.998 R²   (0.997 R² .. 0.999 R²)
-mean                 22.34 ms   (22.00 ms .. 23.16 ms)
-std dev              1.137 ms   (507.0 μs .. 2.059 ms)
-variance introduced by outliers: 19% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=400000 bytes, threadsafe, 2 
concurrent writes)
-time                 20.75 ms   (20.19 ms .. 21.11 ms)
-                     0.998 R²   (0.995 R² .. 0.999 R²)
-mean                 22.37 ms   (21.79 ms .. 23.07 ms)
-std dev              1.423 ms   (971.3 μs .. 1.764 ms)
-variance introduced by outliers: 24% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=800000 bytes, threadsafe, 2 
concurrent writes)
-time                 26.87 ms   (26.39 ms .. 27.40 ms)
-                     0.998 R²   (0.997 R² .. 0.999 R²)
-mean                 27.69 ms   (27.16 ms .. 28.82 ms)
-std dev              1.668 ms   (796.8 μs .. 3.007 ms)
-variance introduced by outliers: 21% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=1600000 bytes, threadsafe, 2 
concurrent writes)
-time                 21.94 ms   (21.20 ms .. 22.83 ms)
-                     0.993 R²   (0.986 R² .. 0.997 R²)
-mean                 22.67 ms   (22.10 ms .. 23.47 ms)
-std dev              1.557 ms   (927.2 μs .. 2.176 ms)
-variance introduced by outliers: 29% (moderately inflated)
-
-benchmarking main/large/superbuffer (init=20000000 bytes, threadsafe, 2 
concurrent writes)
-time                 15.28 ms   (14.51 ms .. 16.07 ms)
-                     0.985 R²   (0.969 R² .. 0.994 R²)
-mean                 18.44 ms   (17.30 ms .. 20.47 ms)
-std dev              3.914 ms   (2.383 ms .. 5.301 ms)
-variance introduced by outliers: 82% (severely inflated)
-
-benchmarking main/large/buffer-builder (init=128 bytes, trim=yes)
-time                 27.25 ms   (26.22 ms .. 28.09 ms)
-                     0.995 R²   (0.991 R² .. 0.998 R²)
-mean                 29.72 ms   (28.85 ms .. 30.97 ms)
-std dev              2.197 ms   (1.692 ms .. 2.863 ms)
-variance introduced by outliers: 27% (moderately inflated)
-
-benchmarking main/large/buffer-builder (init=400000 bytes, trim=yes)
-time                 24.62 ms   (23.86 ms .. 25.37 ms)
-                     0.995 R²   (0.990 R² .. 0.998 R²)
-mean                 24.56 ms   (24.11 ms .. 25.03 ms)
-std dev              1.013 ms   (806.5 μs .. 1.291 ms)
-variance introduced by outliers: 15% (moderately inflated)
-
-benchmarking main/large/buffer-builder (init=800000 bytes, trim=yes)
-time                 24.85 ms   (24.37 ms .. 25.24 ms)
-                     0.999 R²   (0.998 R² .. 1.000 R²)
-mean                 24.37 ms   (24.10 ms .. 24.59 ms)
-std dev              550.3 μs   (407.5 μs .. 728.3 μs)
-
-benchmarking main/large/buffer-builder (init=1600000 bytes, trim=yes)
-time                 24.18 ms   (21.67 ms .. 25.98 ms)
-                     0.978 R²   (0.963 R² .. 0.993 R²)
-mean                 22.34 ms   (21.77 ms .. 23.09 ms)
-std dev              1.560 ms   (1.157 ms .. 2.056 ms)
-variance introduced by outliers: 29% (moderately inflated)
-
-benchmarking main/large/buffer-builder (init=20000000 bytes, trim=yes)
-time                 40.55 ms   (38.93 ms .. 42.77 ms)
-                     0.985 R²   (0.965 R² .. 0.995 R²)
-mean                 33.52 ms   (30.49 ms .. 36.43 ms)
-std dev              5.750 ms   (4.777 ms .. 6.724 ms)
-variance introduced by outliers: 67% (severely inflated)
-
-benchmarking main/large/bytestring builder
-time                 20.71 ms   (19.41 ms .. 21.67 ms)
-                     0.987 R²   (0.975 R² .. 0.994 R²)
-mean                 23.80 ms   (22.91 ms .. 24.66 ms)
-std dev              2.027 ms   (1.762 ms .. 2.468 ms)
-variance introduced by outliers: 38% (moderately inflated)
-
-benchmarking main/large/bytestring fromChunks
-time                 21.18 ms   (20.72 ms .. 21.62 ms)
-                     0.998 R²   (0.995 R² .. 0.999 R²)
-mean                 21.64 ms   (21.28 ms .. 22.18 ms)
-std dev              1.000 ms   (589.7 μs .. 1.621 ms)
-variance introduced by outliers: 18% (moderately inflated)
-
-benchmarking main/large/bytestring concat
-time                 21.59 ms   (20.97 ms .. 22.39 ms)
-                     0.997 R²   (0.993 R² .. 0.999 R²)
-mean                 21.80 ms   (21.57 ms .. 22.11 ms)
-std dev              600.9 μs   (451.9 μs .. 767.7 μs)
-```
+See: [Benchmarks for 
0.3.0.0](https://agrafix.github.io/superbuffer/benchmarks-0.3.0.0.html)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/bench/Bench.hs 
new/superbuffer-0.3.1.1/bench/Bench.hs
--- old/superbuffer-0.2.0.1/bench/Bench.hs      2016-12-02 10:12:37.000000000 
+0100
+++ new/superbuffer-0.3.1.1/bench/Bench.hs      2016-12-11 15:52:26.000000000 
+0100
@@ -5,6 +5,7 @@
 import Criterion
 import Criterion.Main
 import Data.ByteString.SuperBuffer
+import qualified Data.ByteString.SuperBuffer.Pure as P
 import Data.Int
 import qualified Data.BufferBuilder as BB
 import qualified Data.ByteString as BS
@@ -26,6 +27,8 @@
     bgroup name $
     mkSizedGroup steps chunkSize bufName buildBuf
     ++ mkSizedGroup steps chunkSize bufNameT buildBufT
+    ++ mkSizedGroup steps chunkSize bufNameP buildBufP
+    ++ mkSizedGroup steps chunkSize bufNamePT buildBufPT
     ++ mkSizedGroup steps chunkSize bufBBName buildBufBB
     ++
     [ bench "bytestring builder" $ nfIO $ BS.reverse <$> buildBufBuilder steps 
chunkSize
@@ -36,6 +39,8 @@
       bufBBName is = "buffer-builder (init=" ++ show is ++ " bytes, trim=yes)"
       bufName is = "superbuffer (init=" ++ show is ++ " bytes)"
       bufNameT is = "superbuffer (init=" ++ show is ++ " bytes, threadsafe, 2 
concurrent writes)"
+      bufNameP is = "superbuffer (pure haskell, init=" ++ show is ++ " bytes)"
+      bufNamePT is = "superbuffer (pure haskell, init=" ++ show is ++ " bytes, 
threadsafe, 2 concurrent writes)"
 
 mkSizedGroup ::
     Int -> Int -> (Int64 -> String) -> (Int64 -> Int -> Int -> IO 
BS.ByteString) -> [Benchmark]
@@ -74,6 +79,23 @@
     where
       halfSteps :: Double
       halfSteps = fromIntegral steps / 2.0
+
+buildBufP :: Int64 -> Int -> Int -> IO BS.ByteString
+buildBufP bufSize steps chunkSize =
+    P.withBuffer (fromIntegral bufSize) $ \buf ->
+    forM_ [0..steps] $ \step ->
+    P.appendBuffer buf (mkChunk step chunkSize)
+
+buildBufPT :: Int64 -> Int -> Int -> IO BS.ByteString
+buildBufPT bufSize steps chunkSize =
+    P.withBuffer (fromIntegral bufSize) $ \buf ->
+    forM_ [0..(ceiling halfSteps)] $ \step ->
+    concurrently_
+       (P.appendBufferT buf (mkChunk step chunkSize))
+       (P.appendBufferT buf (mkChunk step chunkSize))
+    where
+      halfSteps :: Double
+      halfSteps = fromIntegral steps / 2.0
 
 buildBufBB :: Int64 -> Int -> Int -> IO BS.ByteString
 buildBufBB bufSize steps chunkSize =
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/cbits/superbuffer.c 
new/superbuffer-0.3.1.1/cbits/superbuffer.c
--- old/superbuffer-0.2.0.1/cbits/superbuffer.c 2016-12-03 16:28:11.000000000 
+0100
+++ new/superbuffer-0.3.1.1/cbits/superbuffer.c 2017-03-27 22:40:27.000000000 
+0200
@@ -56,3 +56,8 @@
 {
   free(buf);
 }
+
+size_t size_sbuf(struct sbuf *buf)
+{
+  return buf->currentSize;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/package.yaml 
new/superbuffer-0.3.1.1/package.yaml
--- old/superbuffer-0.2.0.1/package.yaml        2016-12-03 15:32:04.000000000 
+0100
+++ new/superbuffer-0.3.1.1/package.yaml        2017-05-26 19:12:04.000000000 
+0200
@@ -1,12 +1,12 @@
 name:                superbuffer
-version:             0.2.0.1
+version:             0.3.1.1
 synopsis:            Efficiently build a bytestring from smaller chunks
 description:         Efficiently (both fast and memory efficient) build a 
bytestring from smaller chunks
 homepage:            https://github.com/agrafix/superbuffer#readme
 license:             BSD3
 author:              Alexander Thiemann
 maintainer:          [email protected]
-copyright:           2016 Alexander Thiemann <[email protected]>
+copyright:           2016 - 2017 Alexander Thiemann <[email protected]>
 category:            Web
 extra-source-files:
   - README.md
@@ -22,7 +22,8 @@
 library:
   source-dirs: src
   exposed-modules:
-    Data.ByteString.SuperBuffer
+    - Data.ByteString.SuperBuffer
+    - Data.ByteString.SuperBuffer.Pure
   c-sources: cbits/superbuffer.c
 
 tests:
@@ -42,7 +43,7 @@
     main: Bench.hs
     source-dirs: bench
     dependencies:
-      - criterion < 1.2
+      - criterion < 1.3
       - superbuffer
       - buffer-builder
       - async
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/superbuffer-0.2.0.1/src/Data/ByteString/SuperBuffer/Pure.hs 
new/superbuffer-0.3.1.1/src/Data/ByteString/SuperBuffer/Pure.hs
--- old/superbuffer-0.2.0.1/src/Data/ByteString/SuperBuffer/Pure.hs     
1970-01-01 01:00:00.000000000 +0100
+++ new/superbuffer-0.3.1.1/src/Data/ByteString/SuperBuffer/Pure.hs     
2017-03-27 22:43:06.000000000 +0200
@@ -0,0 +1,100 @@
+module Data.ByteString.SuperBuffer.Pure
+    ( SuperBuffer, withBuffer, appendBuffer, appendBufferT, size )
+where
+
+import Control.Concurrent.MVar
+import Control.Exception
+import Data.Bits
+import Data.IORef
+import Data.Word
+import Foreign.Marshal.Alloc
+import Foreign.Marshal.Utils
+import Foreign.Ptr
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Unsafe as BS
+
+-- | The buffer data structure.
+data SuperBuffer
+    = SuperBuffer
+    { sb_buffer :: {-# UNPACK #-}!(IORef (Ptr Word8))
+    , sb_currentSize :: {-# UNPACK #-}!(IORef Int)
+    , sb_maxSize :: {-# UNPACK #-}!(IORef Int)
+    , sb_lock :: {-# UNPACK #-}!(MVar ())
+    }
+
+-- | Allocate a new buffer with a given initial size. The perfect starting 
point
+-- depends on the expected total size and the average size for a single chunk
+-- written with 'appendBuffer'. You can always start with 1024 and optimize 
from
+-- there with benchmarks. Please note that the SuperBuffer will no longer be
+-- valid after this function terminates, so do NOT pass it to some other
+-- thread without waiting for it to finish in the action.
+withBuffer :: Int -> (SuperBuffer -> IO ()) -> IO BS.ByteString
+withBuffer sz action =
+    do ptr <- mallocBytes sz
+       ptrRef <- newIORef ptr
+       go ptrRef `onException` freeOnException ptrRef
+    where
+        freeOnException ref =
+            do ptr <- readIORef ref
+               free ptr
+        go ptrRef =
+            do sizeRef <- newIORef 0
+               maxSizeRef <- newIORef sz
+               lock <- newEmptyMVar
+               let sb = SuperBuffer ptrRef sizeRef maxSizeRef lock
+               action sb
+               readBuffer sb
+{-# INLINE withBuffer #-}
+
+-- | Write a bytestring to the buffer and grow the buffer if needed. Note that 
only
+-- one thread at any given time may call this function. Use 'appendBufferT' 
when
+-- accessing 'SuperBuffer' from multiple threads.
+appendBuffer :: SuperBuffer -> BS.ByteString -> IO ()
+appendBuffer sb bs
+    | BS.null bs = pure ()
+    | otherwise =
+          BS.unsafeUseAsCStringLen bs $ \(cstr, len) ->
+          do currentSize <- readIORef (sb_currentSize sb)
+             maxSize <- readIORef (sb_maxSize sb)
+             let nextSize = currentSize + len
+             writePtr <-
+                 if nextSize > maxSize
+                 then do let maxSize' = nextSize + unsafeShiftR nextSize 1
+                         writeIORef (sb_maxSize sb) maxSize'
+                         buff <- readIORef (sb_buffer sb)
+                         buff' <- reallocBytes buff maxSize'
+                         writeIORef (sb_buffer sb) buff'
+                         pure buff'
+                 else readIORef (sb_buffer sb)
+             let copyTarget = writePtr `plusPtr` currentSize
+             copyBytes copyTarget cstr len
+             writeIORef (sb_currentSize sb) (currentSize + len)
+{-# INLINE appendBuffer #-}
+
+-- | Write a bytestring to the buffer and grow the buffer if needed. This 
function
+-- can be used accross different threads, but is slower than 'appendBuffer'.
+appendBufferT :: SuperBuffer -> BS.ByteString -> IO ()
+appendBufferT sb bs =
+    bracket_ (putMVar (sb_lock sb) ()) (takeMVar (sb_lock sb)) $
+    appendBuffer sb bs
+{-# INLINE appendBufferT #-}
+
+-- | Read the final buffer contents. This must only be called once
+readBuffer :: SuperBuffer -> IO BS.ByteString
+readBuffer sb =
+    do (buff, currentSize, maxSize) <-
+           (,,)
+           <$> readIORef (sb_buffer sb)
+           <*> readIORef (sb_currentSize sb)
+           <*> readIORef (sb_maxSize sb)
+       finalPtr <-
+           if currentSize < maxSize
+           then reallocBytes buff currentSize
+           else pure buff
+       BS.unsafePackCStringFinalizer finalPtr currentSize (free finalPtr)
+{-# INLINE readBuffer #-}
+
+-- | Get current (filled) size of the buffer
+size :: SuperBuffer -> IO Int
+size sb = readIORef $ sb_currentSize sb
+{-# INLINE size #-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/superbuffer-0.2.0.1/src/Data/ByteString/SuperBuffer.hs 
new/superbuffer-0.3.1.1/src/Data/ByteString/SuperBuffer.hs
--- old/superbuffer-0.2.0.1/src/Data/ByteString/SuperBuffer.hs  2016-12-03 
16:28:11.000000000 +0100
+++ new/superbuffer-0.3.1.1/src/Data/ByteString/SuperBuffer.hs  2017-03-27 
22:44:22.000000000 +0200
@@ -2,7 +2,7 @@
 {-# LANGUAGE ForeignFunctionInterface #-}
 {-# LANGUAGE ScopedTypeVariables #-}
 module Data.ByteString.SuperBuffer
-    ( SuperBuffer, withBuffer, appendBuffer, appendBufferT
+    ( SuperBuffer, withBuffer, appendBuffer, appendBufferT, size
     )
 where
 
@@ -27,8 +27,8 @@
 -- valid after this function terminates, so do NOT pass it to some other
 -- thread without waiting for it to finish in the action.
 withBuffer :: Int64 -> (SuperBuffer -> IO ()) -> IO BS.ByteString
-withBuffer size action =
-    bracket (newBuffer size) destroyBuffer $ \buf ->
+withBuffer sz action =
+    bracket (newBuffer sz) destroyBuffer $ \buf ->
     do ok <- try (action buf)
        case ok of
          Left (exception :: SomeException) ->
@@ -39,7 +39,7 @@
 {-# INLINE withBuffer #-}
 
 newBuffer :: Int64 -> IO SuperBuffer
-newBuffer size = SuperBuffer <$> ((,) <$> new_sbuf (fromIntegral size) <*> 
newEmptyMVar)
+newBuffer sz = SuperBuffer <$> ((,) <$> new_sbuf (fromIntegral sz) <*> 
newEmptyMVar)
 {-# INLINE newBuffer #-}
 
 
@@ -72,16 +72,22 @@
 -- be called once
 readBuffer :: SuperBuffer -> IO BS.ByteString
 readBuffer (SuperBuffer (ptr, _)) =
-    do (cstr, size) <- readLocal
-       BS.unsafePackCStringFinalizer (coerce cstr) (fromIntegral size) (free 
cstr)
+    do (cstr, sz) <- readLocal
+       BS.unsafePackCStringFinalizer (coerce cstr) (fromIntegral sz) (free 
cstr)
     where
       readLocal =
           alloca $ \sizePtr ->
           do cstr <- read_sbuf ptr sizePtr
-             size <- peek sizePtr
-             pure (cstr, size)
+             sz <- peek sizePtr
+             pure (cstr, sz)
 {-# INLINE readBuffer #-}
 
+-- | Get current (filled) size of the buffer
+size :: SuperBuffer -> IO Int
+size (SuperBuffer (ptr, _)) =
+    fromIntegral <$> size_sbuf ptr
+{-# INLINE size #-}
+
 data SBuf
 type SuperBufferP = Ptr SBuf
 
@@ -90,3 +96,4 @@
 foreign import ccall unsafe "read_sbuf" read_sbuf :: SuperBufferP -> Ptr CSize 
-> IO CString
 foreign import ccall unsafe "destroy_sbuf" destroy_sbuf :: SuperBufferP -> IO 
()
 foreign import ccall unsafe "destroyContents_sbuf" destroyContents_sbuf :: 
SuperBufferP -> IO ()
+foreign import ccall unsafe "size_sbuf" size_sbuf :: SuperBufferP -> IO CSize
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/superbuffer.cabal 
new/superbuffer-0.3.1.1/superbuffer.cabal
--- old/superbuffer-0.2.0.1/superbuffer.cabal   2016-12-03 15:43:34.000000000 
+0100
+++ new/superbuffer-0.3.1.1/superbuffer.cabal   2017-05-26 19:12:13.000000000 
+0200
@@ -1,16 +1,16 @@
--- This file has been generated from package.yaml by hpack version 0.14.0.
+-- This file has been generated from package.yaml by hpack version 0.15.0.
 --
 -- see: https://github.com/sol/hpack
 
 name:           superbuffer
-version:        0.2.0.1
+version:        0.3.1.1
 synopsis:       Efficiently build a bytestring from smaller chunks
 description:    Efficiently (both fast and memory efficient) build a 
bytestring from smaller chunks
 category:       Web
 homepage:       https://github.com/agrafix/superbuffer#readme
 author:         Alexander Thiemann
 maintainer:     [email protected]
-copyright:      2016 Alexander Thiemann <[email protected]>
+copyright:      2016 - 2017 Alexander Thiemann <[email protected]>
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
@@ -32,6 +32,7 @@
     , bytestring < 0.11
   exposed-modules:
       Data.ByteString.SuperBuffer
+      Data.ByteString.SuperBuffer.Pure
   other-modules:
       Paths_superbuffer
   default-language: Haskell2010
@@ -61,7 +62,7 @@
   build-depends:
       base >= 4.8 && < 5
     , bytestring < 0.11
-    , criterion < 1.2
+    , criterion < 1.3
     , superbuffer
     , buffer-builder
     , async
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/superbuffer-0.2.0.1/test/Test.hs 
new/superbuffer-0.3.1.1/test/Test.hs
--- old/superbuffer-0.2.0.1/test/Test.hs        2016-12-02 10:02:58.000000000 
+0100
+++ new/superbuffer-0.3.1.1/test/Test.hs        2017-03-27 22:45:34.000000000 
+0200
@@ -7,6 +7,7 @@
 import Data.ByteString.SuperBuffer
 import Data.Int
 import qualified Data.ByteString as BS
+import qualified Data.ByteString.SuperBuffer.Pure as P
 
 import Test.Framework
 import Test.QuickCheck.Monadic
@@ -14,6 +15,14 @@
 main :: IO ()
 main = htfMain htf_thisModulesTests
 
+test_size :: IO ()
+test_size =
+    void $
+    withBuffer 8 $ \buf ->
+    do appendBuffer buf "hello"
+       sz <- size buf
+       assertEqual sz 5
+
 test_basic :: IO ()
 test_basic =
     do bs <- fillBuf
@@ -77,3 +86,61 @@
       chunkAction =
           withBuffer bufSize $ \buf ->
           forM_ chunks $ appendBuffer buf
+
+test_sizePure :: IO ()
+test_sizePure =
+    void $
+    P.withBuffer 8 $ \buf ->
+    do P.appendBuffer buf "hello"
+       sz <- P.size buf
+       assertEqual sz 5
+
+test_basicPure :: IO ()
+test_basicPure =
+    do bs <- fillBuf
+       assertEqual bs expected
+    where
+      expected =
+          "hello world! Welcome to S U P E R B U F F E R"
+      fillBuf =
+          P.withBuffer 8 $ \buf ->
+          do P.appendBuffer buf "hello"
+             P.appendBuffer buf " world"
+             P.appendBuffer buf "!"
+             P.appendBuffer buf " Welcome"
+             P.appendBuffer buf " to"
+             P.appendBuffer buf " S U P E R B U F F E R"
+
+test_nullContainedPure :: IO ()
+test_nullContainedPure =
+    do bs <- fillBuf
+       assertEqual bs expected
+    where
+      expected =
+          "hello\0world"
+      fillBuf =
+          P.withBuffer 8 $ \buf ->
+          do P.appendBuffer buf "hello"
+             P.appendBuffer buf "\0world"
+
+test_threadedPure :: IO ()
+test_threadedPure =
+    do bs <- fillBuf
+       assertEqual bs expected
+    where
+      expected =
+          "hello world! Welcome to S U P E R B U F F E R"
+      fillBuf =
+          P.withBuffer 8 $ \buf ->
+          forConcurrently_ ["hello", " world", "!", " Welcome", " to", " S U P 
E R B U F F E R"] $
+          P.appendBufferT buf
+
+prop_appendingWorksPure :: BufferChunks -> Property
+prop_appendingWorksPure (BufferChunks (bufSize, chunks)) =
+    monadicIO $
+    do out <- run chunkAction
+       assert $ out == BS.concat chunks
+    where
+      chunkAction =
+          P.withBuffer (fromIntegral bufSize) $ \buf ->
+          forM_ chunks $ P.appendBuffer buf


Reply via email to