Skip to content

Instantly share code, notes, and snippets.

View patrickroberts's full-sized avatar

Patrick Roberts patrickroberts

View GitHub Profile
@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 / 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() {
@patrickroberts
patrickroberts / auto-mdn.user.js
Last active March 18, 2019 19:06
Auto-complete MDN documentation links
// ==UserScript==
// @name Auto-MDN
// @namespace http://tampermonkey.net/
// @version 3.3
// @description Auto-complete MDN documentation links
// @author Patrick Roberts
// @match https://stackoverflow.com/*
// @grant GM_xmlhttpRequest
// @require https://cdn.jsdelivr.net/gh/mitchellmebane/GM_fetch@e9f8aa00af862665625500e2c2459840084226b4/GM_fetch.min.js
// @require https://cdn.jsdelivr.net/npm/diffhtml/dist/diffhtml.min.js