-
Notifications
You must be signed in to change notification settings - Fork 19
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add conditional and passmissing #89
Changes from 2 commits
1516580
3bf10c0
f947bcf
e775f2b
4cc1a5e
7f491bf
8c0bd5d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
module Missings | ||
|
||
export allowmissing, disallowmissing, ismissing, missing, missings, | ||
Missing, MissingException, levels, coalesce | ||
Missing, MissingException, levels, coalesce, passmissing | ||
|
||
using Base: ismissing, missing, Missing, MissingException | ||
|
||
|
@@ -165,4 +165,24 @@ function levels(x) | |
levs | ||
end | ||
|
||
struct PassMissing{F} <: Function end | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we probably want: struct PassMissing{F} <: Function
f::F
end |
||
|
||
(::PassMissing{F})(xs...;kw...) where {F} = | ||
any(ismissing, xs) || any(ismissing, values(values(kw))) ? missing : F(xs...; kw...) | ||
|
||
""" | ||
passmissing(f) | ||
|
||
Return a function that returns `missing` if any of its positional or keyword arguments | ||
are `missing` and otherwise applies `f` to those arguments. | ||
|
||
# Examples | ||
```jldoctest | ||
julia> passmissing(sqrt).([missing, 4]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be useful to start with a simpler example with a single scalar (first non-missing, and then missing). There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. added |
||
2-element Array{Union{Missing, Float64},1}: | ||
missing | ||
2.0 | ||
""" | ||
passmissing(f::Base.Callable) = PassMissing{f}() | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Shouldn't this be BTW, have you done some benchmarking to check there are no allocations? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. AFAIK if I wanted to use I will post benchmarks for the current implementation in the main thread so that they do not disappear. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think in most practical uses, the struct would never allocate. It's the same idea w/ the new iteration protocol: every call to |
||
|
||
end # module |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I personally prefer
Missings.propagate
if we're still bikeshedding the name here.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I like
propagate
too, the only gripe is that it's quite long. But well...There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
But do we want to export it or not? If yes then
propagate
is ok, butMissings.propagate
is a bit long.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unfortunately
propagate
is quite general to claim it for this feature...There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I know, but that is why I thought the idea was
propagatemissing
which tab-completes.