Skip to content

Instantly share code, notes, and snippets.

View bakerface's full-sized avatar

Chris Baker bakerface

  • Test and Controls International
  • Taylorsville, Kentucky
View GitHub Profile
@bakerface
bakerface / sleep.ts
Created April 3, 2025 11:34
Abortable promises in TypeScript
import { withAbortableResolvers } from "./with-abortable-resolvers";
export function sleep(ms: number, signal?: AbortSignal): Promise<void> {
const { promise, resolve } = withAbortableResolvers<void>(signal);
const handle = setTimeout(resolve, ms);
return promise.finally(() => clearTimeout(handle));
}
@bakerface
bakerface / SparseSet.js
Last active November 25, 2024 12:48
A sparse set implementation in JavaScript
export class SparseSetIndexOutOfRangeError extends Error {
constructor(message, index, capacity) {
super(message);
this.index = index;
this.capacity = capacity;
}
}
export class SparseSetUnsafe {
constructor(capacity) {
@bakerface
bakerface / example.ts
Last active December 29, 2022 14:39
TypeScript pattern matching in 2 lines of code
import * as Maybe from "./maybe";
import { caseOf } from "./one-of";
const square = (n: number) => n * n;
// serializable as plain js arrays
console.log(Maybe.of(42)); // [ 'Just', 42 ]
// supports exhaustive pattern matching
caseOf(Maybe.map(Maybe.of(3), square), {
@bakerface
bakerface / index.html
Created December 28, 2022 15:03
9x9 TicTacToe
<html>
<head>
<style>
body { width: 100%; }
table { margin: auto; border-spacing: 1rem; }
button { padding: 1rem; }
</style>
</head>
<body>
<table>
@bakerface
bakerface / mocha.h
Last active May 31, 2025 11:00
A single-file implementation of the mochajs test suite runner in pure C
/**
* Copyright (c) 2022 Chris Baker
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
@bakerface
bakerface / co.h
Last active June 10, 2025 15:06
Coroutines in 10 lines of ANSI C
/**
* Copyright (c) 2025 Chris Baker <mail.chris.baker@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
@bakerface
bakerface / crc16.h
Created April 25, 2022 11:21
A single-file CRC-16 CCITT implementation in pure C
/**
* Copyright (c) 2022 Chris Baker
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
@bakerface
bakerface / example.ts
Last active April 17, 2025 13:31
Compile-time checks for fluent types in TypeScript.
export class Person {
private _designation: string;
private _first: string;
private _last: string;
static create(): FluentPerson {
return new Person();
}
private constructor() {
@bakerface
bakerface / match.ts
Last active July 3, 2021 17:06
Basic pattern matching with TypeScript template literals
export type KeysOfParams<S extends string> =
S extends `${infer Before} :${infer Name} ${infer After}`
? KeysOfParams<Before> | Name | KeysOfParams<After>
: S extends `:${infer Name} ${infer After}`
? Name | KeysOfParams<After>
: S extends `${infer Before} :${infer Name}`
? KeysOfParams<Before> | Name
: S extends `:${infer Name}`
? Name
: never;
@bakerface
bakerface / statistics.ts
Last active April 19, 2021 12:48
Statistics in TypeScript
export class Statistics {
private static ensureNotEmpty(arr: readonly number[]): void {
if (arr.length === 0) {
throw new Error("The array must not be empty.");
}
}
static asc(a: number, b: number): number {
return a - b;
}