"use strict"
var __createBinding =
  (this && this.__createBinding) ||
  (Object.create
    ? function (o, m, k, k2) {
        if (k2 === undefined) k2 = k
        Object.defineProperty(o, k2, {
          enumerable: true,
          get: function () {
            return m[k]
          }
        })
      }
    : function (o, m, k, k2) {
        if (k2 === undefined) k2 = k
        o[k2] = m[k]
      })
var __setModuleDefault =
  (this && this.__setModuleDefault) ||
  (Object.create
    ? function (o, v) {
        Object.defineProperty(o, "default", { enumerable: true, value: v })
      }
    : function (o, v) {
        o["default"] = v
      })
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 __importStar =
  (this && this.__importStar) ||
  function (mod) {
    if (mod && mod.__esModule) return mod
    var result = {}
    if (mod != null)
      for (var k in mod)
        if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
          __createBinding(result, mod, k)
    __setModuleDefault(result, mod)
    return result
  }
var __metadata =
  (this && this.__metadata) ||
  function (k, v) {
    if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
      return Reflect.metadata(k, v)
  }
var _a
Object.defineProperty(exports, "__esModule", { value: true })
exports.isAssertionM = exports.AssertionM = void 0
const tracing_1 = __importStar(require("../../Tracing"))
const fileName_1 = "(@effect-ts/system): _src/Testing/AssertionM/AssertionM.ts"
const ST = __importStar(require("../../Structural"))
const Utils_1 = require("../../Utils")
const PR = __importStar(require("../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.
 */
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(
  [
    (0, Utils_1.LazyGetter)(),
    __metadata("design:type", String),
    __metadata("design:paramtypes", [])
  ],
  AssertionM.prototype,
  "stringify",
  null
)
__decorate(
  [
    (0, Utils_1.LazyGetter)(),
    __metadata("design:type", Number),
    __metadata("design:paramtypes", [])
  ],
  AssertionM.prototype,
  _a,
  null
)
exports.AssertionM = AssertionM
function isAssertionM(that) {
  return that instanceof AssertionM
}
exports.isAssertionM = isAssertionM
//# sourceMappingURL=AssertionM.js.map
