diff --git a/src/NoBang/base.jl b/src/NoBang/base.jl index 7b911de..928a2b4 100644 --- a/src/NoBang/base.jl +++ b/src/NoBang/base.jl @@ -149,7 +149,8 @@ resize(xs::AbstractVector, n::Integer) = similar(xs, (n,)) setproperty(value, name, x) = setproperties(value, NamedTuple{(name,)}((x,))) -materialize(::Any, x) = Broadcast.materialize(x) +materialize(dest, x) = + Broadcast.materialize(Broadcast.instantiate(Broadcast.broadcasted(first ∘ tuple, x, dest))) @inline _union(args...) = union(args...) diff --git a/src/core.jl b/src/core.jl index 2885db7..847c9de 100644 --- a/src/core.jl +++ b/src/core.jl @@ -85,6 +85,7 @@ implements(::typeof(setproperty!), ::Type{<:NamedTuple}) = false struct Undefined end implements(::Mutator, ::Undefined) = false +Base.broadcastable(x::Undefined) = Ref(x) """ possible(f!, args...) :: Bool diff --git a/test/preamble.jl b/test/preamble.jl index 893dfa7..ac41acf 100644 --- a/test/preamble.jl +++ b/test/preamble.jl @@ -3,7 +3,7 @@ using Test using Base: ImmutableDict using BangBang using BangBang: implements -using StaticArrays: SVector +using StaticArrays: SVector, SizedVector """ ==ₜ(x, y) diff --git a/test/test_macro.jl b/test/test_macro.jl index 1b80b97..645d999 100644 --- a/test/test_macro.jl +++ b/test/test_macro.jl @@ -33,7 +33,15 @@ end let x = [1, 2] y = SVector(0, 0) - @test (@! y .= x .* 2)::Vector{Int} == [2, 4] + @test (@! y .= x .* 2)::SizedVector{2, Int} == [2, 4] + end + + let y = [0, 0] + @test (@! y .= 1)::Vector{Int} == [1, 1] + end + + let y = SVector(0, 0) + @test (@! y .= 1) === SVector(1, 1) end end @@ -63,7 +71,15 @@ end let x = [1, 2] y = SVector(0, 0) - @test (@! @. y = x * 2)::Vector{Int} == [2, 4] + @test (@! @. y = x * 2)::SizedVector{2, Int} == [2, 4] + end + + let y = [0, 0] + @test (@! @. y = 1)::Vector{Int} == [1, 1] + end + + let y = SVector(0, 0) + @test (@! @. y = 1) === SVector(1, 1) end end