type JoinNames<
Gates extends readonly Gate<GateContextBase>[],
Sep extends string
> = Gates extends readonly [
infer Only extends Gate<GateContextBase>
]
? Grouped<GateName<Only>>
: Gates extends readonly [
infer First extends Gate<GateContextBase>,
...infer Rest extends readonly Gate<GateContextBase>[]
]
? `${Grouped<GateName<First>>}${Sep}${JoinNames<Rest, Sep>}`
: string;Gates
Gates extends readonly Gate<GateContextBase>[]Sep
Sep extends string