File size: 1,560 Bytes
96af7c9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.adapter = adapter;
const Arbitrary_1 = require("../../check/arbitrary/definition/Arbitrary");
const Value_1 = require("../../check/arbitrary/definition/Value");
const Stream_1 = require("../../stream/Stream");
const AdaptedValue = Symbol('adapted-value');
function toAdapterValue(rawValue, adapter) {
const adapted = adapter(rawValue.value_);
if (!adapted.adapted) {
return rawValue;
}
return new Value_1.Value(adapted.value, AdaptedValue);
}
class AdapterArbitrary extends Arbitrary_1.Arbitrary {
constructor(sourceArb, adapter) {
super();
this.sourceArb = sourceArb;
this.adapter = adapter;
this.adaptValue = (rawValue) => toAdapterValue(rawValue, adapter);
}
generate(mrng, biasFactor) {
const rawValue = this.sourceArb.generate(mrng, biasFactor);
return this.adaptValue(rawValue);
}
canShrinkWithoutContext(value) {
return this.sourceArb.canShrinkWithoutContext(value) && !this.adapter(value).adapted;
}
shrink(value, context) {
if (context === AdaptedValue) {
if (!this.sourceArb.canShrinkWithoutContext(value)) {
return Stream_1.Stream.nil();
}
return this.sourceArb.shrink(value, undefined).map(this.adaptValue);
}
return this.sourceArb.shrink(value, context).map(this.adaptValue);
}
}
function adapter(sourceArb, adapter) {
return new AdapterArbitrary(sourceArb, adapter);
}
|