diff --git a/.travis.yml b/.travis.yml index d971c1a..162d36c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ os: - osx julia: - 0.7 + - 1.0 - nightly notifications: email: false @@ -25,13 +26,10 @@ git: #before_script: # homebrew for mac # - if [ $TRAVIS_OS_NAME = osx ]; then brew install gcc; fi -# uncomment the following lines to override the default test script -script: - - julia -e 'Pkg.clone(pwd()); Pkg.build("Setfield"); VERSION < v"0.7-" && Pkg.add("StaticArrays"); Pkg.test("Setfield"; coverage=true)' after_success: # push coverage results to Coveralls - - julia -e 'cd(Pkg.dir("Setfield")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' + - julia -e 'using Pkg; cd(Pkg.dir("Setfield")); Pkg.add("Coverage"); using Coverage; Coveralls.submit(Coveralls.process_folder())' # push coverage results to Codecov - - julia -e 'cd(Pkg.dir("Setfield")); Pkg.add("Coverage"); using Coverage; Codecov.submit(Codecov.process_folder())' - - julia -e 'Pkg.add("Documenter")' - - julia -e 'cd(Pkg.dir("Setfield")); include(joinpath("docs", "make.jl"))' + - julia -e 'using Pkg; cd(Pkg.dir("Setfield")); Pkg.add("Coverage"); using Coverage; Codecov.submit(Codecov.process_folder())' + - julia -e 'using Pkg; Pkg.add("Documenter")' + - julia -e 'using Pkg; cd(Pkg.dir("Setfield")); include(joinpath("docs", "make.jl"))' diff --git a/src/lens.jl b/src/lens.jl index 574e066..8de93ab 100644 --- a/src/lens.jl +++ b/src/lens.jl @@ -3,7 +3,7 @@ export @lens export set, get, modify import Base: get -using Base: setindex, getproperty +using Base: getproperty """ Lens @@ -146,8 +146,25 @@ struct IndexLens{I <: Tuple} <: Lens end get(l::IndexLens, obj) = getindex(obj, l.indices...) -set(l::IndexLens, obj, val) = setindex(obj, val, l.indices...) +set(l::IndexLens, obj, val) = _setindex(obj, val, l.indices...) +@generated function _setindex(obj, val, indices...) + if hasmethod(Base.setindex, Tuple{obj, val, indices...}) + setter = Base.setindex + else + setter = setindex_on_copy + end + quote + $setter(obj, val, indices...) + end +end + +function setindex_on_copy(obj, val, indices...) + clone = similar(obj, promote_type(eltype(obj), typeof(val))) + copyto!(clone, obj) + setindex!(clone, val, indices...) + return clone +end const NNamedTupleLens{N,s} = NamedTuple{s, T} where {T <: NTuple{N, Lens}} struct MultiPropertyLens{L <: NNamedTupleLens} <: Lens diff --git a/test/runtests.jl b/test/runtests.jl index 7c076d8..5e65235 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -23,10 +23,8 @@ end include("test_kwonly.jl") end -@static if VERSION < v"0.7-" @testset "QuickTypes.jl" begin include("test_quicktypes.jl") end -end end # module