diff --git a/example/amd/index.html b/example/amd/index.html index 33c3e8c..6b750a2 100644 --- a/example/amd/index.html +++ b/example/amd/index.html @@ -46,5 +46,11 @@ Example 8 - using withDelay to delay evaluation of subscription + +
+ Example 9 - using distinct to ignore any duplicate messages + +
+ \ No newline at end of file diff --git a/example/amd/js/examples.js b/example/amd/js/examples.js index d6884e9..28ada81 100644 --- a/example/amd/js/examples.js +++ b/example/amd/js/examples.js @@ -127,4 +127,19 @@ define( ['postal', 'postaldiags'], function ( postal, diags ) { postal.channel( "He.Will.Knock.Four.Times" ) .publish( { value : "Knock!" } ); wdSubscription.unsubscribe(); + + // Using distinct() to ignore duplicate messages + var revealChannel = postal.channel('detect.cylon'), + revealSubscription = revealChannel.subscribe(function (who) { + $('
  • ').text(who.name).appendTo($('#example9')); + }).distinct(); + postal.channel('detect.cylon').publish({name: 'Boomer'}); + postal.channel('detect.cylon').publish({name: 'Saul Tigh'}); + postal.channel('detect.cylon').publish({name: 'William Adama'}); + postal.channel('detect.cylon').publish({name: 'Helo'}); + //ignored! + postal.channel('detect.cylon').publish({name: 'Boomer'}); + postal.channel('detect.cylon').publish({name: 'Felix Gaeta'}); + //ignored! + postal.channel('detect.cylon').publish({name: 'William Adama'}); } ); \ No newline at end of file diff --git a/example/amd/js/libs/postal/postal.js b/example/amd/js/libs/postal/postal.js index 4db8b0f..e2399b7 100644 --- a/example/amd/js/libs/postal/postal.js +++ b/example/amd/js/libs/postal/postal.js @@ -17,6 +17,22 @@ var DEFAULT_CHANNEL = "/", }; var DistinctPredicate = function () { + var previous = []; + + return function (data) { + var isDistinct = !_.any(previous, function (p) { + if (_.isObject(data) || _.isArray(data)) { + return _.isEqual(data, p); + } + return data === p; + }); + if (isDistinct) { + previous.push(data); + } + return isDistinct; + }; +}; +var ConsecutiveDistinctPredicate = function () { var previous; return function ( data ) { var eq = false; @@ -31,7 +47,6 @@ var DistinctPredicate = function () { return !eq; }; }; - var ChannelDefinition = function ( channelName, defaultTopic ) { this.channel = channelName || DEFAULT_CHANNEL; this._topic = defaultTopic || ""; @@ -138,6 +153,11 @@ SubscriptionDefinition.prototype = { }, ignoreDuplicates : function () { + this.withConstraint( new ConsecutiveDistinctPredicate() ); + return this; + }, + + distinct : function () { this.withConstraint( new DistinctPredicate() ); return this; }, diff --git a/example/amd/js/libs/postal/postal.min.js b/example/amd/js/libs/postal/postal.min.js index 7fbb33f..b9b14d9 100644 --- a/example/amd/js/libs/postal/postal.min.js +++ b/example/amd/js/libs/postal/postal.min.js @@ -1 +1 @@ -define(["underscore"],function(a,b){var c="/",d=50,e=0,f="postal",g=function(){},h=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},i=function(a,b){this.channel=a||c,this._topic=b||""};i.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new j(this.channel,this._topic,arguments[0]);if(a===2)return new j(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,p.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new i(this.channel,a)}};var j=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=d,this.constraints=new Array(0),this.maxCalls=e,this.onHandled=g,this.context=null,p.configuration.bus.publish({channel:f,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),p.configuration.bus.subscribe(this)};j.prototype={unsubscribe:function(){p.configuration.bus.unsubscribe(this),p.configuration.bus.publish({channel:f,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new h),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,p.configuration.bus.changePriority(this),this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var k={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},l={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},changePriority:function(b){var c,d;if(this.subscriptions[b.channel]&&this.subscriptions[b.channel][b.topic]){this.subscriptions[b.channel][b.topic]=a.without(this.subscriptions[b.channel][b.topic],b),c=this.subscriptions[b.channel][b.topic].length-1;for(;c>=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c + +
    + Example 9 - using distinct to ignore any duplicate messages +
      +
      + \ No newline at end of file diff --git a/example/standard/js/main.js b/example/standard/js/main.js index 2e790d0..d1f2404 100644 --- a/example/standard/js/main.js +++ b/example/standard/js/main.js @@ -126,4 +126,19 @@ $( function () { postal.channel( "He.Will.Knock.Four.Times" ) .publish( { value : "Knock!" } ); wdSubscription.unsubscribe(); + + // Using distinct() to ignore duplicate messages + var revealChannel = postal.channel('detect.cylon'), + revealSubscription = revealChannel.subscribe(function (who) { + $('
    • ').text(who.name).appendTo($('#example9')); + }).distinct(); + postal.channel('detect.cylon').publish({name: 'Boomer'}); + postal.channel('detect.cylon').publish({name: 'Saul Tigh'}); + postal.channel('detect.cylon').publish({name: 'William Adama'}); + postal.channel('detect.cylon').publish({name: 'Helo'}); + //ignored! + postal.channel('detect.cylon').publish({name: 'Boomer'}); + postal.channel('detect.cylon').publish({name: 'Felix Gaeta'}); + //ignored! + postal.channel('detect.cylon').publish({name: 'William Adama'}); } ); \ No newline at end of file diff --git a/example/standard/js/postal.js b/example/standard/js/postal.js index d5c6e0b..d99094e 100644 --- a/example/standard/js/postal.js +++ b/example/standard/js/postal.js @@ -16,7 +16,7 @@ var DEFAULT_CHANNEL = "/", NO_OP = function () { }; -var DistinctPredicate = function () { +var ConsecutiveDistinctPredicate = function () { var previous; return function ( data ) { var eq = false; @@ -31,7 +31,22 @@ var DistinctPredicate = function () { return !eq; }; }; +var DistinctPredicate = function () { + var previous = []; + return function (data) { + var isDistinct = !_.any(previous, function (p) { + if (_.isObject(data) || _.isArray(data)) { + return _.isEqual(data, p); + } + return data === p; + }); + if (isDistinct) { + previous.push(data); + } + return isDistinct; + }; +}; var ChannelDefinition = function ( channelName, defaultTopic ) { this.channel = channelName || DEFAULT_CHANNEL; this._topic = defaultTopic || ""; @@ -138,6 +153,11 @@ SubscriptionDefinition.prototype = { }, ignoreDuplicates : function () { + this.withConstraint( new ConsecutiveDistinctPredicate() ); + return this; + }, + + distinct : function () { this.withConstraint( new DistinctPredicate() ); return this; }, diff --git a/example/standard/js/postal.min.js b/example/standard/js/postal.min.js index cd7abd3..475a3bc 100644 --- a/example/standard/js/postal.min.js +++ b/example/standard/js/postal.min.js @@ -1 +1 @@ -(function(a,b,c){var d="/",e=50,f=0,g="postal",h=function(){},i=function(){var b;return function(c){var d=!1;return a.isString(c)?(d=c===b,b=c):(d=a.isEqual(c,b),b=a.clone(c)),!d}},j=function(a,b){this.channel=a||d,this._topic=b||""};j.prototype={subscribe:function(){var a=arguments.length;if(a===1)return new k(this.channel,this._topic,arguments[0]);if(a===2)return new k(this.channel,arguments[0],arguments[1])},publish:function(a){var b=a||{},c={channel:this.channel,topic:this._topic,data:b};return b.topic&&b.data&&(c=b,c.channel=c.channel||this.channel),c.timeStamp=new Date,q.configuration.bus.publish(c),c},topic:function(a){return a===this._topic?this:new j(this.channel,a)}};var k=function(a,b,c){this.channel=a,this.topic=b,this.callback=c,this.priority=e,this.constraints=new Array(0),this.maxCalls=f,this.onHandled=h,this.context=null,q.configuration.bus.publish({channel:g,topic:"subscription.created",timeStamp:new Date,data:{event:"subscription.created",channel:a,topic:b}}),q.configuration.bus.subscribe(this)};k.prototype={unsubscribe:function(){q.configuration.bus.unsubscribe(this),q.configuration.bus.publish({channel:g,topic:"subscription.removed",timeStamp:new Date,data:{event:"subscription.removed",channel:this.channel,topic:this.topic}})},defer:function(){var a=this.callback;return this.callback=function(b){setTimeout(a,0,b)},this},disposeAfter:function(b){if(a.isNaN(b)||b<=0)throw"The value provided to disposeAfter (maxCalls) must be a number greater than zero.";var c=this.onHandled,d=a.after(b,a.bind(function(){this.unsubscribe(this)},this));return this.onHandled=function(){c.apply(this.context,arguments),d()},this},ignoreDuplicates:function(){return this.withConstraint(new i),this},withConstraint:function(b){if(!a.isFunction(b))throw"Predicate constraint must be a function";return this.constraints.push(b),this},withConstraints:function(b){var c=this;return a.isArray(b)&&a.each(b,function(a){c.withConstraint(a)}),c},withContext:function(a){return this.context=a,this},withDebounce:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.debounce(c,b),this},withDelay:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=function(a){setTimeout(function(){c(a)},b)},this},withPriority:function(b){if(a.isNaN(b))throw"Priority must be a number";return this.priority=b,q.configuration.bus.changePriority(this),this},withThrottle:function(b){if(a.isNaN(b))throw"Milliseconds must be a number";var c=this.callback;return this.callback=a.throttle(c,b),this},subscribe:function(a){return this.callback=a,this}};var l={cache:{},compare:function(a,b){if(this.cache[b]&&this.cache[b][a])return!0;var c=new RegExp("^"+a.replace(/\./g,"\\.").replace(/\*/g,".*").replace(/#/g,"[A-Z,a-z,0-9]*")+"$"),d=c.test(b);return d&&(this.cache[b]||(this.cache[b]={}),this.cache[b][a]=!0),d},reset:function(){this.cache={}}},m={addWireTap:function(a){var b=this;return b.wireTaps.push(a),function(){var c=b.wireTaps.indexOf(a);c!==-1&&b.wireTaps.splice(c,1)}},changePriority:function(b){var c,d;if(this.subscriptions[b.channel]&&this.subscriptions[b.channel][b.topic]){this.subscriptions[b.channel][b.topic]=a.without(this.subscriptions[b.channel][b.topic],b),c=this.subscriptions[b.channel][b.topic].length-1;for(;c>=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){r.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){p.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){q.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c=0;c--)if(this.subscriptions[b.channel][b.topic][c].priority<=b.priority){this.subscriptions[b.channel][b.topic].splice(c+1,0,b),d=!0;break}d||this.subscriptions[b.channel][b.topic].unshift(b)}},publish:function(b){a.each(this.wireTaps,function(a){a(b.data,b)}),a.each(this.subscriptions[b.channel],function(c){a.each(a.clone(c),function(c){r.configuration.resolver.compare(c.topic,b.topic)&&a.all(c.constraints,function(a){return a(b.data,b)})&&typeof c.callback=="function"&&(c.callback.apply(c.context,[b.data,b]),c.onHandled())})})},reset:function(){this.subscriptions&&(a.each(this.subscriptions,function(b){a.each(b,function(a){while(a.length)a.pop().unsubscribe()})}),this.subscriptions={})},subscribe:function(a){var b,c,d,e=this.subscriptions[a.channel],f;return e||(e=this.subscriptions[a.channel]={}),f=this.subscriptions[a.channel][a.topic],f||(f=this.subscriptions[a.channel][a.topic]=new Array(0)),f.push(a),a},subscriptions:{},wireTaps:new Array(0),unsubscribe:function(a){if(this.subscriptions[a.channel][a.topic]){var b=this.subscriptions[a.channel][a.topic].length,c=0;for(;c + + diff --git a/src/main/ConsecutiveDistinctPredicate.js b/src/main/ConsecutiveDistinctPredicate.js new file mode 100644 index 0000000..56a178d --- /dev/null +++ b/src/main/ConsecutiveDistinctPredicate.js @@ -0,0 +1,15 @@ +var ConsecutiveDistinctPredicate = function () { + var previous; + return function ( data ) { + var eq = false; + if ( _.isString( data ) ) { + eq = data === previous; + previous = data; + } + else { + eq = _.isEqual( data, previous ); + previous = _.clone( data ); + } + return !eq; + }; +}; \ No newline at end of file diff --git a/src/main/DistinctPredicate.js b/src/main/DistinctPredicate.js index eb0de95..27170df 100644 --- a/src/main/DistinctPredicate.js +++ b/src/main/DistinctPredicate.js @@ -1,15 +1,16 @@ var DistinctPredicate = function () { - var previous; - return function ( data ) { - var eq = false; - if ( _.isString( data ) ) { - eq = data === previous; - previous = data; - } - else { - eq = _.isEqual( data, previous ); - previous = _.clone( data ); - } - return !eq; - }; -}; + var previous = []; + + return function (data) { + var isDistinct = !_.any(previous, function (p) { + if (_.isObject(data) || _.isArray(data)) { + return _.isEqual(data, p); + } + return data === p; + }); + if (isDistinct) { + previous.push(data); + } + return isDistinct; + }; +}; \ No newline at end of file diff --git a/src/main/SubscriptionDefinition.js b/src/main/SubscriptionDefinition.js index 85fd30e..ad3b7e2 100644 --- a/src/main/SubscriptionDefinition.js +++ b/src/main/SubscriptionDefinition.js @@ -63,6 +63,11 @@ SubscriptionDefinition.prototype = { }, ignoreDuplicates : function () { + this.withConstraint( new ConsecutiveDistinctPredicate() ); + return this; + }, + + distinct : function () { this.withConstraint( new DistinctPredicate() ); return this; }, diff --git a/src/main/postal.amd.js b/src/main/postal.amd.js index 11c5923..d447718 100644 --- a/src/main/postal.amd.js +++ b/src/main/postal.amd.js @@ -5,6 +5,7 @@ define( ["underscore"], function ( _, undefined ) { //import("Constants.js"); //import("DistinctPredicate.js"); +//import("ConsecutiveDistinctPredicate.js"); //import("ChannelDefinition.js"); //import("SubscriptionDefinition.js"); //import("BindingsResolver.js"); diff --git a/src/main/postal.node.js b/src/main/postal.node.js index ce15931..b2b8fe9 100644 --- a/src/main/postal.node.js +++ b/src/main/postal.node.js @@ -5,6 +5,7 @@ var _ = require( 'underscore' ); //import("Constants.js"); //import("DistinctPredicate.js"); +//import("ConsecutiveDistinctPredicate.js"); //import("ChannelDefinition.js"); //import("SubscriptionDefinition.js"); //import("BindingsResolver.js"); diff --git a/src/main/postal.standard.js b/src/main/postal.standard.js index 640b4d9..629db66 100644 --- a/src/main/postal.standard.js +++ b/src/main/postal.standard.js @@ -4,6 +4,7 @@ (function ( _, global, undefined ) { //import("Constants.js"); +//import("ConsecutiveDistinctPredicate.js"); //import("DistinctPredicate.js"); //import("ChannelDefinition.js"); //import("SubscriptionDefinition.js");