package event_v2

type Pipeline struct {
	send    interface{} // 穿过管道的上下文
	through []Listener   // 中间件数组
	current int          // 当前执行到第几个中间件
}

func (p *Pipeline) Send(context interface{}) *Pipeline {
	p.send = context
	return p
}

func (p *Pipeline) Through(middlewares []Listener) *Pipeline {
	p.through = middlewares
	return p
}

func (p *Pipeline) Exec() {
	if len(p.through) > p.current {
		m := p.through[p.current]
		p.current += 1
		m(p.send, func(c interface{}) {
			p.Exec()
		})
	}

}

// 这里是路由的最后一站
func (p *Pipeline) Then(then func(context interface{})) {
	// 按照顺序执行
	// 将then作为最后一站的中间件
	var m Listener
	m = func(c interface{}, next func(c interface{})) {
		then(c)
		next(c)
	}
	p.through = append(p.through, m)
	p.Exec()
}
