This all happens after resplitting. We almost certainly need better implementations of Slice#take/drop/takeRange
- Partition columns by focus/unfocus
- (Lazily?) inflate unfocused columns and build eager definedness bitsets
- Build eager definedness bitsets for all focused paths
- Remove shifted component of focused column paths
- Group focused column paths by type
ModUnion
((CType, Array[(Int, Column)]) => Column
) same-type columns ([1, 2, "foo", 3, "bar", true, 4, false]
). TheInt
here represents the offset into the mod ring, since we can't just use the array index due to the example I gave.- (Lazily?) inflate non-union focused columns
- Reassemble focused columns into map
- Apply definedness bitsets
- If
OnUndefined.Omit
, then union all definedness bitsets and use to mask unfocused columns - Otherwise, don't
- Place unfocused columns under
.0
and focused under.1
- Assign every path (ignoring type) a position around the mod ring
- For each definedness bitset, sparsen by mod offset (
Bitset#sparsen(Int, Int): Bitset
)