Skip to content

Instantly share code, notes, and snippets.

@KSXGitHub
Created February 24, 2019 15:35
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 KSXGitHub/c6771a6d910d0e8598086872effb221e to your computer and use it in GitHub Desktop.
Save KSXGitHub/c6771a6d910d0e8598086872effb221e to your computer and use it in GitHub Desktop.
interface MaybeBase {
readonly loaded: boolean
}
interface Some<X> extends MaybeBase {
readonly loaded: true
readonly value: X
}
interface None extends MaybeBase {
readonly loaded: false
}
type Maybe<X> = Some<X> | None
const none = (): None => ({ loaded: false })
const some = <X> (x: X): Some<X> => ({ loaded: true, value: x })
function maybe(x: null | undefined): None
function maybe<X>(x: X): Some<X>
function maybe<X>(x: X): Maybe<X> {
return x === undefined || x === null
? none()
: some(x)
}
const loaded = <X>(x: Maybe<X>): x is Some<X> => x.loaded
const isSome = loaded
const isNone = (x: Maybe<any>): x is None => !x.loaded
// --------------
const foo = maybe(null) // None
const bar = maybe(undefined) // None
const baz = maybe(123) // Some<number>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment