1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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)
- }
|