Skip to content

Instantly share code, notes, and snippets.

View freddi301's full-sized avatar

Frederik Batuna freddi301

View GitHub Profile
@freddi301
freddi301 / Promise.js
Created January 9, 2019 10:58
naive javascript promise
const status = Symbol();
const value = Symbol();
const set = Symbol();
const listeners = Symbol();
class Promise {
constructor(callback) {
this[listeners] = [];
this[status] = "pending";
const resolve = value => {
@freddi301
freddi301 / tagged-union-pattern-match.ts
Created January 16, 2019 15:24
TypeScript taggedUnion pattern match
class TaggedUnionValue<
TaggedUnion extends { [K in keyof TaggedUnion]: any[] },
Tag extends keyof TaggedUnion
> {
constructor(
private readonly tag: Tag,
private readonly value: TaggedUnion[Tag],
) {}
}
@freddi301
freddi301 / function-composition.ts
Created March 5, 2019 16:51
TypeScript function composition
function pipe<A, B>(f: (a: A) => B) {
return {
end: f,
pipe<C>(g: (b: B) => C) {
return pipe((a: A) => g(f(a)));
}
};
}
function compose<A, B>(f: (a: A) => B) {
@freddi301
freddi301 / validate.ts
Created March 6, 2019 11:12
TypeScript Validation
class DataValid<T, E> {
constructor(public data: T) {}
}
class DataInvalid<T, E> {
constructor(public error: E, public got: unknown) {}
}
type DataValidity<T, E> = DataValid<T, E> | DataInvalid<T, E>;
type DataValidator<T, E> = (data: unknown) => DataValidity<T, E>;
type DataValidatorData<
@freddi301
freddi301 / pattern-match.ts
Created March 25, 2019 14:05
Typescript Pattern matching
const match = <T>(item: T) => <
Matchers extends ((item: T) => Match<any> | undefined)[]
>(
...cases: Matchers
): Exclude<ReturnType<Matchers[number]>, undefined>["value"] => {
for (const matcher of cases) {
const result = matcher(item) as ReturnType<Matchers[number]>;
if (result) {
return result.value;
}
@freddi301
freddi301 / force.tsx
Created May 21, 2019 09:39
Force simulation
const ns = [
{ name: "a", x: 200.01, y: 200.01 },
{ name: "b", x: 220, y: 220 },
{ name: "c", x: 180, y: 200.01 },
{ name: "d", x: 182, y: 201 },
{ name: "e", x: 230, y: 170 },
{ name: "f", x: Math.random() * 400, y: Math.random() * 400 },
{ name: "g", x: Math.random() * 400, y: Math.random() * 400 },
];
import sourcecode
case class Symbol(name: String)(implicit line: sourcecode.Line)
case class Struct(tag: Symbol, entries: Map[Symbol, Struct])
sealed trait TypeTerm
case class Union(cases: Map[Symbol, Map[Symbol, TypeTerm]]) extends TypeTerm
@freddi301
freddi301 / named-curry.ts
Created June 8, 2019 01:25
Typescript named curry functino
type Tequal<A, B> = A extends B ? (B extends A ? true : false) : false;
type Bind<P extends Record<string, any>, R> = Tequal<P, {}> extends false
? (<K extends keyof P>(
key: K,
value: P[K]
) => Bind<Pick<P, Exclude<keyof P, K>>, R>)
: () => R;
function curryNamed<Params extends Record<string, any>, R>(
@freddi301
freddi301 / ipfs-setup.sh
Last active June 18, 2019 15:16
Setup your IPFS node on digital ocean ubuntu
# You must run these command manually
mkdir ipfs
cd ipfs
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
source ~/.profile
nvm install stable
nvm use stable
npm install -g yarn
@freddi301
freddi301 / node.rs
Created June 21, 2019 15:52
Rust hash prefix tree
extern crate crypto;
use self::crypto::digest::Digest;
use self::crypto::sha2::Sha256;
use std::mem;
use std::rc::Rc;
fn main() {
let mut hasher = Sha256::new();
// write input message