blob: 93a74d4abc1430df64cc0f55a8052ac6d9f21d55 [file] [log] [blame]
/**
* @license
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* SPDX-FileCopyrightText: The Apache Software Foundation
* SPDX-License-Identifier: Apache-2.0
*/
export type OneOrMore<T> = T | T[];
export type ZeroOrMore<T> = undefined | null | T | T[];
export type OneOrMoreIncluding<Other extends any, RequiredValue extends any> =
| RequiredValue
| [RequiredValue, ...Other[]]
| [...Other[], RequiredValue];
// | [Other, ...OneOrMoreIncluding<Other, RequiredValue>]; // FIXME TypeScript complains about the circular reference..
/**
* OnlyOne<T> extracts the T from a One/ZeroOrMore<T> type
*/
export type OnlyOne<T> = T extends (infer X)[] ? X : T;
export function asArray<T>(value: ZeroOrMore<T>): T[] {
if (Array.isArray(value)) return value;
if (value === undefined || value === null) return [];
return [value];
}
export function asSingleValue<T>(value: ZeroOrMore<T>): T | undefined {
if (value instanceof Array) return value[0];
if (value === undefined || value === null) return undefined;
return value;
}