5.8. Monadic Result<T, E> — a value-or-error tagged pair

Monadic Result<T, E> — a value (ok) or an error (err). Functional API for modelling fallible computations where an error carries meaning (unlike a bare Option<T> that only says “missing”).

Both the value side T and the error side E may be non-copyable (array<T>, table<K;V>, lambdas) — constructors and combinators clone or move on the non-copyable branch via static_if (typeinfo can_copy(...)).

Construct via ok(v, type<E>) / err(e, type<T>) (clone), or move_ok(v, type<E>) / move_err(e, type<T>) to move out of a mutable source; compose via map / map_err / and_then / or_else; extract via unwrap / unwrap_or / ??. Bridge to Option<T> via to_option / err_to_option.

See also Option<T> and Result<T, E> and daslib/option for the Option<T> counterpart.

5.8.1. Structures

Result

struct Result

5.8.2. Constructors

err(e: auto(EE); ttype: auto(TT)): auto

def err (e: auto(EE); ttype: auto(TT)) : auto

Arguments:
  • e : auto(EE)

  • ttype : auto(TT)

move_err(e: auto(EE); ttype: auto(TT)): auto

def move_err (var e: auto(EE); ttype: auto(TT)) : auto

Arguments:
  • e : auto(EE)

  • ttype : auto(TT)

move_ok(v: auto(TT); etype: auto(EE)): auto

def move_ok (var v: auto(TT); etype: auto(EE)) : auto

Arguments:
  • v : auto(TT)

  • etype : auto(EE)

ok(v: auto(TT); etype: auto(EE)): auto

def ok (v: auto(TT); etype: auto(EE)) : auto

Arguments:
  • v : auto(TT)

  • etype : auto(EE)

5.8.3. Queries

is_err(r: $Result(type<auto(TT)>, type<auto(EE)>)): bool

def is_err (r: $Result(type<auto(TT)>,type<auto(EE)>)) : bool

Arguments:
  • r : typemacro

is_ok(r: $Result(type<auto(TT)>, type<auto(EE)>)): bool

def is_ok (r: $Result(type<auto(TT)>,type<auto(EE)>)) : bool

Arguments:
  • r : typemacro

5.8.4. Transforming

and_then(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(v:TT):$Result(type<auto(UU)>, type<EE>)>): auto

def and_then (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(v:TT):$Result(type<auto(UU)>,type<EE>)>) : auto

Arguments:
  • r : typemacro

  • f : block<(v:TT):typemacro>

map(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(v:TT):auto(UU)>): auto

def map (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(v:TT):auto(UU)>) : auto

Arguments:
  • r : typemacro

  • f : block<(v:TT):auto(UU)>

map_err(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(e:EE):auto(FF)>): auto

def map_err (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(e:EE):auto(FF)>) : auto

Arguments:
  • r : typemacro

  • f : block<(e:EE):auto(FF)>

or_else(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(e:EE):$Result(type<TT>, type<auto(FF)>)>): auto

def or_else (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(e:EE):$Result(type<TT>,type<auto(FF)>)>) : auto

Arguments:
  • r : typemacro

  • f : block<(e:EE):typemacro>

5.8.5. Extraction

expect_err(r: $Result(type<auto(TT)>, type<auto(EE)>); msg: string): EE

def expect_err (r: $Result(type<auto(TT)>,type<auto(EE)>); msg: string) : EE

Arguments:
  • r : typemacro

  • msg : string

expect_value(r: $Result(type<auto(TT)>, type<auto(EE)>); msg: string): TT

def expect_value (r: $Result(type<auto(TT)>,type<auto(EE)>); msg: string) : TT

Arguments:
  • r : typemacro

  • msg : string

move_unwrap(r: $Result(type<auto(TT)>, type<auto(EE)>)): TT

def move_unwrap (var r: $Result(type<auto(TT)>,type<auto(EE)>)) : TT

Arguments:
  • r : typemacro

move_unwrap_err(r: $Result(type<auto(TT)>, type<auto(EE)>)): EE

def move_unwrap_err (var r: $Result(type<auto(TT)>,type<auto(EE)>)) : EE

Arguments:
  • r : typemacro

