Skip to content

Instantly share code, notes, and snippets.

@webstrand
webstrand / tsc-one-file.bash
Created April 2, 2025 18:50
Compile one file in a project using `tsc`
#!/usr/bin/env -S unshare -Umr -- bash
set -euo pipefail;
tmpfile=$(mktemp);
cpp -P -E tsconfig.json | FILE=$1 jq '.files = [env.FILE] | del(.include)' > $tmpfile;
mount --bind $tmpfile tsconfig.json;
rm $tmpfile;
exec pnpm exec tsc -p tsconfig.json
@webstrand
webstrand / reactive-remap.mts
Last active March 29, 2025 22:54
Remapping utilities for reactive signals
import {type JSX, createMemo, createRoot, onCleanup} from "solid-js";
import {Public, type RemapOperations, enshroudOperations, remapArray} from "./remap.mts";
export interface RemapOperationsConcrete<key, value, reference> extends RemapOperations<key, value, reference> {
create: (ref: reference, key: key) => value;
intoKey: (ref: reference) => key;
}
export function RemapKeyed<key, val, ref>(props: {
refs: ArrayLike<ref>;
@webstrand
webstrand / deepsixr.rs
Last active March 17, 2025 02:12
Event listener for i3wm, dynamically creates numeric workspaces
#![feature(error_generic_member_access)]
use i3_ipc::{event, reply, I3Stream};
use itertools::Itertools;
use nix::sys::memfd::memfd_create;
use nix::sys::memfd::MemFdCreateFlag;
use std::backtrace::Backtrace;
use std::cmp;
use std::collections::HashMap;
use std::error::Error;
use std::fs::File;
@webstrand
webstrand / map-set-like.mts
Created February 27, 2025 16:34
Maplike and Setlike objects that are fast and structurally compatible
interface Maplike<key, value> {
get(key: key): [value] | undefined;
set(key: key, value?: value): void;
delete(key: key): boolean;
}
interface Setlike<value> {
get(value: value): [unknown] | undefined;
set(value: value): void;
delete(value: value): boolean;
import { bench, do_not_optimize, run } from './node_modules/mitata/src/main.mjs';
const ub = 100_000;
const adHoc = {
[Symbol.iterator]() {
return {
i: 0,
next() {
return this.i < ub ? { value: this.i++ } : { done: true }
@webstrand
webstrand / map-weak.ts
Created January 30, 2025 19:47
Transparent Map<K, WeakRef<V extends WeakKey>>
const retainment = new WeakMap<WeakRef<WeakKey>, unknown>();
export class MapWeak<K, V extends WeakKey> implements Map<K, V> {
#map: Map<K, WeakRef<V>>;
#finalizer = new FinalizationRegistry<K>(key => {
this.#map.delete(key);
});
constructor(entries?: Iterable<readonly [K, V]> | null | undefined) {
const entriesWeak: ConstructorParameters<typeof Map<K, WeakRef<V>>>[0] =
function ordgroupIterable<reference, key>(
refs: Accessor<Iterable<reference>>,
keyFn: (ref: reference) => key
): Accessor<ReadonlyMap<key, Accessor<readonly reference[]>>> {
const signals = createMemo((keyset: Map<key, Signal<readonly reference[]>>) => {
const exists = new Set();
let changed = false;
// Check for group creations
const ord: key[] = [];
@webstrand
webstrand / obsidian-open.sh
Created November 9, 2024 21:46
A command to create or update the named (default: temporary-vault) Obsidian Vault and open it in Obsidian.
#!/bin/bash
set -euo pipefail
shopt -s lastpipe
name="temporary-vault"
already_set_path=
path="$(pwd)"
_usage() {
local status=${1:-0}
export class SharedMap<K extends string, V> extends Map<string, V> {
storageKey: string;
subscriptions = new Set<(added: Iterable<string>, deleted: Iterable<string>) => void>;
updatedKeys!: Set<string>;
deletedKeys!: Set<string>;
timeoutId = 0;
validateValue;
deserializeValue;
serializeValue;
(?(DEFINE)
(?<S>[\x20\x9\xD\xA]+)
(?<NameStartChar>[A-Za-z:_\xC0-\xD6\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}])
(?<NameChar>(?&NameStartChar)|[\-\.0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}])
(?<Name>(?&NameStartChar)(?&NameChar)*)
(?<EntityRef>&(?&Name);)
(?<PercRef>%(?&Name);)
(?<Reference>(?&EntityRef)|(?&PercRef))
(?<AttValue>"(?:[^<&"]|(?&Reference))*"|'(?:[^<&']|(?&Reference))*'|[^"'`=<>\x20\x9\xD\xA]+)
(?<Attribute>(?&Name)(?:=(?:(?&AttValue))?)?)