| package diskv |
| |
| import ( |
| "compress/flate" |
| "compress/gzip" |
| "compress/zlib" |
| "io" |
| ) |
| |
| // Compression is an interface that Diskv uses to implement compression of |
| // data. Writer takes a destination io.Writer and returns a WriteCloser that |
| // compresses all data written through it. Reader takes a source io.Reader and |
| // returns a ReadCloser that decompresses all data read through it. You may |
| // define these methods on your own type, or use one of the NewCompression |
| // helpers. |
| type Compression interface { |
| Writer(dst io.Writer) (io.WriteCloser, error) |
| Reader(src io.Reader) (io.ReadCloser, error) |
| } |
| |
| // NewGzipCompression returns a Gzip-based Compression. |
| func NewGzipCompression() Compression { |
| return NewGzipCompressionLevel(flate.DefaultCompression) |
| } |
| |
| // NewGzipCompressionLevel returns a Gzip-based Compression with the given level. |
| func NewGzipCompressionLevel(level int) Compression { |
| return &genericCompression{ |
| wf: func(w io.Writer) (io.WriteCloser, error) { return gzip.NewWriterLevel(w, level) }, |
| rf: func(r io.Reader) (io.ReadCloser, error) { return gzip.NewReader(r) }, |
| } |
| } |
| |
| // NewZlibCompression returns a Zlib-based Compression. |
| func NewZlibCompression() Compression { |
| return NewZlibCompressionLevel(flate.DefaultCompression) |
| } |
| |
| // NewZlibCompressionLevel returns a Zlib-based Compression with the given level. |
| func NewZlibCompressionLevel(level int) Compression { |
| return NewZlibCompressionLevelDict(level, nil) |
| } |
| |
| // NewZlibCompressionLevelDict returns a Zlib-based Compression with the given |
| // level, based on the given dictionary. |
| func NewZlibCompressionLevelDict(level int, dict []byte) Compression { |
| return &genericCompression{ |
| func(w io.Writer) (io.WriteCloser, error) { return zlib.NewWriterLevelDict(w, level, dict) }, |
| func(r io.Reader) (io.ReadCloser, error) { return zlib.NewReaderDict(r, dict) }, |
| } |
| } |
| |
| type genericCompression struct { |
| wf func(w io.Writer) (io.WriteCloser, error) |
| rf func(r io.Reader) (io.ReadCloser, error) |
| } |
| |
| func (g *genericCompression) Writer(dst io.Writer) (io.WriteCloser, error) { |
| return g.wf(dst) |
| } |
| |
| func (g *genericCompression) Reader(src io.Reader) (io.ReadCloser, error) { |
| return g.rf(src) |
| } |