diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 491b478..a984e35 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -43,6 +43,11 @@ Base.isequal(l1::PersistentList, l2::PersistentList) = ==(l1::PersistentList, l2::PersistentList) = head(l1) == head(l2) && tail(l1) == tail(l2) +Base.eltype(::Type{<:AbstractList{T}}) where {T} = T +Base.IteratorEltype(::Type{<:AbstractList{T}}) where {T} = Base.HasEltype() +Base.IteratorSize(::Type{<:EmptyList}) = Base.HasLength() +Base.IteratorSize(::Type{<:PersistentList}) = Base.HasLength() + Base.iterate(l::AbstractList) = iterate(l, l) Base.iterate(::AbstractList, ::EmptyList) = nothing Base.iterate(::AbstractList, l::PersistentList) = (head(l), tail(l)) diff --git a/test/PersistentListTest.jl b/test/PersistentListTest.jl index a0d7360..3f84d40 100644 --- a/test/PersistentListTest.jl +++ b/test/PersistentListTest.jl @@ -2,6 +2,22 @@ using FunctionalCollections using Test @testset "Persistent Lists" begin + @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 @testset "length" begin @test length(PersistentList([1])) == 1