Skip to content

Instantly share code, notes, and snippets.

@safareli
Created March 1, 2021 11:34
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 safareli/aa6ebbd8c74c9fdb843b2baba6241b8b to your computer and use it in GitHub Desktop.
Save safareli/aa6ebbd8c74c9fdb843b2baba6241b8b to your computer and use it in GitHub Desktop.
type _Boolean = <A>(onTrue: () => A, onFalse: () => A) => A
const _true: _Boolean = (onTrue) => onTrue()
const _false: _Boolean = (_, onFalse) => onFalse()
const _if = <A>(condition: _Boolean, onTrue: () => A, onFalse: () => A): A => {
return condition(onTrue, onFalse)
}
const _and = (a: _Boolean,b: _Boolean): _Boolean => {
return (onTrue: () => any, onFalse: () => any) => {
return a(() => b(onTrue,onFalse), onFalse)
}
}
const _or = (a: _Boolean,b: _Boolean): _Boolean => {
return (onTrue: () => any, onFalse: () => any) => {
return a(onTrue, () => b(onTrue,onFalse))
}
}
console.log("AND")
_if(_and(_true,_true),() => console.log("true"), () => console.log("false"))
_if(_and(_false,_true),() => console.log("true"), () => console.log("false"))
_if(_and(_true,_false),() => console.log("true"), () => console.log("false"))
_if(_and(_false,_false),() => console.log("true"), () => console.log("false"))
console.log("OR")
_if(_or(_true,_true),() => console.log("true"), () => console.log("false"))
_if(_or(_false,_true),() => console.log("true"), () => console.log("false"))
_if(_or(_true,_false),() => console.log("true"), () => console.log("false"))
_if(_or(_false,_false),() => console.log("true"), () => console.log("false"))
type _Maybe<A> = <R>(onNothing: () => R, onJust: (val:A) => R) => R
const _just = <A>(x:A):_Maybe<A> => <R>(onNothing: () => R, onJust: (val:A) => R) => onJust(x)
const _nothing: <A>() => _Maybe<A> = () => <R>(onNothing: () => R, onJust: (val:A) => R) => onNothing()
const x = _just(1)
x(() => console.log("nothing"), (n) => console.log("just",n))
function isOdd(n: number): _Maybe<number> {
return n % 2 === 0 ? _just(n) : _nothing()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment