0no-co / wonka

🎩 A tiny but capable push & pull stream library for TypeScript and Flow
MIT License
709 stars 29 forks source link

chore: Update data structure #155

Closed kitten closed 1 year ago

kitten commented 1 year ago

Summary

This updates the internal data structures of SignalKind signals to be backwards compatible but simpler. This results in a slight speedup in V8.

// before
export function start<T>(talkback: TalkbackFn): Start<T> {
  const box: any = [talkback];
  box.tag = SignalKind.Start;
  return box;
}

export function push<T>(value: T): Push<T> {
  const box: any = [value];
  box.tag = SignalKind.Push;
  return box;
}

// after
export function start<T>(talkback: TalkbackFn): Start<T> {
  return {
    tag: SignalKind.Start,
    0: talkback,
  } as Start<T>;
}

export function push<T>(value: T): Push<T> {
  return {
    tag: SignalKind.Push,
    0: value,
  } as Push<T>;
}

These are backwards-compatible because Wonka code (even before the current major, is only ever guaranteed to access [0] or .tag but never any array primitives.

Set of changes