From 89719ce8e61f50ffae4a880c4897f4ad4290a9cd Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Mon, 20 Jul 2020 17:48:30 -0700 Subject: [PATCH 1/2] Add `definite` and `asmissing` --- src/Maybe.jl | 4 +++- src/docs/asmissing.md | 23 +++++++++++++++++++++++ src/docs/definite.md | 18 ++++++++++++++++++ src/extras.jl | 5 +++++ 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/docs/asmissing.md create mode 100644 src/docs/definite.md diff --git a/src/Maybe.jl b/src/Maybe.jl index 039262c..b16af3b 100644 --- a/src/Maybe.jl +++ b/src/Maybe.jl @@ -23,11 +23,13 @@ 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, getnested, ifnothing, maybe function maybe end function ifnothing end function defaultto end function getnested end +function definite end +function asmissing end end const X = Extras diff --git a/src/docs/asmissing.md b/src/docs/asmissing.md new file mode 100644 index 0000000..61e8dcd --- /dev/null +++ b/src/docs/asmissing.md @@ -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 +``` diff --git a/src/docs/definite.md b/src/docs/definite.md new file mode 100644 index 0000000..6f052de --- /dev/null +++ b/src/docs/definite.md @@ -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 +``` diff --git a/src/extras.jl b/src/extras.jl index 0cb8d67..9108c08 100644 --- a/src/extras.jl +++ b/src/extras.jl @@ -26,3 +26,8 @@ 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) From 52e278efba171e2d1b3e15335c937a1a39cfefbd Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Mon, 3 Aug 2020 23:15:57 -0700 Subject: [PATCH 2/2] Add `frommissing` --- src/Maybe.jl | 3 ++- src/extras.jl | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Maybe.jl b/src/Maybe.jl index b16af3b..d1996f7 100644 --- a/src/Maybe.jl +++ b/src/Maybe.jl @@ -23,13 +23,14 @@ Since there is no name clash with `Base` API, `using Maybe.Extras` imports the API defined in `Maybe.Extras`. """ baremodule Extras -export asmissing, defaultto, definite, getnested, ifnothing, maybe +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 diff --git a/src/extras.jl b/src/extras.jl index 9108c08..efd0a0b 100644 --- a/src/extras.jl +++ b/src/extras.jl @@ -31,3 +31,6 @@ 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)