diff options
| author | Joris | 2025-03-17 13:23:15 +0100 | 
|---|---|---|
| committer | Joris | 2025-03-17 13:23:15 +0100 | 
| commit | 1435f9e28aff7ab791c29f7d3017fa5baae2649b (patch) | |
| tree | a81e731f947b6bba3b1e859dd9ec0eb588a79cde /src | |
| parent | 47fd76920584bbbcde634395398f1640421eb60d (diff) | |
Add withState2 and withState3
Diffstat (limited to 'src')
| -rw-r--r-- | src/rx.ts | 74 | 
1 files changed, 74 insertions, 0 deletions
| @@ -9,6 +9,8 @@ export type Html    | number    | Tag    | WithState<any> +  | WithState2<any, any> +  | WithState3<any, any, any>    | Array<Html>    | Rx<Html> @@ -27,6 +29,18 @@ interface WithState<A> {    getChildren: (v: Var<A>) => Html  } +interface WithState2<A, B> { +  type: 'WithState2' +  init: [A, B] +  getChildren: (v1: Var<A>, v2: Var<B>) => Html +} + +interface WithState3<A, B, C> { +  type: 'WithState3' +  init: [A, B, C] +  getChildren: (v1: Var<A>, v2: Var<B>, v3: Var<C>) => Html +} +  interface Attributes {    [key: string]: Rx<AttributeValue> | AttributeValue  } @@ -44,6 +58,8 @@ function isHtml(x: any): x is Html {      || typeof x === 'number'      || isTag(x)      || isWithState(x) +    || isWithState2(x) +    || isWithState3(x)      || isRx(x)      || Array.isArray(x))  } @@ -98,6 +114,22 @@ export function withState<A>(init: A, getChildren: (v: Var<A>) => Html): WithSta    }  } +export function withState2<A, B>(init: [A, B], getChildren: (v1: Var<A>, v2: Var<B>) => Html): WithState2<A, B> { +  return { +    type: 'WithState2', +    init, +    getChildren +  } +} + +export function withState3<A, B, C>(init: [A, B, C], getChildren: (v1: Var<A>, v2: Var<B>, v3: Var<C>) => Html): WithState3<A, B, C> { +  return { +    type: 'WithState3', +    init, +    getChildren +  } +} +  // Rx  export type RxAble<A> = Rx<A> | A @@ -412,6 +444,40 @@ function appendChild(state: State, element: Element, child: Html, lastAdded?: No        remove: () => appendRes.remove(),        lastAdded: appendRes.lastAdded      } +  } else if (isWithState2(child)) { +    const { init, getChildren } = child +    const [ init1, init2 ] = init +    const v1 = state.register(init1) +    const v2 = state.register(init2) +    const children = getChildren(v1, v2) +    const appendRes = appendChild(state, element, children) +    return { +      cancel: () => { +        appendRes.cancel() +        state.unregister(v1) +        state.unregister(v2) +      }, +      remove: () => appendRes.remove(), +      lastAdded: appendRes.lastAdded +    } +  } else if (isWithState3(child)) { +    const { init, getChildren } = child +    const [ init1, init2, init3 ] = init +    const v1 = state.register(init1) +    const v2 = state.register(init2) +    const v3 = state.register(init3) +    const children = getChildren(v1, v2, v3) +    const appendRes = appendChild(state, element, children) +    return { +      cancel: () => { +        appendRes.cancel() +        state.unregister(v1) +        state.unregister(v2) +        state.unregister(v3) +      }, +      remove: () => appendRes.remove(), +      lastAdded: appendRes.lastAdded +    }    } else if (isRx(child)) {      const rxBase = document.createTextNode('')      appendNode(element, rxBase, lastAdded) @@ -455,6 +521,14 @@ function isWithState<A>(x: any): x is WithState<A> {    return x !== undefined && x.type === "WithState"  } +function isWithState2<A, B>(x: any): x is WithState2<A, B> { +  return x !== undefined && x.type === "WithState2" +} + +function isWithState3<A, B, C>(x: any): x is WithState3<A, B, C> { +  return x !== undefined && x.type === "WithState3" +} +  function appendNode(base: Element, node: Node, lastAdded?: Node) {    if (lastAdded !== undefined) {      base.insertBefore(node, lastAdded.nextSibling) | 
