...
1 package diskv
2
3 import (
4 "compress/flate"
5 "compress/gzip"
6 "compress/zlib"
7 "io"
8 )
9
10
11
12
13
14
15
16 type Compression interface {
17 Writer(dst io.Writer) (io.WriteCloser, error)
18 Reader(src io.Reader) (io.ReadCloser, error)
19 }
20
21
22 func NewGzipCompression() Compression {
23 return NewGzipCompressionLevel(flate.DefaultCompression)
24 }
25
26
27 func NewGzipCompressionLevel(level int) Compression {
28 return &genericCompression{
29 wf: func(w io.Writer) (io.WriteCloser, error) { return gzip.NewWriterLevel(w, level) },
30 rf: func(r io.Reader) (io.ReadCloser, error) { return gzip.NewReader(r) },
31 }
32 }
33
34
35 func NewZlibCompression() Compression {
36 return NewZlibCompressionLevel(flate.DefaultCompression)
37 }
38
39
40 func NewZlibCompressionLevel(level int) Compression {
41 return NewZlibCompressionLevelDict(level, nil)
42 }
43
44
45
46 func NewZlibCompressionLevelDict(level int, dict []byte) Compression {
47 return &genericCompression{
48 func(w io.Writer) (io.WriteCloser, error) { return zlib.NewWriterLevelDict(w, level, dict) },
49 func(r io.Reader) (io.ReadCloser, error) { return zlib.NewReaderDict(r, dict) },
50 }
51 }
52
53 type genericCompression struct {
54 wf func(w io.Writer) (io.WriteCloser, error)
55 rf func(r io.Reader) (io.ReadCloser, error)
56 }
57
58 func (g *genericCompression) Writer(dst io.Writer) (io.WriteCloser, error) {
59 return g.wf(dst)
60 }
61
62 func (g *genericCompression) Reader(src io.Reader) (io.ReadCloser, error) {
63 return g.rf(src)
64 }
65
View as plain text