StructArrays.jl
StructArrays.jl copied to clipboard
Relax `LazyRow` for other packages
There's no reason why LazyRow
can only work with StructArray, for example we had this for a while now:
https://github.com/JuliaHEP/UnROOT.jl/blob/5f9ae4f21f04bf61f56f0ccabe7942754e07f7d9/src/iteration.jl#L196-L199
but essentially for any table-like structure, we simply have:
@inline function Base.getproperty(evt::LazyEvent, s::Symbol)
@inbounds getproperty(Core.getfield(evt, :tree), s)[Core.getfield(evt, :idx)]
end
and basically this is just saying LazyRow
wraps a object that support parent.col[idx]
Bump, any appetite for this?
Would be useful indeed! Also a bit more general, like
struct LazyIndexed{P,I}
parent::P
index::I
end
parent(li::LazyIndexed) = getfield(li, :parent)
index(li::LazyIndexed) = getfield(li, :index)
getproperty(li::LazyIndexed, p) = getproperty(parent(li), p)[index(li)]
# StructArrays-specific:
getindex(li::LazyIndexed{<:StructArray}, ix::Union{Integer,Symbol}) = getindex(components(parent(li)), ix)[index(li)]
getindex(li::LazyIndexed{<:StructArray{<:NamedTuple}}, ixs::Tuple{Vararg{Symbol}}) = getindex.(getindex(components(parent(li)), ixs), Ref(index(li)))
This can be a separate small package used in StructArrays, ROOT, etc. Does that sound reasonable?
On naming, Julia often uses "view" to mean lazy in this context, so I wonder if we can make it more consistent here. view(parent, index)
won't work unfortunately, because it already means 0-dim array view and not a scalar.
(disclaimer: not a StructArrays member)
This can be a separate small package used in StructArrays, ROOT, etc.
yeah that makes a lot of sense to me.