Skip to content

Instantly share code, notes, and snippets.

@bcherny
Last active August 19, 2018 21:29
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 bcherny/46bbb4ed205263f78388c872b27f286f to your computer and use it in GitHub Desktop.
Save bcherny/46bbb4ed205263f78388c872b27f286f to your computer and use it in GitHub Desktop.
Option implementation, once https://github.com/Microsoft/TypeScript/issues/7294 is fixed
type Option<T> = Some<T> | None
type Some<T> = {
flatMap<U>(f: (value: T) => None): None
flatMap<U>(f: (value: T) => Some<U>): Some<U>
flatMap<U>(f: (value: T) => Option<U>): Option<U>
getOrElse(value: T): T
}
type None = {
flatMap<U>(f: (value: never) => Option<U>): None
getOrElse<U>(value: U): U
}
let Some: <T>(value: T): Some<T> = ({
flatMap: f => f(value),
getOrElse: () => value
})
let None: None = {
flatMap: f => None,
getOrElse: value => value
}
function Option<T>(value?: null | undefined): None
function Option<T>(value: T): Some<T>
function Option<T>(value?: T) {
if (value == null) {
return None
}
return Some(value)
}
let a = Option(2)
.flatMap(n => Some(5 * n))
.flatMap(n => Some(5 * n))
.flatMap(() => None)
.flatMap(n => Some(5 * n))
.flatMap(n => Some(5 * n))
.flatMap(() => None)
.getOrElse(16)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment