var __decorate = this && this.__decorate || function (decorators, target, key, desc) {
  var c = arguments.length,
      r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc,
      d;
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
  return c > 3 && r && Object.defineProperty(target, key, r), r;
};

var __metadata = this && this.__metadata || function (k, v) {
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};

var _a;

import * as tracing_1 from "../../Tracing";
const fileName_1 = "(@effect-ts/system): _src/Testing/AssertionM/AssertionM.ts";
import * as ST from "../../Structural";
import { LazyGetter } from "../../Utils";
import * as PR from "../Primitives";
/**
 * An `AssertionM[A]` is capable of producing assertion results on an `A`. As a
 * proposition, assertions compose using logical conjunction and disjunction,
 * and can be negated.
 */

export class AssertionM {
  constructor(render, runM) {
    this.render = render;
    this.runM = runM;
  }

  get stringify() {
    return this.render().toString();
  }

  toString() {
    return this.stringify;
  }

  [(PR._A, ST.equalsSym)](that) {
    if (isAssertionM(that)) {
      return this.stringify === that.stringify;
    }

    return false;
  }

  get [_a = ST.hashSym]() {
    return ST.hashString(this.stringify);
  }

}

__decorate([LazyGetter(), __metadata("design:type", String), __metadata("design:paramtypes", [])], AssertionM.prototype, "stringify", null);

__decorate([LazyGetter(), __metadata("design:type", Number), __metadata("design:paramtypes", [])], AssertionM.prototype, _a, null);

export function isAssertionM(that) {
  return that instanceof AssertionM;
}
//# sourceMappingURL=AssertionM.js.map