@@ -10,7 +10,7 @@ Optional:
1010* `meta(v)`: the metadata of the variable
1111* `name(v)`: the name of the variable
1212"""
13- abstract type AbstractDataVariable{T,N} <: AbstractArray{T,N} end
13+ abstract type AbstractDataVariable{T, N} <: AbstractArray{T, N} end
1414
1515# https://docs.julialang.org/en/v1/manual/interfaces/#man-interface-array
1616Base. parent(var:: AbstractDataVariable ) = var. data
2121
2222for f in (:getindex,)
2323 @eval @propagate_inbounds Base.$ f(var:: AbstractDataVariable , I:: Vararg{Int} ) = $ f(parent(var), I... )
24- @eval Base.$ f(var:: AbstractDataVariable , s:: Union{String,Symbol} ) = $ f(meta(var), s)
24+ @eval Base.$ f(var:: AbstractDataVariable , s:: Union{String, Symbol} ) = $ f(meta(var), s)
2525end
2626
2727@propagate_inbounds Base. setindex!(var:: AbstractDataVariable , v, I:: Vararg{Int} ) = setindex!(parent(var), v, I... )
28- Base. setindex!(var:: AbstractDataVariable , v, s:: Union{String,Symbol} ) = setindex!(meta(var), v, s)
28+ Base. setindex!(var:: AbstractDataVariable , v, s:: Union{String, Symbol} ) = setindex!(meta(var), v, s)
2929
30- Base. get(var:: AbstractDataVariable , s:: Union{String,Symbol} , d= nothing ) = get(meta(var), s, d)
31- Base. get(f:: Function , var:: AbstractDataVariable , s:: Union{String,Symbol} ) = get(f, meta(var), s)
30+ Base. get(var:: AbstractDataVariable , s:: Union{String, Symbol} , d = nothing ) = get(meta(var), s, d)
31+ Base. get(f:: Function , var:: AbstractDataVariable , s:: Union{String, Symbol} ) = get(f, meta(var), s)
3232
3333tmin(v) = minimum(times(v))
3434tmax(v) = maximum(times(v))
3535
3636_timerange_str(times) = " Time Range: $(minimum(times)) to $(maximum(times)) "
3737
38- function Base. show(io:: IO , var:: T ) where {T<: AbstractDataVariable }
38+ function Base. show(io:: IO , var:: T ) where {T <: AbstractDataVariable }
3939 ismissing(var) && return
4040 print_name(io, var)
4141 print(io, " [" )
@@ -45,10 +45,14 @@ function Base.show(io::IO, var::T) where {T<:AbstractDataVariable}
4545 isnothing(u) || print(io, " Units: " , u, " ," )
4646 print(io, " Size: " , size(var))
4747 print(io, " ]" )
48+ return
4849end
4950
51+ _is_valid(:: Nothing ) = false
52+ _is_valid(x) = applicable(isempty, x) ? ! isempty(x) : true
53+
5054# Add Base.show methods for pretty printing
51- function Base. show(io:: IO , m:: MIME"text/plain" , var:: T ) where {T<: AbstractDataVariable }
55+ function Base. show(io:: IO , m:: MIME"text/plain" , var:: T ) where {T <: AbstractDataVariable }
5256 ismissing(var) && return
5357 print(io, " $T : " )
5458 print_name(io, var)
@@ -59,8 +63,34 @@ function Base.show(io::IO, m::MIME"text/plain", var::T) where {T<:AbstractDataVa
5963 isnothing(u) || println(io, " Units: " , u)
6064 println(io, " Size: " , size(var))
6165 println(io, " Memory Usage: " , Base. format_bytes(Base. summarysize(var)))
62- if (m = meta(var)) != = nothing
66+ if (m = meta(var)) |> _is_valid
6367 print(io, " Metadata:" )
6468 _println_value(io, m)
6569 end
70+ return
71+ end
72+
73+ # DataVariable (a example of AbstractDataVariable)
74+ struct DataVariable{T, N, A <: AbstractArray{T, N} , D} <: AbstractDataVariable{T, N}
75+ data:: A
76+ metadata:: D
77+ end
78+
79+ Base. similar(A:: DataVariable , :: Type{T} , dims:: Dims ) where {T} = DataVariable(similar(A. data, T, dims), A. metadata)
80+
81+ # Broadcast
82+ # Reference: https://docs.julialang.org/en/v1/manual/interfaces/#man-interfaces-broadcasting
83+ # Reference: https://github.com/rafaqz/DimensionalData.jl/blob/main/src/array/broadcast.jl
84+ using Base. Broadcast: ArrayStyle, Broadcasted
85+ Base. BroadcastStyle(:: Type{<:AbstractDataVariable} ) = ArrayStyle{AbstractDataVariable}()
86+
87+ Base. similar(bc:: Broadcasted{ArrayStyle{AbstractDataVariable}} , :: Type{T} ) where {T} = similar(find_datavariable(bc), T)
88+
89+ find_datavariable(x:: Broadcasted ) = find_datavariable(x. args)
90+ function find_datavariable(x:: Tuple )
91+ found = find_datavariable(x[1 ])
92+ return isnothing(found) ? find_datavariable(Base. tail(x)) : found
6693end
94+ find_datavariable(:: Tuple{} ) = nothing
95+ find_datavariable(x:: AbstractDataVariable ) = x
96+ find_datavariable(:: Any ) = nothing
0 commit comments