Skip to content

Instantly share code, notes, and snippets.

@turbotobias
Last active March 23, 2023 01:48
Show Gist options
  • Save turbotobias/8fb8c324a63beb4bcfc66e30e42892a4 to your computer and use it in GitHub Desktop.
Save turbotobias/8fb8c324a63beb4bcfc66e30e42892a4 to your computer and use it in GitHub Desktop.

Revisions

  1. turbotobias revised this gist Mar 23, 2023. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion example-1.ts
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    import { type Result, Ok, Err } from "./@result"
    import { Ok, Err } from "./@result"

    const truthy = (arg?: any) => (!!arg ? Ok(arg) : Err(`falsy`))

  2. turbotobias revised this gist Mar 23, 2023. 1 changed file with 0 additions and 2 deletions.
    2 changes: 0 additions & 2 deletions @result.ts
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,3 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }
    export const Ok = <T>(data: T): Result<T, never> => ({ ok: true, value: data })
    export const Err = <E>(error?: E): Result<never, E> => ({ ok: false, error })
  3. turbotobias revised this gist Mar 23, 2023. 3 changed files with 25 additions and 23 deletions.
    11 changes: 3 additions & 8 deletions example-1.ts
    Original file line number Diff line number Diff line change
    @@ -1,12 +1,7 @@
    import { type Result, Ok, Err } from "./@result"

    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }
    const truthy = (arg?: any) => (!!arg ? Ok(arg) : Err(`falsy`))

    const number = numberIsLessThan10(5)
    const truth = truthy("something")

    if (number.ok) useNumber(number.value) // valid
    else if (number.error) console.trace(number.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
    truth.ok ? console.log(`truthy`) : truth.error ? console.trace(`falsy ${truth.error}`) : console.trace(`unknown error`)
    19 changes: 7 additions & 12 deletions example-2.ts
    Original file line number Diff line number Diff line change
    @@ -1,17 +1,12 @@
    import { type Result, Ok, Err } from "./@result"

    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()

    if (!json) return Err("could not get json from api")
    if (!validate(json.geo)) return Err("did not get valid geo json from api")

    return Ok(json.geo)
    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }

    const geoJson = await fetchGeoJson()
    const number = numberIsLessThan10(5)

    if (geoJson.ok) useGeoJson(geoJson.value) // valid
    else if (geoJson.error) console.trace(geoJson.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
    if (number.ok) useNumber(number.value) // valid
    else if (number.error) console.trace(number.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
    18 changes: 15 additions & 3 deletions example-3.ts
    Original file line number Diff line number Diff line change
    @@ -1,5 +1,17 @@
    const truthy = (arg?: any) => (!!arg ? Ok(arg) : Err(`falsy`))
    import { type Result, Ok, Err } from "./@result"

    const truth = truthy("something")
    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()

    truth.ok ? console.log(`truthy`) : truth.error ? console.trace(`falsy ${truth.error}`) : console.trace(`unknown error`)
    if (!json) return Err("could not get json from api")
    if (!validate(json.geo)) return Err("did not get valid geo json from api")

    return Ok(json.geo)
    }

    const geoJson = await fetchGeoJson()

    if (geoJson.ok) useGeoJson(geoJson.value) // valid
    else if (geoJson.error) console.trace(geoJson.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
  4. turbotobias revised this gist Mar 23, 2023. 1 changed file with 5 additions and 0 deletions.
    5 changes: 5 additions & 0 deletions example-3.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,5 @@
    const truthy = (arg?: any) => (!!arg ? Ok(arg) : Err(`falsy`))

    const truth = truthy("something")

    truth.ok ? console.log(`truthy`) : truth.error ? console.trace(`falsy ${truth.error}`) : console.trace(`unknown error`)
  5. turbotobias revised this gist Mar 23, 2023. 2 changed files with 3 additions and 1 deletion.
    2 changes: 1 addition & 1 deletion example-1.ts
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    import { type Result, Ok, Err } from "./result"
    import { type Result, Ok, Err } from "./@result"

    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    2 changes: 2 additions & 0 deletions example-2.ts
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,5 @@
    import { type Result, Ok, Err } from "./@result"

    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()
  6. turbotobias revised this gist Mar 23, 2023. 2 changed files with 6 additions and 6 deletions.
    6 changes: 3 additions & 3 deletions example-1.ts
    Original file line number Diff line number Diff line change
    @@ -7,6 +7,6 @@ const numberIsLessThan10 = (num: number): Result<number, string> => {

    const number = numberIsLessThan10(5)

    if (number.ok) useNumber(number.value) // ok
    else if (number.error) console.trace(number.error) // known error
    else console.trace("unknown error") // unknown error
    if (number.ok) useNumber(number.value) // valid
    else if (number.error) console.trace(number.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
    6 changes: 3 additions & 3 deletions example-2.ts
    Original file line number Diff line number Diff line change
    @@ -10,6 +10,6 @@ const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {

    const geoJson = await fetchGeoJson()

    if (geoJson.ok) useGeoJson(geoJson.value) // ok
    else if (geoJson.error) console.trace(geoJson.error) // known error
    else console.trace("unknown error") // unknown error
    if (geoJson.ok) useGeoJson(geoJson.value) // valid
    else if (geoJson.error) console.trace(geoJson.error) // invalid with known error
    else console.trace("unknown error") // invalid with unknown error
  7. turbotobias revised this gist Mar 23, 2023. 3 changed files with 0 additions and 0 deletions.
    File renamed without changes.
    File renamed without changes.
    File renamed without changes.
  8. turbotobias revised this gist Mar 23, 2023. 3 changed files with 29 additions and 35 deletions.
    15 changes: 15 additions & 0 deletions async-example.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,15 @@
    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()

    if (!json) return Err("could not get json from api")
    if (!validate(json.geo)) return Err("did not get valid geo json from api")

    return Ok(json.geo)
    }

    const geoJson = await fetchGeoJson()

    if (geoJson.ok) useGeoJson(geoJson.value) // ok
    else if (geoJson.error) console.trace(geoJson.error) // known error
    else console.trace("unknown error") // unknown error
    37 changes: 2 additions & 35 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -1,38 +1,5 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }
    export const Ok = <T>(data: T): Result<T, never> => { ok: true, value: data }
    export const Err = <E>(error?: E): Result<never, E> => { ok: false, error }

    /**
    * simple example
    **/
    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }

    const number = numberIsLessThan10(5)

    if (number.ok) useNumber(number.value) // ok
    else if (number.error) console.trace(number.error) // known error
    else console.trace("unknown error") // unknown error

    /**
    * async example
    **/
    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()

    if (!json) return Err("could not get json from api")
    if (!validate(json.geo)) return Err("did not get valid geo json from api")

    return Ok(json.geo)
    }

    const geoJson = await fetchGeoJson()

    if (geoJson.ok) useGeoJson(geoJson.value) // ok
    else if (geoJson.error) console.trace(geoJson.error) // known error
    else console.trace("unknown error") // unknown error
    export const Ok = <T>(data: T): Result<T, never> => ({ ok: true, value: data })
    export const Err = <E>(error?: E): Result<never, E> => ({ ok: false, error })
    12 changes: 12 additions & 0 deletions simple-example.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,12 @@
    import { type Result, Ok, Err } from "./result"

    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }

    const number = numberIsLessThan10(5)

    if (number.ok) useNumber(number.value) // ok
    else if (number.error) console.trace(number.error) // known error
    else console.trace("unknown error") // unknown error
  9. turbotobias revised this gist Mar 23, 2023. 1 changed file with 8 additions and 12 deletions.
    20 changes: 8 additions & 12 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -1,14 +1,8 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }

    export const Ok = <T>(data: T): Result<T, never> => {
    return { ok: true, value: data }
    }

    export const Err = <E>(error?: E): Result<never, E> => {
    return { ok: false, error }
    }
    export const Ok = <T>(data: T): Result<T, never> => { ok: true, value: data }
    export const Err = <E>(error?: E): Result<never, E> => { ok: false, error }

    /**
    * simple example
    @@ -20,8 +14,9 @@ const numberIsLessThan10 = (num: number): Result<number, string> => {

    const number = numberIsLessThan10(5)

    if (number.ok) useNumber(number.value)
    if (!number.ok) console.trace(number.error)
    if (number.ok) useNumber(number.value) // ok
    else if (number.error) console.trace(number.error) // known error
    else console.trace("unknown error") // unknown error

    /**
    * async example
    @@ -38,5 +33,6 @@ const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {

    const geoJson = await fetchGeoJson()

    if (geoJson.ok) useGeoJson(geoJson.value)
    if (!geoJson.ok) console.trace(geoJson.error)
    if (geoJson.ok) useGeoJson(geoJson.value) // ok
    else if (geoJson.error) console.trace(geoJson.error) // known error
    else console.trace("unknown error") // unknown error
  10. turbotobias revised this gist Mar 23, 2023. 1 changed file with 8 additions and 6 deletions.
    14 changes: 8 additions & 6 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -13,13 +13,15 @@ export const Err = <E>(error?: E): Result<never, E> => {
    /**
    * simple example
    **/
    const numberIsLessThan10 = (num: number): Result<boolean, string> => {
    const numberIsLessThan10 = (num: number): Result<number, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }

    if (numberIsLessThan10.ok) useNumber(result.value)
    if (!numberIsLessThan10.ok) console.trace(result.error)
    const number = numberIsLessThan10(5)

    if (number.ok) useNumber(number.value)
    if (!number.ok) console.trace(number.error)

    /**
    * async example
    @@ -34,7 +36,7 @@ const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    return Ok(json.geo)
    }

    const result = await fetchGeoJson()
    const geoJson = await fetchGeoJson()

    if (result.ok) useGeoJson(result.value)
    if (!result.ok) console.trace(result.error)
    if (geoJson.ok) useGeoJson(geoJson.value)
    if (!geoJson.ok) console.trace(geoJson.error)
  11. turbotobias revised this gist Mar 23, 2023. 1 changed file with 29 additions and 0 deletions.
    29 changes: 29 additions & 0 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -9,3 +9,32 @@ export const Ok = <T>(data: T): Result<T, never> => {
    export const Err = <E>(error?: E): Result<never, E> => {
    return { ok: false, error }
    }

    /**
    * simple example
    **/
    const numberIsLessThan10 = (num: number): Result<boolean, string> => {
    if (num < 10) return Ok(num)
    return Err("number is not less than 10")
    }

    if (numberIsLessThan10.ok) useNumber(result.value)
    if (!numberIsLessThan10.ok) console.trace(result.error)

    /**
    * async example
    **/
    const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
    const res = await fetch(`/api`)
    const json = await res.json()

    if (!json) return Err("could not get json from api")
    if (!validate(json.geo)) return Err("did not get valid geo json from api")

    return Ok(json.geo)
    }

    const result = await fetchGeoJson()

    if (result.ok) useGeoJson(result.value)
    if (!result.ok) console.trace(result.error)
  12. turbotobias revised this gist Mar 23, 2023. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion result.ts
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result?ref=morioh.com */
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }

  13. turbotobias revised this gist Mar 23, 2023. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion result.ts
    Original file line number Diff line number Diff line change
    @@ -1,4 +1,4 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://imhoff.blog/posts/using-results-in-typescript */
    /** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result?ref=morioh.com */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }

  14. turbotobias created this gist Mar 23, 2023.
    11 changes: 11 additions & 0 deletions result.ts
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,11 @@
    /** made by Dan Imhoff, the code below is copy-pasted from https://imhoff.blog/posts/using-results-in-typescript */

    export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }

    export const Ok = <T>(data: T): Result<T, never> => {
    return { ok: true, value: data }
    }

    export const Err = <E>(error?: E): Result<never, E> => {
    return { ok: false, error }
    }