diff --git a/scone/head/menu_reader.py b/scone/head/menu_reader.py index c9489c2..2afcb33 100644 --- a/scone/head/menu_reader.py +++ b/scone/head/menu_reader.py @@ -372,6 +372,15 @@ class MenuLoader: return result + def get_all_menublock_recipes(self, block: MenuBlock) -> Iterable[MenuRecipe]: + for child in block.contents: + if isinstance(child, MenuRecipe): + yield child + elif isinstance(child, MenuBlock): + yield from self.get_all_menublock_recipes(child) + else: + raise RuntimeError(f"Unknown child {child!r}") + def dagify_recipe( self, recipe: MenuRecipe, @@ -490,10 +499,15 @@ class MenuLoader: target = self.resolve_ref(recipe, recipe_edge.recipe_id) if isinstance(target, MenuBlock): - # TODO(feature) - raise NotImplementedError( - "@after/@before on block is not yet here sadly" - ) + # Get all recipes and apply the edge to them. + for target_recipe in self.get_all_menublock_recipes(target): + for target_instance in self.get_related_instances( + sous, for_indices, recipe, target_recipe + ): + if recipe_edge.kind == "after": + self._dag.add_ordering(target_instance, instance) + elif recipe_edge.kind == "before": + self._dag.add_ordering(instance, target_instance) elif isinstance(target, MenuRecipe): for target_instance in self.get_related_instances( sous, for_indices, recipe, target