Skip to content

Instantly share code, notes, and snippets.

@mikehadlow
Last active May 1, 2023 22:52
Show Gist options
  • Select an option

  • Save mikehadlow/65347bade6210c73e216c58e183d7c60 to your computer and use it in GitHub Desktop.

Select an option

Save mikehadlow/65347bade6210c73e216c58e183d7c60 to your computer and use it in GitHub Desktop.

Revisions

  1. mikehadlow revised this gist Mar 7, 2023. 1 changed file with 2 additions and 2 deletions.
    4 changes: 2 additions & 2 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -12,13 +12,13 @@ type Result<S, F> = (Success<S> | Failure<F>) & Bindable<S, F>
    const toResult = <S, F>(input: S): Result<S, F> => ({
    success: true,
    value: input,
    bind: <B,>(func: ((input: S) => Result<B, F>)): Result<B, F> => func(input)
    bind: func => func(input)
    })

    const toFailure = <S, F>(message: F): Result<S, F> => ({
    success: false,
    message: message,
    bind: <B,>(_: ((input: S) => Result<B, F>)): Result<B, F> => toFailure(message)
    bind: _ => toFailure(message)
    })

    // Let's try it out...
  2. mikehadlow created this gist Mar 7, 2023.
    58 changes: 58 additions & 0 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,58 @@
    // Result

    type Success<S> = { success: true, value: S }
    type Failure<F> = { success: false, message: F }

    type Bindable<S, F> = {
    bind: <B,>(func: (input: S) => Result<B, F>) => Result<B, F>
    }

    type Result<S, F> = (Success<S> | Failure<F>) & Bindable<S, F>

    const toResult = <S, F>(input: S): Result<S, F> => ({
    success: true,
    value: input,
    bind: <B,>(func: ((input: S) => Result<B, F>)): Result<B, F> => func(input)
    })

    const toFailure = <S, F>(message: F): Result<S, F> => ({
    success: false,
    message: message,
    bind: <B,>(_: ((input: S) => Result<B, F>)): Result<B, F> => toFailure(message)
    })

    // Let's try it out...

    const isEven = (input: number): Result<number, string> => {
    if(input % 2 === 0) {
    return toResult(input)
    }
    return toFailure("Not even!")
    }

    const divisibleBy3 = (input: number): Result<number, string> => {
    if(input % 3 === 0) {
    return toResult(input)
    }
    return toFailure("Not divisible by 3!")
    }

    const testWith = (input: number): void => {
    const inputResult = toResult<number, string>(input)

    const result = inputResult.bind(isEven).bind(divisibleBy3)

    if(result.success) {
    console.log(`${input} Success: ${result.value}`)
    } else {
    console.log(`${input} Failure: ${result.message}`)
    }
    }

    const main = () => {
    testWith(6)
    testWith(8)
    testWith(9)
    }

    main()