parameters: (wrapping_func, result_index=0)
return_statement: return decorator
docstring: Return a decorator version of *wrapping_func*, which is a function that
      modifies an iterable. *result_index* is the position in that function's
      signature where the iterable goes.
  
      This lets you use itertools on the "production end," i.e. at function
      definition. This can augment what the function returns without changing the
      function's code.
  
      For example, to produce a decorator version of :func:`chunked`:
  
          >>> from more_itertools import chunked
          >>> chunker = make_decorator(chunked, result_index=0)
          >>> @chunker(3)
          ... def iter_range(n):
          ...     return iter(range(n))
          ...
          >>> list(iter_range(9))
          [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
  
      To only allow truthy items to be returned:
  
          >>> truth_serum = make_decorator(filter, result_index=1)
          >>> @truth_serum(bool)
          ... def boolean_test():
          ...     return [0, 1, '', ' ', False, True]
          ...
          >>> list(boolean_test())
          [1, ' ', True]
  
      The :func:`peekable` and :func:`seekable` wrappers make for practical
      decorators:
  
          >>> from more_itertools import peekable
          >>> peekable_function = make_decorator(peekable)
          >>> @peekable_function()
          ... def str_range(*args):
          ...     return (str(x) for x in range(*args))
          ...
          >>> it = str_range(1, 20, 2)
          >>> next(it), next(it), next(it)
          ('1', '3', '5')
          >>> it.peek()
          '7'
          >>> next(it)
          '7'
docstring_summary: Return a decorator version of *wrapping_func*, which is a function that
      modifies an iterable. *result_index* is the position in that function's
      signature where the iterable goes.
docstring_tokens: Return a decorator version of * wrapping_func * which is a function that modifies an iterable . * result_index * is the position in that function s signature where the iterable goes .
function: def make_decorator(wrapping_func, result_index=0):
      """Return a decorator version of *wrapping_func*, which is a function that
      modifies an iterable. *result_index* is the position in that function's
      signature where the iterable goes.
  
      This lets you use itertools on the "production end," i.e. at function
      definition. This can augment what the function returns without changing the
      function's code.
  
      For example, to produce a decorator version of :func:`chunked`:
  
          >>> from more_itertools import chunked
          >>> chunker = make_decorator(chunked, result_index=0)
          >>> @chunker(3)
          ... def iter_range(n):
          ...     return iter(range(n))
          ...
          >>> list(iter_range(9))
          [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
  
      To only allow truthy items to be returned:
  
          >>> truth_serum = make_decorator(filter, result_index=1)
          >>> @truth_serum(bool)
          ... def boolean_test():
          ...     return [0, 1, '', ' ', False, True]
          ...
          >>> list(boolean_test())
          [1, ' ', True]
  
      The :func:`peekable` and :func:`seekable` wrappers make for practical
      decorators:
  
          >>> from more_itertools import peekable
          >>> peekable_function = make_decorator(peekable)
          >>> @peekable_function()
          ... def str_range(*args):
          ...     return (str(x) for x in range(*args))
          ...
          >>> it = str_range(1, 20, 2)
          >>> next(it), next(it), next(it)
          ('1', '3', '5')
          >>> it.peek()
          '7'
          >>> next(it)
          '7'
  
      """
      # See https://sites.google.com/site/bbayles/index/decorator_factory for
      # notes on how this works.
      def decorator(*wrapping_args, **wrapping_kwargs):
          def outer_wrapper(f):
              def inner_wrapper(*args, **kwargs):
                  result = f(*args, **kwargs)
                  wrapping_args_ = list(wrapping_args)
                  wrapping_args_.insert(result_index, result)
                  return wrapping_func(*wrapping_args_, **wrapping_kwargs)
  
              return inner_wrapper
  
          return outer_wrapper
  
      return decorator
function_tokens: def make_decorator ( wrapping_func , result_index = 0 ) : # See https://sites.google.com/site/bbayles/index/decorator_factory for # notes on how this works. def decorator ( * wrapping_args , * * wrapping_kwargs ) : def outer_wrapper ( f ) : def inner_wrapper ( * args , * * kwargs ) : result = f ( * args , * * kwargs ) wrapping_args_ = list ( wrapping_args ) wrapping_args_ . insert ( result_index , result ) return wrapping_func ( * wrapping_args_ , * * wrapping_kwargs ) return inner_wrapper return outer_wrapper return decorator