diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 7558bb0..887df5e 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{L}) where {L<:AbstractList} = Base.HasLength() +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 + 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)) diff --git a/test/PersistentListTest.jl b/test/PersistentListTest.jl index dc99a83..572142c 100644 --- a/test/PersistentListTest.jl +++ b/test/PersistentListTest.jl @@ -63,4 +63,20 @@ using Base.Test @test !isempty(PersistentList([1])) end + @testset "iterator interface" begin + 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