JuliaCollections / JuliaCollections/IterTools.jl
A proposal for `takeuntil`
Nobody has claimed this yet.
- Dominant language
- Julia
- Stars
- 160
- Forks
- 30
- PR merge metrics
- No merged PRs in 30d
Description
The current takewhile is very convient to use. But for cases in which I also want to take the last value which fails the condition, it cannot do what I want. Hence I'm proposing to add a function called takeuntil, which baiscally do something similar but also include the value which first makes the function false. This is the code snippet for what I propose.
struct TakeUntil{I}
cond::Function
xs::I
end
"""
takeuntil(cond, xs)
An iterator that yields values from the iterator `xs` as long as the
predicate `cond` is true. Unlike `takewhile`, it also take the last
value for which the predicate `cond` is false.
'''jldoctest
julia> collect(takeuntil(x-> x^2 < 10, 1:100))
3-element Array{Int64,1}:
1
2
3
4
'''
"""
takeuntil(cond, xs) = TakeUntil(cond, xs)
function Base.iterate(it::TakeUntil, state=(false, nothing))
is_cond, state_xs = state
is_cond && return nothing
(val, state_xs) =
@ifsomething (state_xs === nothing ? iterate(it.xs) : iterate(it.xs, state_xs))
val, (it.cond(val), state_xs)
end
Base.IteratorSize(it::TakeUntil) = Base.SizeUnknown()
Base.eltype(::Type{TakeUntil{I}}) where {I} = eltype(I)
IteratorEltype(::Type{TakeUntil{I}}) where {I} = IteratorEltype(I)
If this looks good, I can fire a PR for this.
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by comparing the proposed TakeUntil iterator with the existing takewhile behavior and the Julia iterate entry point. Verify that collect(takeuntil(x -> x^2 < 10, 1:100)) includes the first value for which the predicate is false, and document the resulting behavior with the shown example.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- julia
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 35/100