the-wireguard-effect
Version:
Cross platform wireguard api client for nodejs built on wireguard-go with effect-ts
44 lines (38 loc) • 1.54 kB
text/typescript
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 ReadonlyArray<unknown>> = T extends
| [infer _First, ...infer Rest]
| readonly [infer _First, ...infer Rest]
? Rest
: Array<unknown>;
/** @internal */
export type Split<Str extends string, Delimiter extends string> = string extends Str | ""
? Array<string>
: Str extends `${infer Head}${Delimiter}${infer Rest}`
? [Head, ...Split<Rest, Delimiter>]
: [Str];
/** @internal */
export const tail = <T extends ReadonlyArray<unknown>>(elements: T): Tail<T> => elements.slice(1) as Tail<T>;
/** @internal */
export const splitLiteral = <Str extends string, Delimiter extends string>(
str: Str,
delimiter: Delimiter
): Split<Str, Delimiter> => str.split(delimiter) as Split<Str, Delimiter>;
/** @internal */
export const transposeSet: {
<Key extends string, Value extends string>(
record: Record.ReadonlyRecord<Key, HashSet.HashSet<Value>>
): Record<Record.ReadonlyRecord.NonLiteralKey<Value>, HashSet.HashSet<Key>>;
} = 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)
);