import {setDecoder} from '../../coder/set/set-decoder.js'; import {setEncoder} from '../../coder/set/set-encoder.js'; import {IncompatibleLiteralError} from '../../error/incompatible-literal-error.js'; import type {Decoding} from '../../type/decoding.js'; import type {Encoding} from '../../type/encoding.js'; import {every} from '../../util/every.js'; import {isArray} from '../../util/guard/is-array.js'; import {isSet} from '../../util/guard/is-set.js'; import {map} from '../../util/map.js'; import {ValueTransformer} from '../value/value-transformer.js'; // TODO tests export class SetTransformer extends ValueTransformer< ReadonlySet, Set > { readonly #transformer: ValueTransformer; public constructor(transformer: ValueTransformer) { super(); this.#transformer = transformer; } public compatibleWith(data: unknown): data is ReadonlySet { return ( isSet(data) && every(data, (item) => this.#transformer.compatibleWith(item)) ); } public decoder(): Decoding> { return setDecoder(() => this.#transformer.decoder()); } public encoder(data: ReadonlySet): Encoding { console.assert(isSet(data)); return setEncoder(data, (item) => this.#transformer.encoder(item)); } public fromLiteral(literal: unknown): Set { if (!isArray(literal)) { throw new IncompatibleLiteralError(); } return new Set( map(literal, (item) => this.#transformer.fromLiteral(item)), ); } public toLiteral(data: ReadonlySet, compact: boolean): unknown { console.assert(isSet(data)); return Array.from(data, (item) => this.#transformer.toLiteral(item, compact), ); } }