import type {SignalRef} from 'vega';

export type Rename = (oldSignalName: string) => string;

/**
 * A class that behaves like a SignalRef but lazily generates the signal.
 * The provided generator function should use `Model.getSignalName` to use the correct signal name.
 */
export class SignalRefWrapper implements SignalRef {
  constructor(exprGenerator: () => string) {
    Object.defineProperty(this, 'signal', {
      enumerable: true,
      get: exprGenerator,
    });
  }

  public signal: string; // for ts

  public static fromName(rename: Rename, signalName: string) {
    return new SignalRefWrapper(() => rename(signalName));
  }
}
