From 6e68d3e13f91ef002537c5c7ed3d003dcf12a54e Mon Sep 17 00:00:00 2001 From: saolof Date: Sun, 13 Jun 2021 21:28:06 -0400 Subject: [PATCH 1/3] Implement eltype for list ...Otherwise this is a very easy source of type instability --- src/PersistentList.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/PersistentList.jl b/src/PersistentList.jl index 491b478..cf84f3c 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -43,6 +43,8 @@ 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.iterate(l::AbstractList) = iterate(l, l) Base.iterate(::AbstractList, ::EmptyList) = nothing Base.iterate(::AbstractList, l::PersistentList) = (head(l), tail(l)) From 1bea603e722c114b0c09a5396ddc3b380ee9d115 Mon Sep 17 00:00:00 2001 From: saolof Date: Mon, 14 Jun 2021 05:13:39 -0400 Subject: [PATCH 2/3] Also added Base.IteratorEltype and Base.IteratorSize --- src/PersistentList.jl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/PersistentList.jl b/src/PersistentList.jl index cf84f3c..a984e35 100644 --- a/src/PersistentList.jl +++ b/src/PersistentList.jl @@ -43,8 +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)) From fb3bb25b7f1183f605941be8222bd64e024cdc51 Mon Sep 17 00:00:00 2001 From: saolof Date: Mon, 14 Jun 2021 05:42:32 -0400 Subject: [PATCH 3/3] Added in tests --- test/PersistentListTest.jl | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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