<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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. """

    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])