Skip to content

Commit 7a3ee28

Browse files
Deprecate reverse_iter to Iterators.reverse
Update src/deque.jl Implement `last` for `Stack` and `reverse(::Stack)` Bump patch version Test `length` for `reverse`
1 parent 377a9bb commit 7a3ee28

File tree

9 files changed

+53
-35
lines changed

9 files changed

+53
-35
lines changed

docs/src/stack_and_queue.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
# Stack and Queue
32

43
The `Stack` and `Queue` types are a light-weight wrapper of a deque
@@ -7,17 +6,17 @@ type, which respectively provide interfaces for LIFO and FIFO access.
76
Usage of Stack:
87

98
```julia
10-
s = Stack{Int}() # create a stack
11-
isempty(s) # check whether the stack is empty
12-
length(s) # get the number of elements
13-
eltype(s) # get the type of elements
14-
push!(s, 1) # push back a item
15-
first(s) # get an item from the top of stack
16-
pop!(s) # get and remove a first item
17-
empty!(s) # make a stack empty
18-
iterate(s::Stack) # Get a LIFO iterator of a stack
19-
reverse_iter(s::Stack{T}) # Get a FILO iterator of a stack
20-
s1 == s2 # check whether the two stacks are same
9+
s = Stack{Int}() # create a stack
10+
isempty(s) # check whether the stack is empty
11+
length(s) # get the number of elements
12+
eltype(s) # get the type of elements
13+
push!(s, 1) # push back a item
14+
first(s) # get an item from the top of stack
15+
pop!(s) # get and remove a first item
16+
empty!(s) # make a stack empty
17+
iterate(s::Stack) # Get a LIFO iterator of a stack
18+
Iterators.reverse(s::Stack{T}) # Get a FILO iterator of a stack
19+
s1 == s2 # check whether the two stacks are same
2120
```
2221

2322
Usage of Queue:

src/DataStructures.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
module DataStructures
22

3-
using Base: HasEltype, HasLength, IteratorEltype, IteratorSize, SizeUnknown,
3+
using Base: Iterators, HasEltype, HasLength, IteratorEltype, IteratorSize, SizeUnknown,
44
lt, Ordering, ForwardOrdering, Forward, ReverseOrdering, Reverse, Lt,
55
isbitsunion, isiterable, dict_with_eltype, KeySet, Callable, _tablesz,
66
findnextnot, unsafe_getindex, unsafe_setindex!, peek
@@ -15,7 +15,7 @@ module DataStructures
1515
export complement, complement!
1616

1717
export Deque, Stack, Queue, CircularDeque
18-
export enqueue!, dequeue!, dequeue_pair!, update!, reverse_iter
18+
export enqueue!, dequeue!, dequeue_pair!, update!
1919
export capacity, num_blocks, top_with_handle, sizehint!
2020

2121
export Accumulator, counter, reset!, inc!, dec!

src/deprecations.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
@deprecate path(t::Trie, str::AbstractString) partial_path(t::Trie, str::AbstractString)
33
@deprecate find_root find_root!
44
@deprecate top first
5+
@deprecate reverse_iter Iterators.reverse

src/deque.jl

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ struct DequeIterator{T}
115115
q::Deque
116116
end
117117

118+
Base.last(qi::DequeIterator) = last(qi.q)
119+
118120
function Base.iterate(qi::DequeIterator{T}, (cb, i) = (qi.q.head, qi.q.head.front)) where T
119121
i > cb.back && return nothing
120122
x = cb.data[i]
@@ -130,11 +132,7 @@ end
130132

131133
# Backwards deque iteration
132134

133-
struct ReverseDequeIterator{T}
134-
q::Deque
135-
end
136-
137-
function Base.iterate(qi::ReverseDequeIterator{T}, (cb, i) = (qi.q.rear, qi.q.rear.back)) where T
135+
function Base.iterate(qi::Iterators.Reverse{<:Deque}, (cb, i) = (qi.itr.rear, qi.itr.rear.back))
138136
i < cb.front && return nothing
139137
x = cb.data[i]
140138

