// <I, A>(item: Schema.Schema<I, A>) => Schema<I[], Option<readonly [A, ...A[]]>>
const OptionNonEmptyArray = <I, A>(item: Schema.Schema<I, A>) =>
Schema.transform(
Schema.array(item),
Schema.optionFromSelf(Schema.nonEmptyArray(item)),
(x, _parseOptions, _ast) =>
pipe(
x,
ReadonlyArray.map((x) => Schema.encodeSync(item)(x)),
ReadonlyArray.match({
onNonEmpty: Option.some,
onEmpty: () => Option.none<ReadonlyArray.NonEmptyReadonlyArray<I>>(),
}),
),
(x, _parseOptions, _ast) =>
pipe(
x,
Option.map(ReadonlyArray.map((x) => Schema.decodeSync(item)(x))),
Option.getOrElse(ReadonlyArray.empty),
),
);
// <I, A>(item: Schema.Schema<I, A>) => Schema<I[], Option<readonly [A, ...A[]]>>
const OptionNonEmptyArray = <I, A>(item: Schema.Schema<I, A>) =>
Schema.transform(
Schema.array(item),
Schema.optionFromSelf(Schema.nonEmptyArray(item)),
(x, _parseOptions, _ast) =>
pipe(
x,
ReadonlyArray.map((x) => Schema.encodeSync(item)(x)),
ReadonlyArray.match({
onNonEmpty: Option.some,
onEmpty: () => Option.none<ReadonlyArray.NonEmptyReadonlyArray<I>>(),
}),
),
(x, _parseOptions, _ast) =>
pipe(
x,
Option.map(ReadonlyArray.map((x) => Schema.decodeSync(item)(x))),
Option.getOrElse(ReadonlyArray.empty),
),
);