Skip to content

Instantly share code, notes, and snippets.

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<!-- Policy file for xmlsocket://socks.example.com -->
<cross-domain-policy>
<!-- This is a master socket policy file -->
<!-- No other socket policies on the host will be permitted -->
<site-control permitted-cross-domain-policies="master-only"/>
var slice = Array.prototype.slice;
function thunkify(fn) {
return function (/* args */) {
var args = slice.call(arguments);
return function (cb) {
var args1 = args;
args1.push(cb);
fn.apply(this, args1);
};
};
.CodeMirror {
background: white;
}
// Adapted from http://lukajcb.github.io/blog/functional/2018/01/03/optimizing-tagless-final.html
import { Applicative, Applicative1 } from 'fp-ts/lib/Applicative'
import { Apply, Apply1, Apply2C, applySecond, liftA4 } from 'fp-ts/lib/Apply'
import * as array from 'fp-ts/lib/Array'
import * as const_ from 'fp-ts/lib/Const'
import { HKT, Type, Type2, URIS, URIS2 } from 'fp-ts/lib/HKT'
import { IO, io, URI as IOURI } from 'fp-ts/lib/IO'
import { Option, some } from 'fp-ts/lib/Option'
import { getProductSemigroup, Semigroup } from 'fp-ts/lib/Semigroup'
@reverofevil
reverofevil / es6-estree.ts
Last active December 23, 2018 04:38
Attempt at proper Mozilla AST typings for ES6
// if you've found this in Google, take a look into https://github.com/babel/babel/tree/master/packages/babel-types first
export type Node = AssignmentProperty
| CatchClause
| ClassBody
| ExportAllDeclaration
| ExportDefaultDeclaration
| ExportNamedDeclaration
| Expression
| Identifier
@reverofevil
reverofevil / index.ts
Created May 3, 2019 22:19
Isomorphic API typing
import { Type, URIS as Uris } from 'fp-ts/lib/HKT';
type JsonMap = { [K: string]: Json }
interface JsonArray extends Array<Json> {}
type Json = JsonMap | JsonArray | number | string | boolean | null
interface Prim<Uri extends Uris> {
num: Type<Uri, number>;
obj: <O>(ss: { [K in keyof O]: Type<Uri, O[K]> }) => Type<Uri, O>;
}
@reverofevil
reverofevil / hoc.ts
Created May 24, 2019 16:33
How to type HOCs in TS
import {ComponentType} from 'react';
import {Omit, Shared, Matching, GetProps} from 'react-redux';
export type Hoc<InjectedProps> = <
C extends ComponentType<Matching<InjectedProps, GetProps<C>>>
>(
WrappedComponent: C,
) => ComponentType<Omit<GetProps<C>, keyof Shared<InjectedProps, GetProps<C>>>>;
@reverofevil
reverofevil / rtti.ts
Created December 1, 2019 23:10
io-ts done right: arbitrarily handled runtime type information (overloading) for typescript
// hkt.ts
interface TagToHkt<T> { }
export type Tag = keyof TagToHkt<any>
export type Apply<F extends Tag, T> = TagToHkt<T>[F]
// util.ts
export type Intersect<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void)
? I
: never;
export type IndexForSure<O, K extends string> = O extends { [K1 in K]: any } ? O[K] : never
@reverofevil
reverofevil / example.ts
Created April 5, 2021 10:58
Custom type error messages in TypeScript
declare const StaticErrorTag: unique symbol;
type StaticError<E extends string> = { [StaticErrorTag]: E }
type AAndBAreSame<T> = T extends {a: any}
? T extends {b: T["a"]}
? T
: StaticError<"Types of `a` and `b` differ">
: StaticError<"No `a` field">
const f = <T,>(t: T & AAndBAreSame<T>) => {};
@reverofevil
reverofevil / concrete.factorio
Last active May 12, 2021 17:36
factorio beaconed refined concrete 45/s
0eNq1XdtyGzkO/ZUpPduzvF/yuL+xlUrJdmema2VJJclz2VT+fVt2xq3YTfPgwH7aynoEkAAOmgQPwW+rm83DsD+M29Pq07fV3XC8PYz707jbrj6t/j2sb3fb4e6Xw/B1PP/v9K/bw3AafgnxX8fV1Wqc/o/j6tN/vq2O42/b9eYs4vT3fph+O56G++m/2K7vz//6IeD6HwGr79OPt3fDX6tP9vtV9+c3jwO5+JH7/vlqNWxP42kcngbw+I+/v2wf7m+GwyT15W+vVvvdcXya2LfVJKL8Gq9Wf68+ZfdrPAueFB7Pfzruh2mg97u7h81w7c+qzgN8Id51xVurke/78oNGfujLzxr5sSvfGY381JfvNfJzX37SyC99+VUjv3ble6eRb01fQVQp6APYqxBs+xAOKgjbPoaDCsO2D+KgArHtoziqUGz7MI4qGNs+jqMKx7YP5KgCsu0jOamQ7PpITiokuz6Sk+5b3EdyViHZzUge/tofhuPx+nRYb4/73eF0fTNsTgsKn03mHxXejYfh9unvaUlDkGsITQ1hSUN8peG434yn0/TH17Kf00Z4Mfar1ddxc/7NtEI77LbX+816WsxdrXYPp/3D6cu0jtwdJrXTnzfD19NqaSBJPtUkM2aWa6gyDUWuocg0zLA/L7FP6+1pWjvf34zb9Wm34LHn+I6vpF+dJZwOu82Xm+H39R+Tg86/eXIjtHY/noZh88PT38/SHs57hSpawF8EyyzinDyf1/NX5DjcPA77/fPiWtqQtgzvYcuvm4fxbp7En+szeubhpxwvDLk8fiuONt8MB7ekwIkVOJmCOYHux/1wfdpd/3aY5n/3huCAwMTL82a8HPmSyMiLDJAx5AkwyKyd8b1vZPamr7Pf5Mrh8OTSxhRS20ZXz3DfTt+QpW+Gn7Ph+ngc7m824/a36/v17e/j9jzO1xB+DqP0qG5SNu5/JICn+sMbkw6LG2YDh7C1ongIFpfsRegI7ifJb5kpLIMheMLVNmp8HQKjMgAqn9Yoizq