Files
learngo/27-functional-programming/log-parser-exp/report.go
Inanc Gumus 4b2d2a3d6b optimize: log parser
add: fast text reader to log parser
2019-08-07 13:40:01 +03:00

63 lines
1.0 KiB
Go

package main
import "os"
type (
inputFunc func() ([]result, error)
outputFunc func([]result) error
)
type report struct {
input inputFunc
filter filterFunc
group groupFunc
output outputFunc
}
func newReport() *report {
return &report{
filter: noopFilter,
group: noopGrouper,
input: textReader(os.Stdin),
output: textWriter(os.Stdout),
}
}
func (r *report) from(fn inputFunc) *report {
r.input = fn
return r
}
func (r *report) to(fn outputFunc) *report {
r.output = fn
return r
}
func (r *report) filterBy(fn filterFunc) *report {
r.filter = fn
return r
}
func (r *report) groupBy(fn groupFunc) *report {
r.group = fn
return r
}
func (r *report) start() ([]result, error) {
// input filterBy groupBy
// scanner (result) bool map[string]result
//
// stdin -> []result -> []results -> []result -> output(stdout)
res, err := r.input()
if err != nil {
return nil, err
}
res = filterBy(res, r.filter)
res = groupBy(res, r.group)
err = r.output(res)
return res, err
}