Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/Setfield.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module Setfield
using MacroTools
using MacroTools: isstructdef, splitstructdef, postwalk

include("setindex.jl")
include("lens.jl")
include("sugar.jl")
include("functionlenses.jl")
Expand Down
2 changes: 1 addition & 1 deletion src/lens.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export constructorof


import Base: get
using Base: setindex, getproperty
using Base: getproperty

"""
Lens
Expand Down
13 changes: 13 additions & 0 deletions src/setindex.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
Base.@propagate_inbounds function setindex(args...)
Base.setindex(args...)
end

for T in [:Array, :Dict]
@eval begin
Base.@propagate_inbounds function setindex(o::$T, args...)
new = copy(o)
setindex!(new, args...)
new
end
end
end
2 changes: 1 addition & 1 deletion test/perf.jl
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ function lens_set_i((obj, val, i))
end

function hand_set_i((obj, val, i))
@inbounds setindex(obj, val, i)
@inbounds Base.setindex(obj, val, i)
end

function benchmark_lens_vs_hand(b_lens::Benchmark, b_hand::Benchmark)
Expand Down
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
module TestSetfield

include("test_setindex.jl")
include("test_examples.jl")
include("test_setmacro.jl")
include("test_core.jl")
Expand Down
21 changes: 21 additions & 0 deletions test/test_setindex.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
module TestSetindex
using Setfield
using Test

@testset "setindex" begin
arr = [1,2,3]
@test_throws MethodError Base.setindex(arr, 10, 1)
@test Setfield.setindex(arr, 10, 1) == [10, 2, 3]
@test arr == [1,2,3]
@test @set(arr[1] = 10) == [10, 2, 3]
@test arr == [1,2,3]

d = Dict(:a => 1, :b => 2)
@test_throws MethodError Base.setindex(d, 10, :a)
@test Setfield.setindex(d, 10, :a) == Dict(:a=>10, :b=>2)
@test d == Dict(:a => 1, :b => 2)
@test @set(d[:a] = 10) == Dict(:a=>10, :b=>2)
@test d == Dict(:a => 1, :b => 2)
end

end