Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/Maybe.jl
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,14 @@ Since there is no name clash with `Base` API, `using Maybe.Extras`
imports the API defined in `Maybe.Extras`.
"""
baremodule Extras
export getnested, ifnothing, maybe, defaultto
export asmissing, defaultto, definite, frommissing, getnested, ifnothing, maybe
function maybe end
function ifnothing end
function defaultto end
function getnested end
function definite end
function asmissing end
function frommissing end
end

const X = Extras
Expand Down
23 changes: 23 additions & 0 deletions src/docs/asmissing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
Maybe.Extras.asmissing(x)

Translate `Union{Nothing,T,Some{T},Some{Some{T}},...}` to
`Union{T,Missing}`.

This is a shorthand of `something(definite(x), missing)`.

# Examples
```julia
julia> using Maybe.Extras

julia> asmissing(1)
1

julia> asmissing(nothing)
missing

julia> asmissing(Some(Some(1)))
1

julia> asmissing(Some(Some(nothing)))
missing
```
18 changes: 18 additions & 0 deletions src/docs/definite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
Maybe.Extras.definite(x)

Unwrap `Some` recursively and obtain a non-`Some` value. The returned
value is `nothing` if `x` is `nothing` or `nothing` wrapped in `Some`
(possibly multiple times).

# Examples
```julia
julia> using Maybe.Extras

julia> definite(Some(Some(Some(1))))
1

julia> definite(Some(Some(Some(nothing))))

julia> something(definite(Some(Some(nothing))), 2)
2
```
8 changes: 8 additions & 0 deletions src/extras.jl
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,11 @@ Maybe.Extras.defaultto(c) = Maybe.Extras.ifnothing(() -> c)
@inline Maybe.Extras.getnested(x, k, keys...) =
Maybe.Extras.getnested(@something(Maybe.get(x, k), return), keys...)
@inline Maybe.Extras.getnested(x) = Some(x)

Maybe.Extras.definite(x) = x
Maybe.Extras.definite(x::Some) = Maybe.Extras.definite(something(x))

Maybe.Extras.asmissing(x) = something(Maybe.Extras.definite(x), missing)

Maybe.Extras.frommissing(::Missing) = nothing
Maybe.Extras.frommissing(x) = Some(x)