Skip to content

Instantly share code, notes, and snippets.

View jtmthf's full-sized avatar

Jack Moore jtmthf

View GitHub Profile
interface ResourcePoolOptions<T> {
defaultSize: number;
maxSize: number;
create: () => T;
}
interface Resource<T> extends Disposable {
value: T;
}
interface Machine<State extends string, Event extends string> {
initialState: State;
transition(currentState: State, event: Event): State;
}
interface MachineDefinition<State extends string, Event extends string> {
initialState: State;
states: Record<State, Record<Event, State>>;
}
interface State<Value extends string, Context> {
value: Value;
context: Context;
}
const ASSIGN_TYPE = Symbol('Assign');
type AssignAction<Context> = {
type: typeof ASSIGN_TYPE;
exec(context: Context): Context;
interface Machine<State extends string, Event extends string> {
initialState: State;
transition(currentState: State, event: Event): State;
}
interface MachineDefinition<State extends string, Event extends string> {
initialState: State;
states: Record<State, {
entry?(): void;
exit?(): void;

PropertySource

A PropertySource is an interface that allows a configuration value to be loaded by its name. An implementation may either be sync or async depending on its backing implmentation.

interface PropertySource {
  get(key: string): unknown;
}
import { Atom } from 'jotai';
import { selectAtom, useAtomValue} from 'jotai/utils';
import { useMemo } from 'react';
import { createTrackedSelector } from 'react-tracked';
type ResolveType<T> = T extends Promise<infer V> ? V : T
export function useSelectAtom<Value, Slice>(
atom: Atom<Value>,
selector: (v: ResolveType<Value>) => Slice,
import { useLayoutEffect, useState } from 'react';
import { EventObject, MachineOptions, StateMachine, Typestate } from 'xstate';
type MaybeLazy<T> = T | (() => T);
export function useMachineOptions<
TContext,
TEvent extends EventObject,
TTypestate extends Typestate<TContext> = { value: any; context: TContext }
>(
import { useRef, useState, MutableRefObject } from 'react';
type ValueCallback<T> = (value: T) => void;
export type ObservableRef<T> = MutableRefObject<T> & {
subscribe(onNext: ValueCallback<T>): Subscription;
};
export interface Subscription {
unsubscribe(): void;
import { useState, useEffect, Dispatch, SetStateAction } from 'react';
import { createContainer } from 'react-tracked';
import { ActionFunction, EventObject, MachineOptions } from 'xstate';
function createUseRegister<V extends object, T>(key: keyof V, useUpdate: () => Dispatch<SetStateAction<V>>) {
return function useRegister(name: string, value: T) {
const setState = useUpdate();
useEffect(() => {
setState((options) => ({
if (!Symbol.observable) {
Symbol.observable = Symbol('observable')
}
export class Observable<T> {
readonly #subscriber: SubscriberFunction<T>;
constructor(subscriber : SubscriberFunction<T>) {
this.#subscriber = subscriber;
}