```@union class FormattablePythonType: pass @da...
# development
w
Copy code
@union
class FormattablePythonType:
	pass


@dataclass
class BlackTarget:
	target: HydratedTarget


@dataclass
class IsortTarget:
	target: HydratedTarget


def rules():
	return [
	  UnionRule(FormattablePythonType, BlackTarget),
	  UnionRule(FormattablePythonType, IsortTarget),
	]


def my_python_formatting_rule(...) -> FormatResult:
	"""This is an aggregator that allows multiple python formatters to coexist.

	TODO: It's not common to need to do this for sideeffects, but it will be common for linting.

	"linters for type" feels like a thing that can be accomplished with (possibly nested) unions?
	  # ... need to filter by relevant to this target type
	await MultiGet[LintResult](LintableType, linter.cls(target) for target in targets for linters in union_membership.members(LintableType))
	"""

	sources = my_python_target...sources
	for member in union_membership.members(FormattablePythonTypes):
	  result = await Get[FormatResult](FormattablePythonTypes, member.cls(sources))
	  sources = result.directory_digest
	  stdout_so_far = result.stdout

	return FormatResult(sources)