Skip to content

Instantly share code, notes, and snippets.

View jtmthf's full-sized avatar

Jack Moore jtmthf

View GitHub Profile
import { EventObject, State, StateSchema, Typestate, createMachine, interpret } from 'xstate';
type MatchCase<
TContext,
TTypestate extends Typestate<TContext>,
TSV extends TTypestate['value'],
TResult
> = readonly [...TSV[], TResult];
// TODO:
import { useMemo } from "react";
import { Interpreter } from "xstate";
import { useService } from "@xstate/react";
export function useAllowedEvents(service: Interpreter<any>) {
const [state] = useService(service);
const allowedEvents = useMemo(
() =>
state.nextEvents.filter(
(event) => service.machine.transition(state, event).changed
import { useMemo } from "react";
import { Interpreter } from "xstate";
import { useService } from "@xstate/react";
export function useAllowedEvents(service: Interpreter<any>) {
const [state] = useService(service);
const allowedEvents = useMemo(
() =>
state.nextEvents.filter(
(event) => service.machine.transition(state, event).changed
import { RefObject, useEffect, useState } from 'react';
export function useLineCount(ref: RefObject<HTMLElement>): number {
const [lines, setLines] = useState(0);
useEffect(() => {
const resizeObserver = new ResizeObserver(entries => {
entries.forEach(entry => {
const elementHeight = (entry.target as HTMLElement).offsetHeight;
const lineHeight = parseInt(getComputedStyle(entry.target).lineHeight, 10);
export type ResolvedResult<T> = [error: null, value: T];
export type RejectedResult = [error: unknown, value: null];
export type Result<T> = ResolvedResult<T> | RejectedResult;
export function getResult<T>(promise: PromiseLike<T>): Promise<ResolvedResult<T> | RejectedResult> {
return Promise.resolve(promise)
.then(value => [null, value] as [null, T])
.catch(error => [error, null] as [unknown, null]);
}
type IterableRange = IterableIterator<number> & {
start: number;
end: number;
step: number;
};
function range(
startOrEnd: number,
maybeEnd?: number,
maybeStep?: number
class MapKeySetView<T> implements Set<T> {
readonly #map: Map<T, unknown>;
constructor(map: Map<T, unknown>) {
this.#map = map;
}
get size() {
return this.#map.size;
}
# Revert test files that have one line modified
git diff --numstat \
| grep 'test.tsx' \
| awk '{ if($1==1 && $2==1) print $3 }' \
| xargs git checkout --
@jtmthf
jtmthf / pick.ts
Created September 24, 2020 23:17
export const pick = <
T extends Record<keyof unknown, unknown>,
K extends keyof T
>(
object: T,
paths: readonly K[],
): Pick<T, K> =>
Object.assign({}, ...paths.map((path) => ({ [path]: object[path] })));
import { JsonValue } from "type-fest";
function toSerializable(value: unknown): JsonValue | undefined {
switch (typeof value) {
case "string":
case "boolean":
return value;
case "number":
return !isFinite(value) ? null : value;
case "object": {