"use strict";

// FIXME: Switch to `match-value` package

function getValue(value, functionsAreLiterals) {
	if (typeof value === "function" && !functionsAreLiterals) {
		return value();
	} else {
		return value;
	}
}

function doMatchValue(value, arms, functionsAreLiterals) {
	if (value == null) {
		return value;
	} else if (arms[value] !== undefined) {
		// NOTE: We intentionally only check for `undefined` here (and below), since we want to allow the mapped-to value to be an explicit `null`.
		return getValue(arms[value], functionsAreLiterals);
	} else if (arms._ !== undefined) {
		return getValue(arms._, functionsAreLiterals);
	} else {
		throw new Error(`No match arm found for value '${value}'`);
	}
}

module.exports = function matchValue(value, arms) {
	return doMatchValue(value, arms, true);
};

module.exports.literal = function matchValueLiteral(value, arms) {
	return doMatchValue(value, arms, false);
};
