text: import { PreconditionFailure } from '../precondition/PreconditionFailure.js';
  import { runIdToFrequency } from './IRawProperty.js';
  import { readConfigureGlobal } from '../runner/configuration/GlobalParameters.js';
  export class Property {
      constructor(arb, predicate) {
          this.arb = arb;
          this.predicate = predicate;
          this.isAsync = () => false;
          const { beforeEach = Property.dummyHook, afterEach = Property.dummyHook, asyncBeforeEach, asyncAfterEach } = readConfigureGlobal() || {};
          if (asyncBeforeEach !== undefined) {
              throw Error('"asyncBeforeEach" can\'t be set when running synchronous properties');
          }
          if (asyncAfterEach !== undefined) {
              throw Error('"asyncAfterEach" can\'t be set when running synchronous properties');
          }
          this.beforeEachHook = beforeEach;
          this.afterEachHook = afterEach;
      }
      generate(mrng, runId) {
          return runId != null ? this.arb.withBias(runIdToFrequency(runId)).generate(mrng) : this.arb.generate(mrng);
      }
      run(v) {
          this.beforeEachHook();
          try {
              const output = this.predicate(v);
              return output == null || output === true ? null : 'Property failed by returning false';
          }
          catch (err) {
              if (PreconditionFailure.isFailure(err))
                  return err;
              if (err instanceof Error && err.stack)
                  return `${err}\n\nStack trace: ${err.stack}`;
              return `${err}`;
          }
          finally {
              this.afterEachHook();
          }
      }
      beforeEach(hookFunction) {
          const previousBeforeEachHook = this.beforeEachHook;
          this.beforeEachHook = () => hookFunction(previousBeforeEachHook);
          return this;
      }
      afterEach(hookFunction) {
          const previousAfterEachHook = this.afterEachHook;
          this.afterEachHook = () => hookFunction(previousAfterEachHook);
          return this;
      }
  }
  Property.dummyHook = () => { };
  