@@ -148,12 +146,9 @@ function Base.iterate(qi::ReverseDequeIterator{T}, (cb, i) = (qi.q.rear, qi.q.re
148146
return (x, (cb, i))
149147
end
150148

151-
reverse_iter(q::Deque{T}) where {T} = ReverseDequeIterator{T}(q)
152-
153149
Base.iterate(q::Deque{T}, s...) where {T} = iterate(DequeIterator{T}(q), s...)
154150

155151
Base.length(qi::DequeIterator{T}) where {T} = qi.q.len
156-
Base.length(qi::ReverseDequeIterator{T}) where {T} = qi.q.len
157152

158153
Base.collect(q::Deque{T}) where {T} = T[x for x in q]
159154

src/queue.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,6 @@ Base.empty!(s::Queue) = (empty!(s.store); s)
4242

4343
Base.iterate(q::Queue, s...) = iterate(q.store, s...)
4444

45-
reverse_iter(q::Queue) = reverse_iter(q.store)
45+
Iterators.reverse(q::Queue) = Iterators.reverse(q.store)
4646

4747
Base.:(==)(x::Queue, y::Queue) = x.store == y.store

src/stack.jl

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Base.eltype(::Type{Stack{T}}) where T = T
4141
Get the top item from the stack. Sometimes called peek.
4242
"""
4343
Base.first(s::Stack) = last(s.store)
44+
Base.last(s::Stack) = first(s.store)
4445

4546
function Base.push!(s::Stack, x)
4647
push!(s.store, x)
@@ -51,13 +52,8 @@ Base.pop!(s::Stack) = pop!(s.store)
5152

5253
Base.empty!(s::Stack) = (empty!(s.store); s)
5354

54-
Base.iterate(st::Stack, s...) = iterate(reverse_iter(st.store), s...)
55+
Base.iterate(st::Stack, s...) = iterate(Iterators.reverse(st.store), s...)
5556

56-
"""
57-
reverse_iterate(s::Stack)
58-
59-
Get a FILO iterator of a stack
60-
"""
61-
reverse_iter(s::Stack{T}) where {T} = DequeIterator{T}(s.store)
57+
Iterators.reverse(s::Stack{T}) where {T} = DequeIterator{T}(s.store)
6258

6359
Base.:(==)(x::Stack, y::Stack) = x.store == y.store

test/test_deprecations.jl

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,25 @@ end
1919
@testset "top" begin
2020
hh = BinaryMinHeap{Float64}([1,2,3])
2121
@test top(hh) == 1
22-
end
22+
end
23+
24+
function test_reverse_iter(it::T) where T
25+
arr = [i for i in it]
26+
index = length(arr)
27+
for i in reverse_iter(it)
28+
@test arr[index] == i
29+
index -= 1
30+
end
31+
32+
@test reverse(arr) == [i for i in reverse_iter(it)]
33+
end
34+
@testset "reverse_iter" begin
35+
@testset "Queue" begin
36+
q = Queue{Int}(); enqueue!(q, 1); enqueue!(q, 2)
37+
test_reverse_iter(q)
38+
end
39+
@testset "Stack" begin
40+
s = Stack{Int}(); push!(s, 1); push!(s, 2)
41+
test_reverse_iter(s)
42+
end
43+
end

test/test_queue.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,17 @@
9393

9494
@testset "reverse iterator" begin
9595
index = length(arr)
96-
for i in reverse_iter(q)
96+
for i in Iterators.reverse(q)
9797
@test(arr[index] == i)
9898
index -= 1
9999
end
100100
end
101101

102102
@test arr == [i for i in q]
103-
@test reverse(arr) == [i for i in reverse_iter(q)]
103+
@test reverse(arr) == [i for i in Iterators.reverse(q)]
104+
@test first(Iterators.reverse(q)) === last(q)
105+
@test last(Iterators.reverse(q)) === first(q)
106+
@test length(Iterators.reverse(q)) === length(q)
104107
end
105108

106109
end # @testset Queue

test/test_stack.jl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,17 @@
8787

8888
@testset "reverse iterator" begin
8989
index = 1
90-
for i in reverse_iter(stk)
90+
for i in Iterators.reverse(stk)
9191
@test(arr[index] == i)
9292
index += 1
9393
end
9494
end
9595

96-
@test arr == [i for i in reverse_iter(stk)]
96+
@test arr == [i for i in Iterators.reverse(stk)]
9797
@test reverse(arr) == [i for i in stk]
98+
@test first(Iterators.reverse(stk)) === last(stk)
99+
@test last(Iterators.reverse(stk)) === first(stk)
100+
@test length(Iterators.reverse(stk)) === length(stk)
98101
end
99102

100103
end # @testset Stack

0 commit comments

Comments
 (0)