From a76bdf9b6dcd26c9e262a621b40efc1caf3c8f97 Mon Sep 17 00:00:00 2001 From: Christoph Finkensiep Date: Tue, 20 Mar 2018 22:45:56 +0100 Subject: [PATCH 1/4] implement iterator interface on plist --- src/PersistentList.jl | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 7558bb0..2a8d52d 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -49,6 +49,11 @@ Base.done(::AbstractList, ::EmptyList) = true Base.done(::AbstractList, ::PersistentList) = false Base.next(::AbstractList, l::PersistentList) = (head(l), tail(l)) +Base.iteratorsize(::Type{AbstractList}) = Base.HasLength() +Base.iteratoreltype(::Type{AbstractList}) = Base.HasEltype() +Base.eltype(::Type{PersistentList{T}}) where T = T +Base.eltype(::Type{EmptyList{T}}) where T = T + Base.isequal(a::AbstractArray, l::PersistentList) = isequal(l, a) Base.isequal(l::PersistentList, a::AbstractArray) = isequal(length(l), length(a)) && all((el) -> el[1] == el[2], zipd(l, a)) From 2f8f414fc6bc95ff01063a917ddb76590b00613e Mon Sep 17 00:00:00 2001 From: Christoph Finkensiep Date: Tue, 20 Mar 2018 22:49:25 +0100 Subject: [PATCH 2/4] fix types for iterator methods --- src/PersistentList.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 2a8d52d..7cb46b9 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -49,8 +49,8 @@ Base.done(::AbstractList, ::EmptyList) = true Base.done(::AbstractList, ::PersistentList) = false Base.next(::AbstractList, l::PersistentList) = (head(l), tail(l)) -Base.iteratorsize(::Type{AbstractList}) = Base.HasLength() -Base.iteratoreltype(::Type{AbstractList}) = Base.HasEltype() +Base.iteratorsize(::Type{L}) where {L<:AbstractList} = Base.HasLength() +Base.iteratoreltype(::Type{L}) where {L<:AbstracList} = Base.HasEltype() Base.eltype(::Type{PersistentList{T}}) where T = T Base.eltype(::Type{EmptyList{T}}) where T = T From 6c805a417c2124cab03b5e023eab4a132bef376f Mon Sep 17 00:00:00 2001 From: Christoph Finkensiep Date: Tue, 20 Mar 2018 23:00:01 +0100 Subject: [PATCH 3/4] add tests for plist iterator interface --- src/PersistentList.jl | 2 +- test/PersistentListTest.jl | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 7cb46b9..887df5e 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -50,7 +50,7 @@ Base.done(::AbstractList, ::PersistentList) = false Base.next(::AbstractList, l::PersistentList) = (head(l), tail(l)) Base.iteratorsize(::Type{L}) where {L<:AbstractList} = Base.HasLength() -Base.iteratoreltype(::Type{L}) where {L<:AbstracList} = Base.HasEltype() +Base.iteratoreltype(::Type{L}) where {L<:AbstractList} = Base.HasEltype() Base.eltype(::Type{PersistentList{T}}) where T = T Base.eltype(::Type{EmptyList{T}}) where T = T diff --git a/test/PersistentListTest.jl b/test/PersistentListTest.jl index dc99a83..c5bcbb5 100644 --- a/test/PersistentListTest.jl +++ b/test/PersistentListTest.jl @@ -63,4 +63,14 @@ using Base.Test @test !isempty(PersistentList([1])) end + @testset "iterator interface" begin + T1 = typeof(plist([1,2,3])) + T2 = typeof(plist(Int[])) + @test Base.iteratorsize(T1) == Base.HasLength() + @test Base.iteratorsize(T2) == Base.HasLength() + @test Base.iteratoreltype(T1) == Base.HasEltype() + @test Base.iteratoreltype(T2) == Base.HasEltype() + @test Base.eltype(T1) == Int + @test Base.eltype(T2) == Int + end end From 1012d7983ef65b2c4778d152c4f4e49be950859e Mon Sep 17 00:00:00 2001 From: Christoph Finkensiep Date: Tue, 20 Mar 2018 23:08:13 +0100 Subject: [PATCH 4/4] more tests for plist eltype (including collect) --- test/PersistentListTest.jl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/test/PersistentListTest.jl b/test/PersistentListTest.jl index c5bcbb5..572142c 100644 --- a/test/PersistentListTest.jl +++ b/test/PersistentListTest.jl @@ -64,13 +64,19 @@ using Base.Test end @testset "iterator interface" begin - T1 = typeof(plist([1,2,3])) - T2 = typeof(plist(Int[])) + l1 = plist([1,2,3]) + l2 = plist(Int[]) + T1 = typeof(l1) + T2 = typeof(l2) + @test Base.iteratorsize(T1) == Base.HasLength() @test Base.iteratorsize(T2) == Base.HasLength() @test Base.iteratoreltype(T1) == Base.HasEltype() @test Base.iteratoreltype(T2) == Base.HasEltype() @test Base.eltype(T1) == Int @test Base.eltype(T2) == Int + + @test Base.eltype(typeof(collect(l1))) == Int + @test Base.eltype(typeof(collect(l2))) == Int end end