func Read(ctx context.Context, category Category, linesCh chan []byte) error {
	filesCh := make(chan string, WATCH_RESULTS_BUFFER_SIZE)
	resultCh := make(chan error, 1)
	watcherCtx, cancel := context.WithCancel(ctx)
	defer cancel()
	go func() {
		resultCh <- Watch(watcherCtx, category, filesCh)
	}()
	readBuffer := bufio.NewReader(nil)
	for {
		select {
		case filename := <-filesCh:
			err := readFile(ctx, filename, readBuffer, linesCh)
			if err != nil {
				return fmt.Errorf("reading processing file %s: %v", filename, err)
			}
		case err := <-resultCh:
			if err != nil {
				return fmt.Errorf("watcher internal error: %v", err)
			}
			return nil
		}
	}
}
Read starts to watch for category's files
and stream their content to linesCh line by line
it deletes fully sent files immediately (no confirm mechanics)
@TODO implement some kind of confirm
if error occurs, Read exits immediately, closing all background stuff
read process can be cancelled by cancelling parent ctx
keep in mind that Read blocks your current goroutine, so you need to use it in separate one
if you need more efficient read (batching, etc), you can use Watcher along with UnescapeLine func
package util
import (
	"badoo/_packages/log"
	"bufio"
	"context"
	"fmt"
	"io"
	"os"
)
const WATCH_RESULTS_BUFFER_SIZE = 100