Skip to content

Latest commit

 

History

History
416 lines (294 loc) · 6.89 KB

optional.md

File metadata and controls

416 lines (294 loc) · 6.89 KB

Optional

Optional is a type that may or may not contain a non-nil value.

Source

Usage

import (
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

Index

Documentation

Of

Returns an Optional with a non-nil value.

Signature:

func Of[T any](value T) Optional[T]

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    value := 42
    opt := optional.Of(value)

    fmt.Println(opt.Get())

    // Output:
    // 42
}

FromNillable

Returns an Optional for a given value, which may be nil.

Signature:

func FromNillable[T any](value *T) Optional[T]

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    var value *int = nil
    opt := optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())

    value = new(int)
    *value = 42
    opt = optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())


    // Output:
    // false
    // true
}

Default

Returns an default Optional instance.

Signature:

func Default[T any]() Optional[T]

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    fmt.Println(optDefault.IsNil())

    // Output:
    // true
}

IsNil

Checks if the Optional is nil.

Signature:

func (o Optional[T]) IsNil() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    fmt.Println(optDefault.IsNil())

    // Output:
    // true
}

IsNotNil

Checks if there is a value not nil.

Signature:

func (o Optional[T]) IsNotNil() bool

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    var value *int = nil
    opt := optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())

    value = new(int)
    *value = 42
    opt = optional.FromNillable(value)

    fmt.Println(opt.IsNotNil())


    // Output:
    // false
    // true
}

IfNotNil

Performs the given action with the value if a value is present.

Signature:

func (o Optional[T]) IfNotNil(action func(value T))

Example:

package main

import (
    "fmt"
     "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    called := false
    action := func(value int) { called = true }

    optDefault := optional.Default[int]()
    optDefault.IfNotNil(action)

    fmt.Println(called)

    called = false // Reset for next test
    optWithValue := optional.Of(42)
    optWithValue.IfNotNil(action)

    fmt.Println(optWithValue.IsNotNil())

    // Output:
    // false
    // true
}

IfNotNilOrElse

Performs the action with the value if not nil, otherwise performs the fallback action.

Signature:

func (o Optional[T]) IfNotNilOrElse(action func(value T), fallbackAction func())

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    calledWithValue := false
    valueAction := func(value int) { calledWithValue = true }
    emptyAction := func() { t.Errorf("Empty action should not be called when value is present") }

    optWithValue := optional.Of(42)
    optWithValue.IfNotNilOrElse(valueAction, emptyAction)

    fmt.Println(calledWithValue)

    calledWithEmpty := false
    valueAction = func(value int) { t.Errorf("Value action should not be called when value is not present") }
    emptyAction = func() { calledWithEmpty = true }

    optDefault := optional.Default[int]()
    optDefault.IfNotNilOrElse(valueAction, emptyAction)

    fmt.Println(calledWithEmpty)

    // Output:
    // true
    // true
}

Unwrap

Returns the value if not nil, otherwise panics.

Signature:

func (o Optional[T]) Unwrap() T

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    value := 42
    opt := optional.Of(value)

    fmt.Println(opt.Unwrap())

    // Output:
    // 42
}

OrElse

Returns the value if not nill, otherwise returns other.

Signature:

func (o Optional[T]) OrElse(other T) T

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    val := optDefault.OrElse(100)
    fmt.Println(val)

    optWithValue := optional.Of(42)
    val = optWithValue.OrElse(100)
    fmt.Println(val)

    // Output:
    // 100
    // 42
}

OrElseGet

Returns the value if not nil, otherwise invokes action and returns the result.

Signature:

func (o Optional[T]) OrElseGet(action func() T) T

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    action := func() int { return 100 }

    val := optDefault.OrElseGet(action)
    fmt.Println(val)

    // Output:
    // 100
}

OrElseTrigger

Returns the value if present, otherwise returns an error.

Signature:

 OrElseTrigger(errorHandler func() error) (T, error)

Example:

package main

import (
    "fmt"
    "github.com/duke-git/lancet/v2/datastructure/optional"
)

func main() {
    optDefault := optional.Default[int]()
    _, err := optDefault.OrElseTrigger(func() error { return errors.New("no value") })
    
    fmt.Println(err.Error())

    optWithValue := optional.Of(42)
    val, err := optWithValue.OrElseTrigger(func() error { return errors.New("no value") })

    fmt.Println(val)
    fmt.Println(err)

    // Output:
    // no value
    // 42
    // nil
}