import { createErrorClass } from "../util/createErrorClass.mjs";
import { operate } from "../util/lift.mjs";
import { createOperatorSubscriber } from "./OperatorSubscriber.mjs";
import { asyncScheduler } from "../scheduler/async.mjs";
import { innerFrom } from "../observable/innerFrom.mjs";
import { executeSchedule } from "../util/executeSchedule.mjs";
import { isValidDate } from "../util/isDate.mjs";

//#region ../../node_modules/.pnpm/rxjs@7.8.2/node_modules/rxjs/dist/esm5/internal/operators/timeout.js
var TimeoutError = createErrorClass(function(_super) {
	return function TimeoutErrorImpl(info) {
		if (info === void 0) info = null;
		_super(this);
		this.message = "Timeout has occurred";
		this.name = "TimeoutError";
		this.info = info;
	};
});
function timeout(config, schedulerArg) {
	var _a = isValidDate(config) ? { first: config } : typeof config === "number" ? { each: config } : config, first = _a.first, each = _a.each, _b = _a.with, _with = _b === void 0 ? timeoutErrorFactory : _b, _c = _a.scheduler, scheduler = _c === void 0 ? schedulerArg !== null && schedulerArg !== void 0 ? schedulerArg : asyncScheduler : _c, _d = _a.meta, meta = _d === void 0 ? null : _d;
	if (first == null && each == null) throw new TypeError("No timeout provided.");
	return operate(function(source, subscriber) {
		var originalSourceSubscription;
		var timerSubscription;
		var lastValue = null;
		var seen = 0;
		var startTimer = function(delay) {
			timerSubscription = executeSchedule(subscriber, scheduler, function() {
				try {
					originalSourceSubscription.unsubscribe();
					innerFrom(_with({
						meta,
						lastValue,
						seen
					})).subscribe(subscriber);
				} catch (err) {
					subscriber.error(err);
				}
			}, delay);
		};
		originalSourceSubscription = source.subscribe(createOperatorSubscriber(subscriber, function(value) {
			timerSubscription === null || timerSubscription === void 0 || timerSubscription.unsubscribe();
			seen++;
			subscriber.next(lastValue = value);
			each > 0 && startTimer(each);
		}, void 0, void 0, function() {
			if (!(timerSubscription === null || timerSubscription === void 0 ? void 0 : timerSubscription.closed)) timerSubscription === null || timerSubscription === void 0 || timerSubscription.unsubscribe();
			lastValue = null;
		}));
		!seen && startTimer(first != null ? typeof first === "number" ? first : +first - scheduler.now() : each);
	});
}
function timeoutErrorFactory(info) {
	throw new TimeoutError(info);
}

//#endregion
export { timeout };
//# sourceMappingURL=timeout.mjs.map