Skip to content

Instantly share code, notes, and snippets.

View freddi301's full-sized avatar

Frederik Batuna freddi301

View GitHub Profile
@freddi301
freddi301 / lazy.ts
Last active October 25, 2019 13:49
Typescript call by need aka lazy
export type Lazy<Value> = () => Value
export function lazy<Value>(thunk: () => Value){
let value: Value // will hold computed value
let factory: (() => Value) | null = thunk // used as check if value is computed and allow thunk to be garbage collected
return () => {
if (!factory) {
return value
} else {
value = factory()
@freddi301
freddi301 / fiber.ts
Created August 6, 2019 08:30
Fiber (react hooks outside of react)
import { any } from "prop-types";
type Cell = { initialized: boolean; state: any; next: any };
export function Cell(): Cell {
return { initialized: false, state: null, next: null };
}
export type CellFunction = <State, Initial>(
callback: (state: State | Initial) => State,
@freddi301
freddi301 / statefulObservable.ts
Created June 24, 2019 13:57
Typescripty Stateful Observable
/*
let a = 1
let b = 2
const u = plus(a, mul(b,b))
const f = x => plus(a, x)
const k = f(b)
@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
@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 / 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>(
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 / 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 },
];
@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 / 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<