code: def _check_is_map_or_seq(self, iterable):
      if not is_map_or_seq(iterable):
          node = (
              iterable.value if isinstance(iterable, Node) else iterable
          )
          typ = type(node).__name__
          raise ResolveError(
              f"failed to resolve '{self.where}.{self.name}.foreach'"
              f" in '{self.relpath}': expected list/dictionary, got "
              + typ
          )
  
imports: import logging
  import os
  from collections.abc import Mapping, Sequence
  from copy import deepcopy
  from itertools import product
  from typing import TYPE_CHECKING, Any, Dict, List, NamedTuple, Optional, Tuple, Type, Union
  from funcy import collecting, first, isa, join, reraise
  from dvc.exceptions import DvcException
  from dvc.log import logger
  from dvc.parsing.interpolate import ParseError
  from dvc.utils.objects import cached_property
  from .context import Context, ContextError, KeyNotInContext, MergeError, Node, VarsAlreadyLoaded
  from .interpolate import check_recursive_parse_errors, is_interpolated_string, recurse, to_str
label_desc: Use image node_id 5 for calling the ForeachDefinition obj's underlying member method code with example usage: obj._check_is_map_or_seq(iterable) without return types