Skip to content

Commit 6ffa806

Browse files
committed
Implement keys and pairs for Enumerate
1 parent 5f40f15 commit 6ffa806

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

NEWS.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,13 @@ Standard library changes
3939

4040
#### Package Manager
4141

42-
- "Package Extensions": support for loading a piece of code based on other
42+
* "Package Extensions": support for loading a piece of code based on other
4343
packages being loaded in the Julia session.
4444
This has similar applications as the Requires.jl package but also
4545
supports precompilation and setting compatibility.
46+
* Iterators returned by `enumerate` now implement the `keys` and `pairs`
47+
functions. ([#48318])
48+
4649
#### LinearAlgebra
4750

4851

base/iterators.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,13 @@ end
225225
(i, n[1]), (i-1, ri, n[2])
226226
end
227227

228+
keys(e::Enumerate) = OneTo(length(e.itr))
229+
230+
# This will work even when keys doesn't (due to length being undefined)
231+
pairs(e::Enumerate) = map(e) do (i, el)
232+
Pair(i, el)
233+
end
234+
228235
"""
229236
pairs(IndexLinear(), A)
230237
pairs(IndexCartesian(), A)

test/iterators.jl

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,25 @@ let b = IOBuffer("foo\n")
8080
@test collect(Base.EachLine(b, keep=true, ondone=()->0)) == ["foo\n"]
8181
end
8282

83-
# enumerate (issue #6284)
84-
let b = IOBuffer("1\n2\n3\n"), a = []
85-
for (i,x) in enumerate(eachline(b))
86-
push!(a, (i,x))
83+
@testset "Iterators.enumerate" begin
84+
# issue #6284
85+
let b = IOBuffer("1\n2\n3\n"), a = []
86+
for (i,x) in enumerate(eachline(b))
87+
push!(a, (i,x))
88+
end
89+
@test a == [(1,"1"),(2,"2"),(3,"3")]
90+
end
91+
92+
# keys and pairs
93+
let it = enumerate(zip(1:2, 3:4))
94+
@test collect(keys(it)) == [1, 2]
95+
@test collect(pairs(it)) == [1=>(1,3), 2=>(2,4)]
96+
end
97+
98+
# pairs when length (and hence keys) is undefined
99+
let b = IOBuffer("1\n2\n3\n"), it=enumerate(eachline(b))
100+
@test collect(pairs(it)) == [1=>"1", 2=>"2", 3=>"3"]
87101
end
88-
@test a == [(1,"1"),(2,"2"),(3,"3")]
89102
end
90103

91104
# zip eachline (issue #7369)

0 commit comments

Comments
 (0)