|
1 | 1 | abstract type AbstractAlignedMapping{T <: Tuple, K, V} <: AbstractDict{K, V} end |
2 | 2 |
|
3 | | -struct AlignedMapping{T <: Tuple, K, R} <: AbstractAlignedMapping{ |
| 3 | +struct AlignedMapping{T <: Tuple, K, R, D} <: AbstractAlignedMapping{ |
4 | 4 | T, |
5 | 5 | K, |
6 | | - Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, AbstractDataFrame}, |
| 6 | + Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, D == true ? DataFrame : Union{}}, |
7 | 7 | } |
8 | 8 | ref::R # any type as long as it supports size() |
9 | | - d::Dict{K, Union{AbstractArray{<:Number}, AbstractArray{Union{Missing, T}} where T <: Number, DataFrame}} |
| 9 | + d::Dict{ |
| 10 | + K, |
| 11 | + Union{ |
| 12 | + AbstractArray{<:Number}, |
| 13 | + AbstractArray{Union{Missing, T}} where T <: Number, |
| 14 | + D == true ? DataFrame : Union{}, |
| 15 | + }, |
| 16 | + } |
10 | 17 |
|
11 | | - function AlignedMapping{T, K}(r, d::AbstractDict{K}) where {T <: Tuple, K} |
| 18 | + function AlignedMapping{T, K, D}(r, d::AbstractDict{K}) where {T <: Tuple, K, D} |
12 | 19 | for (k, v) ∈ d |
13 | 20 | checkdim(T, v, r, k) |
14 | 21 | end |
15 | | - return new{T, K, typeof(r)}(r, d) |
| 22 | + return new{T, K, typeof(r), D}(r, d) |
16 | 23 | end |
17 | 24 | end |
18 | 25 |
|
@@ -84,10 +91,23 @@ function Base.setindex!(d::AlignedMapping{T}, v::Union{AbstractArray, DataFrame} |
84 | 91 | end |
85 | 92 | Base.sizehint!(d::AlignedMapping, n) = sizehint!(d.d, n) |
86 | 93 |
|
| 94 | +AlignedMapping{T, K}(r, d::AbstractDict{K}, ::Val{true}) where {T <: Tuple, K} = AlignedMapping{T, K, true}(r, d) |
| 95 | +AlignedMapping{T, K}(r, d::AbstractDict{K}, ::Val{false}) where {T <: Tuple, K} = AlignedMapping{T, K, false}(r, d) |
| 96 | +AlignedMapping{T, K}(r, d::AbstractDict{K}) where {T <: Tuple, K} = AlignedMapping{T, K}(r, d, Val(true)) |
| 97 | + |
87 | 98 | AlignedMapping{T}(r, d::AbstractDict) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d) |
88 | | -AlignedMapping{T, K}(ref) where {T, K} = AlignedMapping{T}(ref, Dict{K, AbstractMatrix{<:Number}}()) |
89 | | -AlignedMapping{T, K}(ref, ::Nothing) where {T, K} = AlignedMapping{T, K}(ref) |
| 99 | +AlignedMapping{T}(r, d::AbstractDict, ::Val{true}) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d, Val(true)) |
| 100 | +AlignedMapping{T}(r, d::AbstractDict, ::Val{false}) where {T <: Tuple} = AlignedMapping{T, keytype(d)}(r, d, Val(false)) |
| 101 | + |
90 | 102 | AlignedMapping{T}(r, d::Group) where {T <: Tuple} = AligedMapping{T}(ref, read_dict_of_mixed(d)) |
| 103 | +AlignedMapping{T}(r, d::Group, ::Val{true}) where {T <: Tuple} = AligedMapping{T}(ref, read_dict_of_mixed(d), Val(true)) |
| 104 | +AlignedMapping{T}(r, d::Group, ::Val{false}) where {T <: Tuple} = |
| 105 | + AligedMapping{T}(ref, read_dict_of_mixed(d), Val(false)) |
| 106 | + |
| 107 | +AlignedMapping{T, K}(ref) where {T, K} = AlignedMapping{T, K}(ref, Dict{K, AbstractMatrix{<:Number}}()) |
| 108 | +AlignedMapping{T, K}(ref, ::Nothing) where {T, K} = AlignedMapping{T, K}(ref) |
| 109 | +AlignedMapping{T, K, D}(ref) where {T, K, D} = AlignedMapping{T, K, D}(ref, Dict{K, AbstractMatrix{<:Number}}()) |
| 110 | +AlignedMapping{T, K, D}(ref, ::Nothing) where {T, K, D} = AlignedMapping{T, K, D}(ref) |
91 | 111 |
|
92 | 112 | Base.delete!(d::BackedAlignedMapping, k) = !isnothing(d.d) && delete_object(d.d, k) |
93 | 113 | function Base.empty!(d::BackedAlignedMapping) |
@@ -248,5 +268,5 @@ function Base.view(parentview::AlignedMappingView{T}, indices...) where {T <: Tu |
248 | 268 | return AlignedMappingView(parent(parentview), Base.reindex(parentindices(parentview), indices)) |
249 | 269 | end |
250 | 270 |
|
251 | | -const StrAlignedMapping{T <: Tuple, R} = AlignedMapping{T, String, R} |
| 271 | +const StrAlignedMapping{T <: Tuple, R, D} = AlignedMapping{T, String, R, D} |
252 | 272 | const StrAlignedMappingView{T <: Tuple} = AlignedMappingView{T, String} |
0 commit comments