Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion packages/agera/src/internals/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,13 @@ export type AnyAccessorOrSignal = AnyAccessor | AnySignal

export type AccessorValue<T> = T extends Accessor<infer U> ? U : never

export type MaybeAccessorValue<T> = T extends Accessor<infer U> ? U : T
export type SignalishValue<T> = T extends Accessor<infer U> ? U : T

/**
* @deprecated Use `SignalishValue`
* @todo Drop at the next major
*/
export type MaybeAccessorValue<T> = SignalishValue<T>

export type Mountable<S extends AnySignal> = S & {
node: EnableVirtualFlags<S['node'], 'mountable'>
Expand Down
8 changes: 4 additions & 4 deletions packages/intl/src/format/match.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
type ValueOrAccessor,
type Signalish,
$get,
identity,
isFunction
Expand All @@ -20,15 +20,15 @@ export type MatchParams<
K extends string,
B extends Partial<Record<string, AnyFormat>>
> = {
[P in K]: ValueOrAccessor<number | string>
[P in K]: Signalish<number | string>
} & UnionToIntersection<CaseParams<B[keyof B]>>

export type ArgMatchFn = FnWithParams<ValueOrAccessor<number | string>>
export type ArgMatchFn = FnWithParams<Signalish<number | string>>

export type MatchFn<
K extends string,
B extends Partial<Record<string, AnyFormat>>
> = FnWithParams<MatchParams<K, B> | ValueOrAccessor<number | string>>
> = FnWithParams<MatchParams<K, B> | Signalish<number | string>>

export type CasesFn<
K extends string,
Expand Down
8 changes: 4 additions & 4 deletions packages/intl/src/format/params.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {
type ValueOrAccessor,
type Signalish,
$get,
isFunction
} from '@nano_kit/store'
Expand All @@ -25,9 +25,9 @@ export type RequiredParamKeys<P extends ParamsFormats> = {
export type OptionalParamKeys<P extends ParamsFormats> = Exclude<keyof P, RequiredParamKeys<P>>

export type ParamsValues<P extends ParamsFormats> = {
[K in RequiredParamKeys<P>]: ValueOrAccessor<FormatInput<P[K]>>
[K in RequiredParamKeys<P>]: Signalish<FormatInput<P[K]>>
} & {
[K in OptionalParamKeys<P>]?: ValueOrAccessor<FormatInput<P[K]> | undefined>
[K in OptionalParamKeys<P>]?: Signalish<FormatInput<P[K]> | undefined>
}

export type ParamsFn<P extends ParamsFormats> = FnWithParams<ParamsValues<P>>
Expand All @@ -36,7 +36,7 @@ type PreformatOutput = string | undefined | FnWithAnyParams

type ComposedParamsFn<P extends ParamsFormats, O> = FnWithParams<ParamsValues<P> & UnionToIntersection<ParamsOf<O>>>

type Replace = (ctx: FormatContext, text: string, params: Record<string, ValueOrAccessor<ReplacementValue>>) => string
type Replace = (ctx: FormatContext, text: string, params: Record<string, Signalish<ReplacementValue>>) => string

/**
* Creates a parameter interpolation formatter.
Expand Down
12 changes: 6 additions & 6 deletions packages/kida/src/effect.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,27 @@ import {
isAccessor,
subscribe
} from 'agera'
import type { ValueOrAccessor } from './types.js'
import type { Signalish } from './types.js'

export * from './internals/effect.js'

/**
* Subscribe to accessor changes or call callback with value if it's not an accessor.
* Callback will be called immediately.
* Will trigger accessor mount if applicable.
* @param valueOrAccessor - The accessor to subscribe to or a value to call the callback with.
* @param source - The accessor to subscribe to or a value to call the callback with.
* @param fn - The callback to call on value change.
* @param noDefer - Ignore subscription defer. Enabled by default.
* @returns A function to stop the subscription.
*/
export function subscribeAny<T>(
valueOrAccessor: ValueOrAccessor<T>,
source: Signalish<T>,
callback: (value: T) => void,
noDefer = true
) {
if (isAccessor(valueOrAccessor)) {
return subscribe(valueOrAccessor, callback, noDefer)
if (isAccessor(source)) {
return subscribe(source, callback, noDefer)
}

callback(valueOrAccessor)
callback(source)
}
46 changes: 23 additions & 23 deletions packages/kida/src/fops_experement.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { Accessor } from 'agera'
import type { ValueOrAccessor } from './types.js'
import type { Signalish } from './types.js'
import { $get } from './utils.js'

/**
Expand All @@ -10,8 +10,8 @@ import { $get } from './utils.js'
*/
/* @__NO_SIDE_EFFECTS__ */
export function or<L, R>(
left: ValueOrAccessor<L>,
right: ValueOrAccessor<R>
left: Signalish<L>,
right: Signalish<R>
): Accessor<L | R> {
return () => $get(left) || $get(right)
}
Expand All @@ -22,7 +22,7 @@ export function or<L, R>(
* @returns An accessor that returns the first truthy value
*/
/* @__NO_SIDE_EFFECTS__ */
export function some<T>(...args: ValueOrAccessor<T>[]): Accessor<T> {
export function some<T>(...args: Signalish<T>[]): Accessor<T> {
return () => {
let value: T

Expand All @@ -46,8 +46,8 @@ export function some<T>(...args: ValueOrAccessor<T>[]): Accessor<T> {
*/
/* @__NO_SIDE_EFFECTS__ */
export function and<L, R>(
left: ValueOrAccessor<L>,
right: ValueOrAccessor<R>
left: Signalish<L>,
right: Signalish<R>
): Accessor<L | R> {
return () => $get(left) && $get(right)
}
Expand All @@ -58,7 +58,7 @@ export function and<L, R>(
* @returns An accessor that returns the last value if all are truthy
*/
/* @__NO_SIDE_EFFECTS__ */
export function every<T>(...args: ValueOrAccessor<T>[]): Accessor<T> {
export function every<T>(...args: Signalish<T>[]): Accessor<T> {
return () => {
let value: T

Expand All @@ -80,7 +80,7 @@ export function every<T>(...args: ValueOrAccessor<T>[]): Accessor<T> {
* @returns An accessor that returns the negated boolean result
*/
/* @__NO_SIDE_EFFECTS__ */
export function not<T>(value: ValueOrAccessor<T>): Accessor<boolean> {
export function not<T>(value: Signalish<T>): Accessor<boolean> {
return () => !$get(value)
}

Expand All @@ -92,8 +92,8 @@ export function not<T>(value: ValueOrAccessor<T>): Accessor<boolean> {
*/
/* @__NO_SIDE_EFFECTS__ */
export function is(
left: ValueOrAccessor<unknown>,
right: ValueOrAccessor<unknown>
left: Signalish<unknown>,
right: Signalish<unknown>
): Accessor<boolean> {
return () => $get(left) === $get(right)
}
Expand All @@ -106,8 +106,8 @@ export function is(
*/
/* @__NO_SIDE_EFFECTS__ */
export function isNot(
left: ValueOrAccessor<unknown>,
right: ValueOrAccessor<unknown>
left: Signalish<unknown>,
right: Signalish<unknown>
): Accessor<boolean> {
return () => $get(left) !== $get(right)
}
Expand All @@ -120,8 +120,8 @@ export function isNot(
*/
/* @__NO_SIDE_EFFECTS__ */
export function gt(
left: ValueOrAccessor<number>,
right: ValueOrAccessor<number>
left: Signalish<number>,
right: Signalish<number>
): Accessor<boolean> {
return () => $get(left) > $get(right)
}
Expand All @@ -134,8 +134,8 @@ export function gt(
*/
/* @__NO_SIDE_EFFECTS__ */
export function gte(
left: ValueOrAccessor<number>,
right: ValueOrAccessor<number>
left: Signalish<number>,
right: Signalish<number>
): Accessor<boolean> {
return () => $get(left) >= $get(right)
}
Expand All @@ -148,8 +148,8 @@ export function gte(
*/
/* @__NO_SIDE_EFFECTS__ */
export function lt(
left: ValueOrAccessor<number>,
right: ValueOrAccessor<number>
left: Signalish<number>,
right: Signalish<number>
): Accessor<boolean> {
return () => $get(left) < $get(right)
}
Expand All @@ -162,8 +162,8 @@ export function lt(
*/
/* @__NO_SIDE_EFFECTS__ */
export function lte(
left: ValueOrAccessor<number>,
right: ValueOrAccessor<number>
left: Signalish<number>,
right: Signalish<number>
): Accessor<boolean> {
return () => $get(left) <= $get(right)
}
Expand All @@ -177,9 +177,9 @@ export function lte(
*/
/* @__NO_SIDE_EFFECTS__ */
export function when<T, U>(
condition: ValueOrAccessor<unknown>,
then: ValueOrAccessor<T>,
otherwise?: ValueOrAccessor<U>
condition: Signalish<unknown>,
then: Signalish<T>,
otherwise?: Signalish<U>
): Accessor<T | U | undefined> {
return () => ($get(condition) ? $get(then) : otherwise && $get(otherwise))
}
28 changes: 24 additions & 4 deletions packages/kida/src/internals/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,33 @@ export type PickEmptyValue<T> = T extends EmptyValue ? T : never

export type PickObjectValue<T> = T extends AnyObject ? T : never

export type ValueOrSignal<T> = T | ReadableSignal<T>
export type Signalish<T> = T | Accessor<T>

export type ValueOrWritableSignal<T> = T | WritableSignal<T>
export type AnySignalish = Signalish<any>

/**
* @deprecated Use `Signalish`
* @todo Drop at the next major
*/
export type ValueOrAccessor<T> = Signalish<T>

export type ValueOrAccessor<T> = T | Accessor<T>
/**
* @deprecated Use `Signalish`
* @todo Drop at the next major
*/
export type AnyValueOrAccessor = AnySignalish

export type AnyValueOrAccessor = ValueOrAccessor<any>
/**
* @deprecated Use `Signalish`
* @todo Drop at the next major
*/
export type ValueOrSignal<T> = T | ReadableSignal<T>

/**
* @deprecated Use `Signalish`
* @todo Drop at the next major
*/
export type ValueOrWritableSignal<T> = T | WritableSignal<T>

export type ToSignal<T> = [T] extends [AnyWritableSignal]
? T
Expand Down
54 changes: 27 additions & 27 deletions packages/kida/src/internals/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import type {
ToAccessor,
ToSignal,
ToAccessorOrSignal,
ValueOrAccessor
Signalish
} from './types.js'

/**
Expand Down Expand Up @@ -62,71 +62,71 @@ export function assignKey<

/**
* Get value from signal or return value with tracking
* @param valueOr$signal - Value or signal
* @param source - Value or signal
* @returns Value
*/
export function $get<T>(valueOr$signal: ValueOrAccessor<T>): T {
return isAccessor(valueOr$signal) ? valueOr$signal() : valueOr$signal
export function $get<T>(source: Signalish<T>): T {
return isAccessor(source) ? source() : source
}

/**
* Get value from signal or return value without tracking
* @param valueOr$signal - Value or signal
* @param source - Value or signal
* @returns Value
*/
/* @__NO_SIDE_EFFECTS__ */
export function get<T>(valueOrAccessor: ValueOrAccessor<T>): T {
return untracked(() => $get(valueOrAccessor))
export function get<T>(source: Signalish<T>): T {
return untracked(() => $get(source))
}

/**
* Create signal from value or return signal
* @param valueOrSignal - Value or signal
* @param source - Value or signal
* @returns Writable signal
*/
export function toSignal<T>(
valueOrSignal: T
source: T
): ToSignal<T>

/* @__NO_SIDE_EFFECTS__ */
export function toSignal(valueOrSignal: unknown) {
return isSignal(valueOrSignal)
? valueOrSignal
: isAccessor(valueOrSignal)
? computed(valueOrSignal)
: signal(valueOrSignal)
export function toSignal(source: unknown) {
return isSignal(source)
? source
: isAccessor(source)
? computed(source)
: signal(source)
}

/**
* Create accessor from value or return accessor
* @param valueOrAccessor - Value or accessor
* @param source - Value or accessor
* @returns Accessor
*/
export function toAccessor<T>(
valueOrAccessor: T
source: T
): ToAccessor<T>

/* @__NO_SIDE_EFFECTS__ */
export function toAccessor(valueOrReadable: unknown) {
return isAccessor(valueOrReadable)
? valueOrReadable
: () => valueOrReadable
export function toAccessor(source: unknown) {
return isAccessor(source)
? source
: () => source
}

/**
* Create signal from value or return accessor or signal
* @param valueOrAccessor - Value or accessor or signal
* @param source - Value or accessor or signal
* @returns Accessor or signal
*/
export function toAccessorOrSignal<T>(
valueOrAccessor: T
source: T
): ToAccessorOrSignal<T>

/* @__NO_SIDE_EFFECTS__ */
export function toAccessorOrSignal(valueOrReadable: unknown) {
return isAccessor(valueOrReadable)
? valueOrReadable
: signal(valueOrReadable)
export function toAccessorOrSignal(source: unknown) {
return isAccessor(source)
? source
: signal(source)
}

/**
Expand Down
Loading