docs: def walkscan(x0, y0, xn=0.25, xp=0.25, yn=0.25, yp=0.25):
      """Scan pixels in a random walk pattern with given step probabilities. The
      random walk will continue indefinitely unless a skip transformation is used
      with the 'stop' parameter set or a clip transformation is used with the
      'abort' parameter set to True. The probabilities are normalized to sum to 1.
  
      :param x0: Initial x-coordinate
      :type x0: int
      :param y0: Initial y-coordinate
      :type y0: int
      :param xn: Probability of moving in the negative x direction
      :type xn: float
      :param xp: Probability of moving in the positive x direction
      :type xp: float
      :param yn: Probability of moving in the negative y direction
      :type yn: float
      :param yp: Probability of moving in the positive y direction
      :type yp: float
      """
  
      # Validate inputs
      if xn < 0: raise ValueError("Negative x probabilty must be non-negative")
      if xp < 0: raise ValueError("Positive x probabilty must be non-negative")
      if yn < 0: raise ValueError("Negative y probabilty must be non-negative")
      if yp < 0: raise ValueError("Positive y probabilty must be non-negative")
  
      # Compute normalized probability
      total = xp + xn + yp + yn
      xn /= total
      xp /= total
      yn /= total
      yp /= total
  
      # Compute cumulative probability
      cxn = xn
      cxp = cxn + xp
      cyn = cxp + yn
  
      # Initialize position
      x, y = x0, y0
  
      while True:
  
          yield x, y
  
          # Take random step
          probability = random.random()
          if probability <= cxn:
              x -= 1
          elif probability <= cxp:
              x += 1
          elif probability <= cyn:
              y -= 1
          else:
              y += 1