def compile_to_ir(pattern: Pattern) -> PatternIR:
"""Compile a DSL Pattern into PatternIR."""
# 1. Flatten games (GDS stage 1)
game_irs = flatten_blocks(pattern.game, _compile_game)
# 2. Extract flows (GDS stage 2 with OGS emitter)
flows: list[FlowIR] = extract_wirings(pattern.game, _ogs_wiring_emitter)
# 3. Map inputs and generate input flows
input_irs = []
for inp in pattern.inputs:
input_irs.append(
InputIR(
name=inp.name,
input_type=inp.input_type,
schema_hint=inp.schema_hint,
)
)
if inp.target_game:
flows.append(
FlowIR(
source=inp.name,
target=inp.target_game,
label=inp.flow_label or inp.name,
flow_type=FlowType.OBSERVATION,
direction=FlowDirection.COVARIANT,
)
)
# 4. Extract composition hierarchy (OGS-specific for CORECURSIVE)
counter = [0]
hierarchy = _extract_hierarchy(pattern.game, counter)
hierarchy = _flatten_sequential_chains(hierarchy)
return PatternIR(
name=pattern.name,
games=game_irs,
flows=flows,
inputs=input_irs,
composition_type=pattern.composition_type,
terminal_conditions=pattern.terminal_conditions,
action_spaces=pattern.action_spaces,
initialization=pattern.initializations,
hierarchy=hierarchy,
source_canvas=pattern.source,
)