/*
 * SPDX-FileCopyrightText: syuilo and misskey-project
 * SPDX-License-Identifier: AGPL-3.0-only
 */

export interface IMaybe<T> {
	isJust(): this is IJust<T>;
}

export interface IJust<T> extends IMaybe<T> {
	get(): T;
}

export function just<T>(value: T): IJust<T> {
	return {
		isJust: () => true,
		get: () => value,
	};
}

export function nothing<T>(): IMaybe<T> {
	return {
		isJust: () => false,
	};
}