package stream

type StreamI interface {

	// 排序
	Sort(fn SortFunc) StreamI

	// 去重
	Distinct(fn DistinctFunc) StreamI

	// 过滤
	Filter(fn FilterFunc) StreamI

	// 分组
	Group(fn GroupFunc) StreamI

	// 反转
	Reverse() StreamI

	// 取前n个元素
	Head(n int64) StreamI

	// 映射元素到对应的处理结果
	Map(fn MapFunc) StreamI

	// 规约
	Reduce(fn ReduceFunc) StreamI

	// 统计数量
	Count() int

	// 取出第一个元素
	First() any

	// 取出最后元素
	Last() any

	// 遍历数据
	ForEach(fn ForEachFunc)

	// 根据底层channel进行数据处理
	Handle(fn HandleFunc) (any, error)

	// 输出规约
	Collect(fn CollectFunc) (any, error)
}

type (
	// CreateFunc 创建StreamI对象方法
	CreateFunc func(source chan<- any)

	// FilterFunc 过滤方法
	FilterFunc func(item any) bool

	// DistinctFunc 去重判断方法
	DistinctFunc func(item any) bool

	// GroupFunc 分组方法
	GroupFunc func(item any) any

	// SortFunc 排序方法
	SortFunc func(a, b any) bool

	// MapFunc map映射方法
	MapFunc func(item any) any

	// ReduceFunc 规约方法
	ReduceFunc func(item1 any, item2 any) any

	// WalkFunc 异步遍历channel中数据进行处理
	WalkFunc func(item any, pipe chan<- any)

	// HandleFunc 处理底层channel方法
	HandleFunc func(pipe <-chan any) (any, error)

	// CollectFunc 输出规约操作
	CollectFunc func(pipe <-chan any) (any, error)

	// ForEachFunc 遍历处理方法
	ForEachFunc func(item any)
)