Skip to content

Instantly share code, notes, and snippets.

@wernerdegroot
Created March 9, 2019 14:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wernerdegroot/6fdebd9eceb37402f4d4a87f60ad1433 to your computer and use it in GitHub Desktop.
Save wernerdegroot/6fdebd9eceb37402f4d4a87f60ad1433 to your computer and use it in GitHub Desktop.
HList.ts
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