/* Copyright Yukino Song, SudoMaker Ltd. * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ export type BatchDisposer = (batch?: boolean) => void export type EffectCallback = () => void export type MaybeSignal = T | Signal export interface Signal { value: T readonly connected: boolean get(): T set(value: MaybeSignal): void peek(): T poke(value: T): void touch(): void trigger(): void refresh(): void connect(effect: EffectCallback, runImmediate?: boolean): void hasValue(): boolean inverse(): Signal nullishThen(fallback: MaybeSignal): Signal choose(truthy: MaybeSignal, falsy: MaybeSignal): Signal select(options: MaybeSignal): Signal ? Value : unknown> and(value: MaybeSignal): Signal andNot(value: MaybeSignal): Signal andOr(andValue: MaybeSignal, orValue: MaybeSignal): Signal inverseAnd(value: MaybeSignal): Signal inverseAndNot(value: MaybeSignal): Signal inverseAndOr(andValue: MaybeSignal, orValue: MaybeSignal): Signal or(value: MaybeSignal): Signal orNot(value: MaybeSignal): Signal inverseOr(value: MaybeSignal): Signal inverseOrNot(value: MaybeSignal): Signal eq(value: MaybeSignal): Signal neq(value: MaybeSignal): Signal gt(value: MaybeSignal): Signal lt(value: MaybeSignal): Signal gte(value: MaybeSignal): Signal lte(value: MaybeSignal): Signal toJSON(): T [Symbol.iterator](): IterableIterator ? Item : never> [Symbol.toPrimitive](hint: 'string' | 'number' | 'default'): string | number | boolean } export interface SignalConstructor { new (value: T, compute?: (value: T) => T): Signal readonly prototype: Signal ensure(value: MaybeSignal): Signal ensureAll(...values: T): Signal[] } export const Signal: SignalConstructor export interface SignalFactory { (value: T): Signal (value: MaybeSignal): Signal (value: MaybeSignal, compute: (value: T) => R): Signal ensure(value: MaybeSignal): Signal ensureAll(...values: T): Signal[] } export const signal: SignalFactory export function isSignal(value: unknown): value is Signal export function watch(effect: EffectCallback): BatchDisposer export function computed(compute: () => T): Signal export function merge[], R>(signals: T, handler: (...values: { [K in keyof T]: T[K] extends Signal ? U : T[K] }) => R): Signal export function tpl(strings: TemplateStringsArray, ...exprs: unknown[]): Signal export function tpl(strings: readonly string[], ...exprs: unknown[]): Signal export function tpl(strings: string, ...exprs: unknown[]): Signal export type Deferrer = (callback: () => void) => BatchDisposer | void export function createDefer(deferrer?: Deferrer): ( fn: (commit: (value: MaybeSignal) => void) => BatchDisposer | void, onAbort?: (abort: () => void) => void ) => Signal export const deferred: ReturnType export function createSchedule( deferrer: Deferrer, onAbort?: (abort: () => void) => void ): ( fn: | MaybeSignal | ((commit: (value: MaybeSignal) => void) => BatchDisposer | void) ) => Signal export function connect(signals: Iterable>, effect: EffectCallback, runImmediate?: boolean): void export function bind(handler: (value: unknown) => void, value: MaybeSignal | (() => unknown)): void export function useAction( initial?: T, compute?: (value: T) => T ): [ (listener: (value: T) => void) => void, (value?: T) => void, () => void ] export function derive, K extends keyof T, R = T[K]>(source: MaybeSignal, key: K, compute?: (value: T[K]) => R): Signal export function extract>(source: MaybeSignal): { [K in keyof T]: Signal } export function extract, Keys extends readonly (keyof T)[]>(source: MaybeSignal, ...keys: Keys): { [K in Keys[number]]: Signal } export function derivedExtract>(source: MaybeSignal): { [K in keyof T]: Signal } export function derivedExtract, Keys extends readonly (keyof T)[]>(source: MaybeSignal, ...keys: Keys): { [K in Keys[number]]: Signal } export function makeReactive>(object: T): { [K in keyof T]: T[K] extends Signal ? U : T[K] } export function peek(value: MaybeSignal): T export function poke(target: MaybeSignal, value: T): T export function touch(...values: MaybeSignal[]): void export function read(value: MaybeSignal): T export function readAll(...values: T): { [K in keyof T]: T[K] extends Signal ? U : T[K] } export function write(target: MaybeSignal, value: T | ((previous: T) => T)): T export function listen(signals: Iterable>, callback: EffectCallback): void export function schedule(effects: Iterable): number export function tick(): Promise export function nextTick(callback?: (...args: unknown[]) => void, ...args: unknown[]): Promise export function collectDisposers(disposers: BatchDisposer[], fn: () => void, cleanup?: BatchDisposer): BatchDisposer export function onDispose(callback: BatchDisposer): BatchDisposer export function useEffect(effect: (...args: TArgs) => void | BatchDisposer, ...args: TArgs): () => void export function untrack(fn: (...args: U) => T, ...args: U): T export function freeze any>(fn: T): T export const contextValid: boolean export function onCondition(signal: MaybeSignal, compute?: (value: boolean) => boolean): (match: MaybeSignal) => Signal export type Disposer = BatchDisposer