import type { Equal, Expect } from '@type-challenges/utils' import type { IgnoreMutability } from './ignore-mutability' import type { Stringifiable } from './stringifiable' /** * Joins an array of strings into a single string, separated by a delimiter. * * @example * ``` * Join<['apple', 'banana', 'plum'], ' & '> // 'apple & banana & plum' * ``` * @example * ``` * Join<['a', 'b', 'c']> // 'abc' * ``` */ export type Join< T extends Stringifiable[] | readonly Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = '' > = IgnoreMutability extends T ? JoinReadonly : JoinMutable<[...T], D, Acc> type JoinMutable< T extends Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = '' > = T extends [ infer Head extends Stringifiable, ...infer Tail extends Stringifiable[] ] ? Join : Acc type JoinReadonly< T extends readonly Stringifiable[], D extends Stringifiable = '', Acc extends Stringifiable = '' > = T extends readonly [ infer Head extends Stringifiable, ...infer Tail extends readonly Stringifiable[] ] ? Join : Acc /** * @internal */ type _join_cases = [ // ^? Expect, 'abc'>>, Expect, 'a & b & c'>>, Expect, 'abc'>>, Expect, 'a & b & c'>>, Expect, '_a & b & c'>> ]