|
| 1 | +Base.Broadcast._containertype(::Type{<:DataValue}) = DataValue |
| 2 | + |
| 3 | +Base.Broadcast.promote_containertype(::Type{Any}, ::Type{DataValue}) = DataValue |
| 4 | +Base.Broadcast.promote_containertype(::Type{DataValue}, ::Type{Any}) = DataValue |
| 5 | +Base.Broadcast.promote_containertype(::Type{Tuple}, ::Type{DataValue}) = Tuple |
| 6 | +Base.Broadcast.promote_containertype(::Type{DataValue}, ::Type{Tuple}) = Tuple |
| 7 | +Base.Broadcast.promote_containertype(::Type{DataValue}, ::Type{Nullable}) = DataValue |
| 8 | +Base.Broadcast.promote_containertype(::Type{Nullable}, ::Type{DataValue}) = DataValue |
| 9 | + |
| 10 | +Base.Broadcast.broadcast_indices(::Type{DataValue}, A) = () |
| 11 | + |
| 12 | +Base.Broadcast._unsafe_get_eltype(x::DataValue) = eltype(x) |
| 13 | + |
| 14 | +Base.Broadcast._broadcast_getindex_eltype(::Type{DataValue}, T::Type) = Type{T} |
| 15 | +Base.Broadcast._broadcast_getindex_eltype(::Type{DataValue}, A) = typeof(A) |
| 16 | + |
| 17 | +Base.@propagate_inbounds Base.Broadcast._broadcast_getindex(::Type{DataValue}, A, I) = A |
| 18 | + |
| 19 | +@inline function Base.Broadcast.broadcast_c(f, ::Type{DataValue}, a...) |
| 20 | + nonnull = all(Base.hasvalue, a) |
| 21 | + S = Base.Broadcast._nullable_eltype(f, a...) |
| 22 | + if isleaftype(S) && Base.null_safe_op(f, Base.Broadcast.maptoTuple(Base.Broadcast._unsafe_get_eltype,a...).types...) |
| 23 | + DataValue{S}(f(map(unsafe_get, a)...), nonnull) |
| 24 | + else |
| 25 | + if nonnull |
| 26 | + DataValue(f(map(unsafe_get, a)...)) |
| 27 | + else |
| 28 | + DataValue{Base.nullable_returntype(S)}() |
| 29 | + end |
| 30 | + end |
| 31 | +end |
0 commit comments