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 / cancellation-token.ts
Last active March 4, 2024 22:51
CancellationToken implementation in Typescript
export type CancellationSubscriber = (err: Error) => void;
export type Unsubscribe = () => void;
export interface CancellationToken {
subscribe(subscriber: CancellationSubscriber): Unsubscribe;
}
export class CancellationError extends Error {
public readonly name = "CancellationError";
public readonly message = "The operation was cancelled";
@bakerface
bakerface / redis-backup.sh
Last active February 9, 2024 00:37
Backup Heroku Redis Database
#!/usr/bin/env bash
REDIS_URL=$(heroku config:get REDIS_URL $@)
REDIS_USERNAME_AND_PASSWORD=$(echo $REDIS_URL | cut -d@ -f1)
REDIS_HOSTNAME_AND_PORT=$(echo $REDIS_URL | cut -d@ -f2)
REDIS_HOSTNAME=$(echo $REDIS_HOSTNAME_AND_PORT | cut -d: -f1)
REDIS_PORT=$(echo $REDIS_HOSTNAME_AND_PORT | cut -d: -f2)
REDIS_PASSWORD=$(echo $REDIS_USERNAME_AND_PASSWORD | cut -d: -f3)
# redis-dump -h $REDIS_HOSTNAME -p $REDIS_PORT -a $REDIS_PASSWORD > redis.dump
@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 April 25, 2022 11:38
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
Created April 25, 2022 11:33
A single-file coroutine 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 / 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 / coroutine.c
Last active October 7, 2021 23:20
Coroutines in 20 lines of ANSI C
typedef struct {
unsigned short line;
} coroutine_t;
#define COROUTINE_LINE_NONE ((unsigned short) 0)
#define COROUTINE_LINE_DONE ((unsigned short) -1)
#define coroutine_init(co) (co)->line = COROUTINE_LINE_NONE
#define coroutine_done(co) ((co)->line == COROUTINE_LINE_DONE)
@bakerface
bakerface / schema.ts
Last active July 7, 2021 11:03
Schemas in typescript
export interface ArrayOfSchema<T> {
readonly type: "arrayOf";
readonly payload: T;
}
function arrayOfSchema<T>(payload: T): ArrayOfSchema<T> {
return { type: "arrayOf", payload };
}
export interface BooleanSchema {
@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;