Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@patrickroberts
patrickroberts / immer.ts
Last active July 10, 2022 17:22
Implementation of produce function that supports Maps and Sets
class Draft<T extends object> {
private staged = false;
private committed = false;
private readonly immutable: Readonly<T>;
public readonly mutable: T;
private target: unknown;
protected pool: Pool;
public constructor (immutable: Readonly<T>, mutable: T, target: unknown, pool: Pool) {
this.immutable = immutable;
@patrickroberts
patrickroberts / rpc.ts
Last active December 31, 2021 21:54
TypeScript RPC implementation inspired by Comlink and workerize-loader
export type WorkerModule = Record<string, (...args: any) => any>;
export type Remote<T extends WorkerModule> = {
[K in keyof T]: (
T[K] extends (...args: infer Args) => infer R
? (...args: Args) => (R extends Promise<any> ? R : Promise<R>)
: never
);
};
@patrickroberts
patrickroberts / snowflake.user.js
Last active December 3, 2021 19:42
Let it snow
// ==UserScript==
// @name Snow
// @version 1.0
// @description Make it snow
// @match *://*/*
// @grant none
// ==/UserScript==
(() => {
'use strict';
// ==UserScript==
// @name Override Trainer Sprite
// @match https://play.pokemonshowdown.com/*
// ==/UserScript==
(function() {
'use strict';
const style = document.createElement('style');
style.textContent = '.trainer-near .trainersprite { background-image: url(https://i.imgur.com/yTfxwzF.png) !important; background-size: contain; transform: scaleX(1) !important; }';
// ==UserScript==
// @name Enlarge Pokemon Showdown Battle
// @match https://play.pokemonshowdown.com/*
// ==/UserScript==
(function() {
'use strict';
const style = document.createElement('style');
const scale = 1.5;
@patrickroberts
patrickroberts / revert-se-font-stack.user.js
Last active May 17, 2021 11:42
Revert Stack Exchange font stack
// ==UserScript==
// @name Revert Stack Exchange font stack
// @match https://*/*
// ==/UserScript==
document.head.appendChild(
Object.assign(
document.createElement('style'),
{ textContent: 'body{--ff-sans:Arial,"Helvetica Neue",Helvetica,sans-serif;--ff-serif:Georgia,Times New Roman,Times,serif;--ff-mono:Consolas,Menlo,Monaco,Lucida Console,Liberation Mono,DejaVu Sans Mono,Bitstream Vera Sans Mono,Courier New,monospace,sans-serif;}' }
)
@patrickroberts
patrickroberts / formatDate.js
Last active April 18, 2020 07:57
Small utility library for formatting Date objects in JavaScript
/**
* Usage:
*
* const fmt = formatDate('%dd-%MMM-%yy', 'en-US');
* console.log(fmt(new Date())); // 18-Apr-20
*/
function formatDate (fmt, locales, defaultOptions) {
function formatPart (option, value, fallbackImpl, options = { [option]: value }) {
// lazily initialize format implementation
let formatImpl;
@patrickroberts
patrickroberts / yt-sub-sorter.user.js
Last active November 28, 2022 09:17
YouTube Subscription Sorter
// ==UserScript==
// @name YouTube Subscription Sorter
// @version 0.3
// @author Patrick Roberts
// @match https://www.youtube.com/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
@patrickroberts
patrickroberts / co.js
Last active May 29, 2021 00:16
Coroutine microimplementation
export default function co(gen) {
return function (...args) {
const iter = Function.prototype.apply.call(gen, this, args);
const resume = (value) => {
try {
const result = iter.next(value);
const promise = Promise.resolve(result.value);
return result.done ? promise : promise.then(resume);
} catch (error) {
@patrickroberts
patrickroberts / theme-toggle.user.js
Created March 30, 2020 22:26
Dark Mode Toggle in Menu Header
// ==UserScript==
// @name Stack Overflow Theme Toggle
// @version 0.1
// @description Shortcut for Dark Mode on Stack Overflow
// @author Patrick Roberts
// @match https://stackoverflow.com/*
// @grant none
// ==/UserScript==
$(function() {