unwrap(r: $Result(type<auto(TT)>, type<auto(EE)>)): TT

def unwrap (r: $Result(type<auto(TT)>,type<auto(EE)>)) : TT

Arguments:
  • r : typemacro

unwrap_err(r: $Result(type<auto(TT)>, type<auto(EE)>)): EE

def unwrap_err (r: $Result(type<auto(TT)>,type<auto(EE)>)) : EE

Arguments:
  • r : typemacro

unwrap_or(r: $Result(type<auto(TT)>, type<auto(EE)>); d: TT): TT

def unwrap_or (r: $Result(type<auto(TT)>,type<auto(EE)>); d: TT) : TT

Arguments:
  • r : typemacro

  • d : TT

unwrap_or_default(r: $Result(type<auto(TT)>, type<auto(EE)>)): TT

def unwrap_or_default (r: $Result(type<auto(TT)>,type<auto(EE)>)) : TT

Arguments:
  • r : typemacro

unwrap_or_else(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(e:EE):TT>): TT

def unwrap_or_else (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(e:EE):TT>) : TT

Arguments:
  • r : typemacro

  • f : block<(e:EE):TT>

5.8.6. Side effects

if_err(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(e:EE):void>)

def if_err (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(e:EE):void>)

Arguments:
  • r : typemacro

  • f : block<(e:EE):void>

if_ok(r: $Result(type<auto(TT)>, type<auto(EE)>); f: block<(v:TT):void>)

def if_ok (r: $Result(type<auto(TT)>,type<auto(EE)>); f: block<(v:TT):void>)

Arguments:
  • r : typemacro

  • f : block<(v:TT):void>

5.8.7. Bridges to Option

err_to_option(r: $Result(type<auto(TT)>, type<auto(EE)>)): auto

def err_to_option (r: $Result(type<auto(TT)>,type<auto(EE)>)) : auto

Arguments:
  • r : typemacro

to_option(r: $Result(type<auto(TT)>, type<auto(EE)>)): auto

def to_option (r: $Result(type<auto(TT)>,type<auto(EE)>)) : auto

Arguments:
  • r : typemacro

5.8.8. Operators

$Result(type<auto(TT)>,type<auto(EE)>)!=(r: $Result(type<auto(TT)>, type<auto(EE)>); v: TT): bool

def $Result(type<auto(TT)>,type<auto(EE)>)!= (r: $Result(type<auto(TT)>,type<auto(EE)>); v: TT) : bool

Arguments:
  • r : typemacro

  • v : TT

5.8.8.1. $Result(type<auto(TT)>,type<auto(EE)>)==

$Result(type<auto(TT)>,type<auto(EE)>)==(a: $Result(type<auto(TT)>, type<auto(EE)>); b: $Result(type<auto(TT)>, type<auto(EE)>)): bool

def $Result(type<auto(TT)>,type<auto(EE)>)== (a: $Result(type<auto(TT)>,type<auto(EE)>); b: $Result(type<auto(TT)>,type<auto(EE)>)) : bool

Arguments:
  • a : typemacro implicit

  • b : typemacro implicit

$Result(type<auto(TT)>,type<auto(EE)>)==(r: $Result(type<auto(TT)>, type<auto(EE)>); v: TT): bool

$Result(type<auto(TT)>,type<auto(EE)>)??(r: $Result(type<auto(TT)>, type<auto(EE)>); d: TT): TT

def $Result(type<auto(TT)>,type<auto(EE)>)?? (r: $Result(type<auto(TT)>,type<auto(EE)>); d: TT) : TT

Arguments:
  • r : typemacro

  • d : TT

auto(TT)!=(v: auto(TT); r: $Result(type<TT>, type<auto(EE)>)): bool

def auto(TT)!= (v: auto(TT); r: $Result(type<TT>,type<auto(EE)>)) : bool

Arguments:
  • v : auto(TT)

  • r : typemacro

auto(TT)==(v: auto(TT); r: $Result(type<TT>, type<auto(EE)>)): bool

def auto(TT)== (v: auto(TT); r: $Result(type<TT>,type<auto(EE)>)) : bool

Arguments:
  • v : auto(TT)

  • r : typemacro