import * as Array from "effect/Array"; import * as Function from "effect/Function"; import * as HashSet from "effect/HashSet"; import * as Record from "effect/Record"; import * as Tuple from "effect/Tuple"; /** @internal */ export type Tail> = T extends | [infer _First, ...infer Rest] | readonly [infer _First, ...infer Rest] ? Rest : Array; /** @internal */ export type Split = string extends Str | "" ? Array : Str extends `${infer Head}${Delimiter}${infer Rest}` ? [Head, ...Split] : [Str]; /** @internal */ export const tail = >(elements: T): Tail => elements.slice(1) as Tail; /** @internal */ export const splitLiteral = ( str: Str, delimiter: Delimiter ): Split => str.split(delimiter) as Split; /** @internal */ export const transposeSet: { ( record: Record.ReadonlyRecord> ): Record, HashSet.HashSet>; } = Function.flow( Record.map(HashSet.values), Record.map(Array.fromIterable), Record.collect((key, values) => Array.map(values, (value) => Tuple.make(value, key))), Array.flatten, Array.groupBy(Tuple.getFirst), Record.map(Array.map(Tuple.getSecond)), Record.map(HashSet.fromIterable) );