code: def _generate_indices(
      left_index: np.ndarray,
      right_index: np.ndarray,
      conditions: list[tuple[pd.Series, pd.Series, str]],
  ) -> tuple:
      """
      Run a for loop to get the final indices.
      This iteratively goes through each condition,
      builds a boolean array,
      and gets indices for rows that meet the condition requirements.
      `conditions` is a list of tuples, where a tuple is of the form:
      `(Series from df, Series from right, operator)`.
      """
  
      for condition in conditions:
          left, right, op = condition
          left = left._values[left_index]
          right = right._values[right_index]
          op = operator_map[op]
          mask = op(left, right)
          if not mask.any():
              return None
          if is_extension_array_dtype(mask):
              mask = mask.to_numpy(dtype=bool, na_value=False)
          if not mask.all():
              left_index = left_index[mask]
              right_index = right_index[mask]
  
      return left_index, right_index
  
imports: from __future__ import annotations
  import operator
  import warnings
  from typing import Any, Hashable, Literal, Optional, Union
  import numpy
  import pandas
  import pandas_flavor
  from pandas.api.types import is_datetime64_dtype, is_dtype_equal, is_extension_array_dtype, is_numeric_dtype, is_timedelta64_dtype
  from pandas.core.reshape.merge import _MergeOperation
  from janitor.functions.utils import _generic_func_cond_join, _JoinOperator, _keep_output, col, greater_than_join_types, less_than_join_types
  from janitor.utils import check, check_column, find_stack_level
label_desc: Use image node_id 6 for calling a global function with example usage: _generate_indices(left_index, right_index, conditions) and returns: left_index,  right_index, None