Created
March 9, 2019 14:41
-
-
Save wernerdegroot/6fdebd9eceb37402f4d4a87f60ad1433 to your computer and use it in GitHub Desktop.
HList.ts
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
enum HListType { | |
HCons, | |
HNil | |
} | |
type HNil = { type: typeof HListType.HNil } | |
type HCons<Head, Tail extends HList<any, any>> = { | |
type: typeof HListType.HCons | |
head: Head | |
tail: Tail | |
} | |
type HList<Head, Tail extends HList<any, any>> = HCons<Head, Tail> | HNil | |
function hcons<Head, Tail extends HList<any, any>>(head: Head, tail: Tail): HCons<Head, Tail> { | |
return { type: HListType.HCons, head, tail } | |
} | |
const hnil: HNil = { type: HListType.HNil } | |
const myHList = hcons(4, hcons('true', hcons(false, hnil))) | |
type Equality<A> = (left: A, right: A) => boolean | |
function hconsEquality<Head, Tail extends HList<any, any>>(headEquality: Equality<Head>, tailEquality: Equality<Tail>): Equality<HCons<Head, Tail>> { | |
return (left, right) => { | |
return headEquality(left.head, right.head) && tailEquality(left.tail, right.tail) | |
} | |
} | |
const hnilEquality: Equality<HNil> = (left, right) => true | |
const numberEquality: Equality<number> = (left, right) => left === right | |
const stringEquality: Equality<string> = (left, right) => left === right | |
const booleanEquality: Equality<boolean> = (left, right) => left === right | |
const myHListEquality = hconsEquality(numberEquality, hconsEquality(stringEquality, hconsEquality(booleanEquality, hnilEquality))) | |
console.log(myHListEquality(myHList, myHList)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment