docs: def line(x_fn, y_fn, *, options={}, **interact_params):
      """
      Generates an interactive line chart that allows users to change the
      parameters of the inputs x_fn and y_fn.
  
      Args:
          x_fn (Array | (*args -> Array str | Array int | Array float)):
              If array, uses array values for x-coordinates.
  
              If function, must take parameters to interact with and return an
              array of strings or numbers. These will become the x-coordinates
              of the line plot.
  
          y_fn (Array | (Array, *args -> Array int | Array float)):
              If array, uses array values for y-coordinates.
  
              If function, must take in the output of x_fn as its first parameter
              and optionally other parameters to interact with. Must return an
              array of numbers. These will become the y-coordinates of the line
              plot.
  
      Kwargs:
          {options}
  
          interact_params (dict): Keyword arguments in the same format as
              `ipywidgets.interact`. One argument is required for each argument
              of both `x_fn` and `y_fn`. If `x_fn` and `y_fn` have conflicting
              parameter names, prefix the corresponding kwargs with `x__` and
              `y__`.
  
      Returns:
          VBox with two children: the interactive controls and the figure.
  
      >>> line([1, 2, 3], [4, 7, 10])
      VBox(...)
  
      >>> def x_values(max): return np.arange(0, max)
      >>> def y_values(xs, sd):
      ...     return xs + np.random.normal(len(xs), scale=sd)
      >>> line(x_values, y_values, max=(10, 50), sd=(1, 10))
      VBox(...)
      """
      fig = options.get('_fig', False) or _create_fig(options=options)
      [line] = (_create_marks(fig=fig, marks=[bq.Lines], options=options))
      _add_marks(fig, [line])
  
      def wrapped(**interact_params):
          x_data = util.maybe_call(x_fn, interact_params, prefix='x')
          line.x = x_data
  
          y_bound = util.maybe_curry(y_fn, x_data)
          line.y = util.maybe_call(y_bound, interact_params, prefix='y')
  
      controls = widgets.interactive(wrapped, **interact_params)
  
      return widgets.VBox([controls, fig])