// Step 1: compresses buffer to buffer // Step 2: send writer to channel // Step 3: Close result channel to indicate we are done func compressBlock(p, prevTail []byte, z Writer, r result) { defer close(r.result) buf := make([]byte, 0, len(p)) dest := bytes.NewBuffer(buf) var compressor *flate.Writer var err error if len(prevTail) > 0 { compressor, err = flate.NewWriterDict(dest, z.level, prevTail) } else { compressor, err = flate.NewWriter(dest, z.level) } if err != nil { z.pushError(err) return } compressor.Write(p) err = compressor.Flush() if err != nil { z.pushError(err) return } if z.closed { err = compressor.Close() if err != nil { z.pushError(err) return } } // Read back buffer buf = dest.Bytes() r.result <- buf }