/**
 * Copyright schukai GmbH and contributors 2022. All Rights Reserved.
 * Node module: @schukai/monster
 * This file is licensed under the AGPLv3 License.
 * License text available at https://www.gnu.org/licenses/agpl-3.0.en.html
 */

import {AbstractConstraint} from "./abstract.mjs";
import {instanceSymbol} from '../constants.mjs';
export {AbstractOperator}

/**
 * Constraints are used to define conditions that must be met by the value of a variable.
 *
 * The uniform API of the constraints allows chains to be formed.
 *
 * Operators allow you to link constraints together. for example, you can check whether a value is 
 * an object or an array. each operator has two operands that are linked together.
 *
 * @license AGPLv3
 * @since 1.3.0
 * @copyright schukai GmbH
 * @memberOf Monster.Constraints
 * @summary The abstract operator constraint
 */
class AbstractOperator extends AbstractConstraint {

    /**
     *
     * @param {AbstractConstraint} operantA
     * @param {AbstractConstraint} operantB
     * @throws {TypeError} "parameters must be from type AbstractConstraint"
     */
    constructor(operantA, operantB) {
        super();

        if (!(operantA instanceof AbstractConstraint) || !(operantB instanceof AbstractConstraint)) {
            throw new TypeError("parameters must be from type AbstractConstraint")
        }

        this.operantA = operantA;
        this.operantB = operantB;

    }

    /**
     * This method is called by the `instanceof` operator.
     * @returns {symbol}
     * @since 2.1.0
     */
    static get [instanceSymbol]() {
        return Symbol.for("@schukai/monster/constraints/abstract-operator");
    }



}