             if superset {
                 let self_holes = ShapeRegion(solids: self.holes.flatMap { ShapeRegion.Solid(solid: $0) })
                 let a = self_holes.union(ShapeRegion(solid: other))
-                cache.subtracting[other.cacheId] = [ShapeRegion.Solid(components: [self.solid] + a.solids.map { $0.solid })] + a.solids.flatMap { $0.holes.map { ShapeRegion.Solid(solid: $0) } }
+                cache.subtracting[other.cacheId] = [ShapeRegion.Solid(solid: self.solid, holes: a.solids.map { $0.solid })] + a.solids.flatMap { $0.holes.map { ShapeRegion.Solid(solid: $0) } }
             } else if let subtracting = _subtracting {
                 let self_holes = ShapeRegion(solids: self.holes.flatMap { ShapeRegion.Solid(solid: $0) })
                 let other_holes = ShapeRegion(solids: other.holes.flatMap { ShapeRegion.Solid(solid: $0) })

            case .none: return (nil, false)
            }
        case let .regions(left, right): return (left.subtracting(right), false)
        case let .segments(loops): return (ShapeRegion(solids: loops.filter { self.area.sign == $0.solid.area.sign }.map { ShapeRegion.Solid(solid: $0.solid) }), false)
        }
    }
}

            case .none: return nil
            }
        case let .regions(left, right): return left.union(right)
        case let .segments(forward, backward): return ShapeRegion(solids: forward.enumerated().flatMap { arg in forward.enumerated().contains { $0.0 != arg.0 && $0.1.solid._contains(arg.1.solid) } ? nil : ShapeRegion.Solid(solid: arg.1.solid, holes: backward.flatMap { arg.1.solid._contains($0.solid) ? $0.solid : nil }) })
        }
    }
    fileprivate func _intersection(_ other: Shape.Component) -> ShapeRegion {
