All files index.ts

100% Statements 10/10
100% Branches 12/12
100% Functions 9/9
100% Lines 10/10

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48          26x       2x 2x             2x 2x             6x 6x             9x 9x           1x              
export type None = null | undefined
 
export type Nullable<T> = T | None
 
function nullableIsNone<T> (nullable: Nullable<T>): boolean {
  return nullable === null || nullable === undefined
}
 
function nullableMap<A, B> (func: (val: A) => B): (nullable: Nullable<A>) => Nullable<B> {
  return function (nullable: Nullable<A>): Nullable<B> {
    return nullableIsNone(nullable)
      ? null
      : func(nullable as A)
  }
}
 
function nullableWithDefault<T> (defaultVal: T): (nullable: Nullable<T>) => T {
  return function (nullable: Nullable<T>): T {
    return nullableIsNone(nullable)
      ? defaultVal
      : nullable as T
  }
}
 
function nullableAndThen<A, B> (func: (val: A) => Nullable<B>): (nullable: Nullable<A>) => Nullable<B> {
  return function (nullable: Nullable<A>): Nullable<B> {
    return nullableIsNone(nullable)
      ? null
      : func(nullable as A)
  }
}
 
function nullableAp<A, B> (targetNullable: Nullable<A>): (applicativeNullable: Nullable<(val: A) => B>) => Nullable<B> {
  return function (applicativeNullable: Nullable<(val: A) => B>): Nullable<B> {
    return nullableIsNone(applicativeNullable) || nullableIsNone(targetNullable)
      ? null
      : (applicativeNullable as (val: A) => B)(targetNullable as A)
  }
}
 
export const Nullable = {
  andThen: nullableAndThen,
  ap: nullableAp,
  isNone: nullableIsNone,
  map: nullableMap,
  withDefault: nullableWithDefault,
}