package telegram

import (
	

	
	
)

// InvokeFunc implements tg.Invoker as function.
type InvokeFunc func(ctx context.Context, input bin.Encoder, output bin.Decoder) error

// Invoke implements tg.Invoker.
func ( InvokeFunc) ( context.Context,  bin.Encoder,  bin.Decoder) error {
	return (, , )
}

// Middleware returns new InvokeFunc for next invoker.
type Middleware interface {
	Handle(next tg.Invoker) InvokeFunc
}

// MiddlewareFunc implements Middleware as function.
type MiddlewareFunc func(next tg.Invoker) InvokeFunc

// Handle implements Middleware.
func ( MiddlewareFunc) ( tg.Invoker) InvokeFunc { return () }

// chainMiddlewares composes new invoker in such order that first element in
// chain is called first, and latest "next" argument will be "invoker".
//
// E.g. we have invoker and two middlewares, so order will be following:
// 0, 1, (invoker), 1 (after "next"), 0 (after "next").
//
// See TestMiddlewareOrder or ExampleMiddleware.
func ( tg.Invoker,  ...Middleware) tg.Invoker {
	if len() == 0 {
		return 
	}
	for  := len() - 1;  >= 0; -- {
		 = [].Handle()
	}
	return 
}