local jecs = require("@jecs")
local pair = jecs.pair
local world = jecs.World.new()
local Name = world:component()

local function named(ctr, name)
	local e = ctr(world)
	world:set(e, Name, name)
	return e
end
local function name(e)
	return world:get(e, Name)
end

local Eats = world:component()
local Apples = named(world.entity, "Apples")
local Oranges = named(world.entity, "Oranges")

local bob = named(world.entity, "Bob")
world:set(bob, pair(Eats, Apples), 10)

local alice = named(world.entity, "Alice")
world:set(alice, pair(Eats, Oranges), 5)

-- Aliasing the wildcard to symbols improves readability and ease of writing
local __ = jecs.Wildcard

-- Create a query that matches edible components
for entity, amount in world:query(pair(Eats, __)) do
	-- Iterate the query
	local food = world:target(entity, Eats)
	print(`{name(entity)} eats {amount} {name(food)}`)
end

-- Output:
--  Alice eats 5 Oranges
--  Bob eats 10 Apples
