Skip to content
This repository has been archived by the owner on Oct 8, 2021. It is now read-only.

Iterator interface #909

Merged
merged 8 commits into from Jun 14, 2018
1 change: 1 addition & 0 deletions .gitignore
Expand Up @@ -6,3 +6,4 @@ docs/build/
docs/site/
benchmark/.results/*
benchmark/.tune.jld
*.cov
2 changes: 1 addition & 1 deletion src/LightGraphs.jl
Expand Up @@ -18,7 +18,7 @@ import SparseArrays: blockdiag, sparse
import Base: write, ==, <, *, ≈, convert, isless, issubset, union, intersect,
reverse, reverse!, isassigned, getindex, setindex!, show,
print, copy, in, sum, size, eltype, length, ndims, transpose,
ctranspose, join, start, next, done, eltype, get, Pair, Tuple, zero
ctranspose, join, iterate, eltype, get, Pair, Tuple, zero


export
Expand Down
2 changes: 1 addition & 1 deletion src/SimpleGraphs/SimpleGraphs.jl
Expand Up @@ -4,7 +4,7 @@ using SparseArrays
using LinearAlgebra

import Base:
eltype, show, ==, Pair, Tuple, copy, length, start, next, done, issubset, zero, in
eltype, show, ==, Pair, Tuple, copy, length, issubset, zero, in, iterate

import LightGraphs:
_NI, _insert_and_dedup!, AbstractGraph, AbstractEdge, AbstractEdgeIter,
Expand Down
13 changes: 10 additions & 3 deletions src/SimpleGraphs/simpleedgeiter.jl
Expand Up @@ -46,10 +46,17 @@ function edge_next(g::AbstractSimpleGraph,
return e, SimpleEdgeIterState(zero(T), 1)
end

start(eit::SimpleEdgeIter) = edge_start(eit.g)
done(eit::SimpleEdgeIter, state::SimpleEdgeIterState{T}) where T = state.s == zero(T)
function iterate(eit::SimpleEdgeIter{G}) where {G<:AbstractSimpleGraph}
state = edge_start(eit.g)
return iterate(eit, state)
end

function iterate(eit::SimpleEdgeIter{G}, state::SimpleEdgeIterState{T}) where {T,G<:AbstractSimpleGraph{T}}
state.s == zero(T) && return nothing
return edge_next(eit.g, state)
end

length(eit::SimpleEdgeIter) = ne(eit.g)
next(eit::SimpleEdgeIter, state::SimpleEdgeIterState) = edge_next(eit.g, state)

function _isequal(e1::SimpleEdgeIter, e2)
k = 0
Expand Down
15 changes: 9 additions & 6 deletions test/simplegraphs/simpleedgeiter.jl
Expand Up @@ -2,7 +2,9 @@
ga = @inferred(SimpleGraph(10, 20; seed=1))
gb = @inferred(SimpleGraph(10, 20; seed=1))
@test sprint(show, edges(ga)) == "SimpleEdgeIter 20"
@test sprint(show, start(edges(ga))) == "SimpleEdgeIterState [1, 1]"
# note: we don't get the first iterator state,
#since iterate returns the state after taking the first value
@test sprint(show, iterate(edges(ga))[2]) == "SimpleEdgeIterState [1, 2]"

@test length(collect(edges(Graph(0, 0)))) == 0

Expand Down Expand Up @@ -46,10 +48,11 @@
end

eit = edges(ga)
es = @inferred(start(eit))
# @inferred not valid for new interface anymore (return type is a Union)
es = iterate(eit)[2]

@test es.s == 2
@test es.di == 1
@test es.s == 3
@test es.di == 2

@test [e for e in eit] == [Edge(2, 3), Edge(3, 10), Edge(5, 10)]

Expand All @@ -73,10 +76,10 @@
end

eit = @inferred(edges(ga))
es = @inferred(start(eit))
es = iterate(eit)[2]

@test es.s == 3
@test es.di == 1
@test es.di == 2

@test [e for e in eit] == [
SimpleEdge(3, 2), SimpleEdge(3, 10),
Expand Down