code: def ffill(
      x: Iterable[X], xp: Iterable[X], fp: Iterable[Y], left: Y
  ) -> Iterator[Y]:
      """Forward-fill interpolation
  
      Parameters
      ----------
      x:
          Output x series. Must be monotonic ascending.
      xp:
          Input x series. Must be strictly monotonic ascending.
      fp:
          Input y series. If it contains more or less elements than xp, the two series
          will be clipped to the shortest one (like in :func:`zip`).
      left:
          Value to yield for x < xp[0]
  
      Yields
      ------
      Forward-fill interpolated elements from fp matching x
  
      Examples
      --------
      >>> list(ffill([0.5, 2.2, 2.3, 4.5], [1, 2, 3], "abc", "-"))
      ["-", "b", "b", "c"]
      """
      it = zip(xp, fp)
      xp_done = False
      xp1, fp1 = None, left
      for xi in x:
          while not xp_done and (xp1 is None or xi >= xp1):  # type: ignore[unreachable]
              fp0 = fp1
              try:
                  xp1, fp1 = next(it)
              except StopIteration:
                  xp_done = True
          yield fp0
  
label_desc: Use image node_id 1 for calling a global function with example usage: ffill(x, xp, fp, left) without return types