"use strict"; const Promise = require("bluebird"); const { validateArguments } = require("@validatem/core"); const required = require("@validatem/required"); const isFunction = require("@validatem/is-function"); const propagateAbort = require("@promistream/propagate-abort"); const propagatePeek = require("@promistream/propagate-peek"); module.exports = function mapFilter(_predicate) { let [ predicate ] = validateArguments(arguments, { predicate: [ required, isFunction ] }); return { _promistreamVersion: 0, description: `map-filter stream`, abort: propagateAbort, peek: propagatePeek, read: function produceValue_mapFilterStream(source) { function attemptRead() { return Promise.try(() => { return source.read(); }).then((result) => { return Promise.try(() => { return predicate(result); }).then((mappedItem) => { if (mappedItem === module.exports.NoValue) { return attemptRead(); } else { return mappedItem; } }); }); } return attemptRead(); } }; }; module.exports.NoValue = Symbol("NoValue");