// Copyright 2025 International Digital Economy Academy
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
///|
/// Minimal query helpers for `ComponentStore`-based worlds.
///
/// This is intentionally much smaller than Bevy's full `QueryState/Fetch`
/// machinery, but it supports the iteration patterns needed for incremental
/// engine migration.
///|
pub fn[A, B] query2(
a : ComponentStore[A],
b : ComponentStore[B],
f : (Entity, A, B) -> Unit,
) -> Unit {
// Iterate the smaller store for fewer lookups.
let la = a.len()
let lb = b.len()
if la <= lb {
a.for_each(fn(e, av) { if b.get(e) is Some(bv) { f(e, av, bv) } })
} else {
b.for_each(fn(e, bv) { if a.get(e) is Some(av) { f(e, av, bv) } })
}
}
///|
pub fn[A, B] query2_changed_a(
a : ComponentStore[A],
b : ComponentStore[B],
system : SystemTicks,
f : (Entity, A, B) -> Unit,
) -> Unit {
a.for_each_changed(system, fn(e, av) {
if b.get(e) is Some(bv) {
f(e, av, bv)
}
})
}