docs: def combinations(iterable, r):
      """Calculate combinations
  
      >>> list(combinations('ABCD',2))
      [['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C'], ['B', 'D'], ['C', 'D']]
  
      >>> list(combinations(range(4), 3))
      [[0, 1, 2], [0, 1, 3], [0, 2, 3], [1, 2, 3]]
  
      Args:
          iterable: Any iterable object.
          r: Size of combination.
  
      Yields:
          list: Combination of size r.
  
      """
      pool = tuple(iterable)
      n = len(pool)
      if r > n:
          return
  
      indices = list(range(r))
      yield list(pool[i] for i in indices)
  
      while True:
          for i in reversed(range(r)):
              if indices[i] != i + n - r:
                  break
          else:
              return
          indices[i] += 1
          for j in range(i + 1, r):
              indices[j] = indices[j - 1] + 1
          yield list(pool[i] for i in indices)