diff --git a/Project.toml b/Project.toml index d3d86d1..4c73f79 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ authors = ["Takafumi Arakaki "] version = "0.1.0" [deps] +Setfield = "efcf1570-3423-57d1-acb7-fd33fddbac46" Transducers = "28d57a85-8fef-5791-bfe6-a80928e7c999" [compat] diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 9b7fd16..12d0d1b 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -161,7 +161,7 @@ uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[UnionArrays]] -deps = ["Transducers"] +deps = ["Setfield", "Transducers"] path = ".." uuid = "d6dd79e4-993b-11e9-1366-0de1c9fe1122" version = "0.1.0" diff --git a/src/impl/arrays.jl b/src/impl/arrays.jl index d719ee4..4ccbd0d 100644 --- a/src/impl/arrays.jl +++ b/src/impl/arrays.jl @@ -3,15 +3,23 @@ struct UnionArray{T, N, P} <: Abstract.UnionArray{T, N} function UnionArray(parent::P) where {T, N, P <: AbstractArray{T, N}} # Make sure that `A.parent` is not a UnionArray/Vector - P <: UnionArrayImpls && throw(MethodError(UnionArray, (A,))) + P <: UnionArrayImpls && throw(MethodError(UnionArray, (parent,))) return new{T, N, P}(parent) end end const UnionArrayImpls = Union{UnionVector, UnionArray} -default_reshape(A::UnionVector, dims::T) where T = - invoke(reshape, Tuple{AbstractArray, T}, A, dims) +# A very minimal dummy array implementation just for implementing `default_reshape`: +struct DummyArray{N} <: AbstractArray{Any,N} + dims::NTuple{N,Int} +end +Base.size(A::DummyArray) = A.dims + +function default_reshape(A::UnionVector, dims::T) where {T} + dummy = reshape(DummyArray(size(A)), dims) + return @set dummy.parent = A +end ua_reshape(A::UnionVector, dims) = UnionArray(default_reshape(A, dims)) ua_reshape(A::UnionArray, dims) = UnionArray(reshape(A.parent, dims)) diff --git a/src/impl/impl.jl b/src/impl/impl.jl index 26c3825..77b90a6 100644 --- a/src/impl/impl.jl +++ b/src/impl/impl.jl @@ -3,6 +3,7 @@ module Impl using Base: Dims using Transducers using Transducers: @return_if_reduced, next, complete +using Setfield: @set # using Setfield instead of Accessors for older Julia using ..Abstract diff --git a/test/environments/main/Manifest.toml b/test/environments/main/Manifest.toml index 9233f62..912282d 100644 --- a/test/environments/main/Manifest.toml +++ b/test/environments/main/Manifest.toml @@ -195,7 +195,7 @@ uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [[UnionArrays]] -deps = ["Transducers"] +deps = ["Setfield", "Transducers"] path = "../../.." uuid = "d6dd79e4-993b-11e9-1366-0de1c9fe1122" version = "0.1.0"