You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by ha...@apache.org on 2022/01/04 15:10:50 UTC

[royale-asjs] branch develop updated: Added debounceShort and debounceLong

This is an automated email from the ASF dual-hosted git repository.

harbs pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-asjs.git


The following commit(s) were added to refs/heads/develop by this push:
     new 5ca3337  Added debounceShort and debounceLong
5ca3337 is described below

commit 5ca333774e1463569ec0f291a2d17fe924b1181f
Author: Harbs <ha...@in-tools.com>
AuthorDate: Tue Jan 4 17:10:10 2022 +0200

    Added debounceShort and debounceLong
---
 .../projects/Core/src/main/royale/CoreClasses.as   |   3 +
 .../apache/royale/utils/functional/debounceLong.as |  49 +++++++++
 .../royale/utils/functional/debounceShort.as       |  51 +++++++++
 .../src/test/royale/flexUnitTests/CoreTester.as    |   1 +
 .../test/royale/flexUnitTests/FunctionalTests.as   | 120 +++++++++++++++++++++
 5 files changed, 224 insertions(+)

diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as
index df3709e..289429e 100644
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@ -379,6 +379,9 @@ internal class CoreClasses
 	
 	import org.apache.royale.utils.replaceBead; replaceBead;
 
+	import org.apache.royale.utils.functional.debounceLong; debounceLong;
+	import org.apache.royale.utils.functional.debounceShort; debounceShort;
+
 	import org.apache.royale.core.TextLineMetrics; TextLineMetrics;
 	import org.apache.royale.utils.ClassSelectorList; ClassSelectorList;
 	
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
new file mode 100644
index 0000000..46d2a7e
--- /dev/null
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
@@ -0,0 +1,49 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.utils.functional
+{
+	COMPILE::SWF{
+		import flash.utils.setTimeout;		
+		import flash.utils.clearTimeout;		
+	}
+	/**
+	 * Returns a debounced function to run after a delay.
+	 * If the function is invoked within the delay period,
+	 * the delay will be reset to start from the latest invocation of the function.
+	 * 
+   * @royalesuppressexport
+	 * @langversion 3.0
+	 * @productversion Royale 0.9.9
+	 * 
+	 */
+	public function debounceLong(method:Function, delay:Number,thisArg:Object=null):Function
+	{
+		var timeoutRef:*;
+		return function(...args):void
+		{
+			function callback():void
+			{
+				timeoutRef = null;
+				method.apply(thisArg,args);
+			}
+			clearTimeout(timeoutRef);
+			timeoutRef = setTimeout(callback, delay);
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
new file mode 100644
index 0000000..113b35b
--- /dev/null
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
@@ -0,0 +1,51 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package org.apache.royale.utils.functional
+{
+	COMPILE::SWF{
+		import flash.utils.setTimeout;		
+		import flash.utils.clearTimeout;		
+	}
+	/**
+	 * Returns a debounced function to run after a delay.
+	 * If the function is invoked within the delay period,
+	 * the delay will be from the first invocation of the function.
+	 * 
+   * @royalesuppressexport
+	 * @langversion 3.0
+	 * @productversion Royale 0.9.9
+	 * 
+	 */
+	public function debounceShort(method:Function, delay:Number,thisArg:Object=null):Function
+	{
+		var timeoutRef:*;
+		return function(...args):void
+		{
+			function callback():void
+			{
+				timeoutRef = null;
+				method.apply(thisArg,args);
+			}
+			if(timeoutRef == null)
+			{
+				timeoutRef = setTimeout(callback, delay);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
index a0fb801..7b15375 100644
--- a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
+++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
@@ -45,6 +45,7 @@ package flexUnitTests
         public var sanitizerTest:SanitizeTest;
         public var eventsTest:EventsTest;
         public var objectUtilTests:ObjectUtilsTest;
+        public var functionelTests:FunctionalTests;
 
     }
 }
diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
new file mode 100644
index 0000000..10db0f2
--- /dev/null
+++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
@@ -0,0 +1,120 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Licensed to the Apache Software Foundation (ASF) under one or more
+//  contributor license agreements.  See the NOTICE file distributed with
+//  this work for additional information regarding copyright ownership.
+//  The ASF licenses this file to You under the Apache License, Version 2.0
+//  (the "License"); you may not use this file except in compliance with
+//  the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+//  Unless required by applicable law or agreed to in writing, software
+//  distributed under the License is distributed on an "AS IS" BASIS,
+//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+//  See the License for the specific language governing permissions and
+//  limitations under the License.
+//
+////////////////////////////////////////////////////////////////////////////////
+package flexUnitTests
+{
+    COMPILE::SWF{
+        import flash.utils.setTimeout;
+    }
+
+    import org.apache.royale.test.asserts.*;
+	import org.apache.royale.test.async.*;
+    import org.apache.royale.utils.functional.*;
+    
+    public class FunctionalTests
+    {		
+        [Before]
+        public function setUp():void
+        {
+        }
+        
+        [After]
+        public function tearDown():void
+        {
+        }
+        
+        [BeforeClass]
+        public static function setUpBeforeClass():void
+        {
+        }
+        
+        [AfterClass]
+        public static function tearDownAfterClass():void
+        {
+        }
+
+        [Test(async,timeout="300")]
+        public function testDebounceLong():void
+        {
+            var value:Number = 0;
+            var foo = function(){
+                this.value = 0;
+                this.increment = function(val:Number){
+                    this.value+=val;
+                }
+            }
+            var fooObj = new foo();
+            var thisDebounced:Function = debounceLong(fooObj.increment,30,fooObj);
+            setTimeout(thisDebounced, 10,5);
+            setTimeout(thisDebounced, 10,4);
+            setTimeout(thisDebounced, 10,3);
+            setTimeout(thisDebounced, 10,2);
+            setTimeout(thisDebounced, 10,1);
+            function increment(val:Number){
+                value+=val;
+            }
+            var debounced:Function = debounceLong(increment,30);
+            setTimeout(debounced, 10,5);
+            setTimeout(debounced, 10,4);
+            setTimeout(debounced, 10,3);
+            setTimeout(debounced, 10,2);
+            setTimeout(debounced, 10,1);
+            Async.delayCall(this, function():void
+            {
+                assertTrue(fooObj.value == 1,"foo value should be incremented by 1");
+                assertTrue(value == 1,"Should be incremented by 1");
+            }, 100);
+        }
+
+        [Test(async,timeout="300")]
+        public function testDebounceShort():void
+        {
+            var foo = function(){
+                this.value = 0;
+                this.increment = function(val:Number){
+                    this.value+=val;
+                }
+            }
+            var fooObj = new foo();
+            var thisDebounced:Function = debounceShort(fooObj.increment,30,fooObj);
+            setTimeout(thisDebounced, 10,5);
+            setTimeout(thisDebounced, 10,4);
+            setTimeout(thisDebounced, 10,3);
+            setTimeout(thisDebounced, 10,2);
+            setTimeout(thisDebounced, 10,1);
+
+            var value:Number = 0;
+            function increment(val:Number){
+                value+=val;
+            }
+            var debounced:Function = debounceShort(increment,30);
+            setTimeout(debounced, 10,5);
+            setTimeout(debounced, 10,4);
+            setTimeout(debounced, 10,3);
+            setTimeout(debounced, 10,2);
+            setTimeout(debounced, 10,1);
+            Async.delayCall(this, function():void
+            {
+                assertTrue(fooObj.value > 1,"foo value should be greater than 1");
+                assertTrue(value > 1,"Should be greater than 1");
+            }, 100);
+        }
+
+
+    }
+}

Re: [royale-asjs] branch develop updated: Added debounceShort and debounceLong

Posted by Harbs <ha...@gmail.com>.
It turns out that because of the way that Royale binds methods, there’s no need to pass around “this” to these functions.

You can just do this:
var foo:Foo = new Foo();
var increment:Function = debounceShort(foo.increment,30);

And then happily call increment(n) and it’ll automatically just work on foo.

B-)

I also added a throttle function.

Having fun with this!
Harbs

> On Jan 4, 2022, at 5:46 PM, Piotr Zarzycki <pi...@gmail.com> wrote:
> 
> Hi Harbs,
> 
> Great addition!
> 
> wt., 4 sty 2022 o 16:17 Harbs <ha...@gmail.com> napisał(a):
> 
>> FYI:
>> 
>> “Debounce” is a term that AFAIK was made popular by underscore.
>> https://underscorejs.org/#debounce
>> 
>> There’s debounceLong which does the same thing as underscore’s default
>> debounce functionality. Royale's version also has the option to pass in a
>> “this” object. That’s necessary if you are debouncing a instance method
>> which needs access to “this”.
>> debounceShort is the same as debounceLong, but it debounces early like the
>> “immediate” option in underscore’s version.
>> 
>> I needed this functionality today, so I figured it’s time to start
>> populating functional utilities… ;-)
>> 
>> There’s “FunctionalTests” which show how to use it (sort of).
>> 
>> HTH,
>> Harbs
>> 
>>> On Jan 4, 2022, at 5:10 PM, harbs@apache.org wrote:
>>> 
>>> This is an automated email from the ASF dual-hosted git repository.
>>> 
>>> harbs pushed a commit to branch develop
>>> in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
>>> 
>>> 
>>> The following commit(s) were added to refs/heads/develop by this push:
>>>    new 5ca3337  Added debounceShort and debounceLong
>>> 5ca3337 is described below
>>> 
>>> commit 5ca333774e1463569ec0f291a2d17fe924b1181f
>>> Author: Harbs <ha...@in-tools.com>
>>> AuthorDate: Tue Jan 4 17:10:10 2022 +0200
>>> 
>>>   Added debounceShort and debounceLong
>>> ---
>>> .../projects/Core/src/main/royale/CoreClasses.as   |   3 +
>>> .../apache/royale/utils/functional/debounceLong.as |  49 +++++++++
>>> .../royale/utils/functional/debounceShort.as       |  51 +++++++++
>>> .../src/test/royale/flexUnitTests/CoreTester.as    |   1 +
>>> .../test/royale/flexUnitTests/FunctionalTests.as   | 120
>> +++++++++++++++++++++
>>> 5 files changed, 224 insertions(+)
>>> 
>>> diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as
>> b/frameworks/projects/Core/src/main/royale/CoreClasses.as
>>> index df3709e..289429e 100644
>>> --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
>>> +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
>>> @@ -379,6 +379,9 @@ internal class CoreClasses
>>> 
>>>      import org.apache.royale.utils.replaceBead; replaceBead;
>>> 
>>> +     import org.apache.royale.utils.functional.debounceLong;
>> debounceLong;
>>> +     import org.apache.royale.utils.functional.debounceShort;
>> debounceShort;
>>> +
>>>      import org.apache.royale.core.TextLineMetrics; TextLineMetrics;
>>>      import org.apache.royale.utils.ClassSelectorList;
>> ClassSelectorList;
>>> 
>>> diff --git
>> a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
>>> new file mode 100644
>>> index 0000000..46d2a7e
>>> --- /dev/null
>>> +++
>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
>>> @@ -0,0 +1,49 @@
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +//
>>> +//  Licensed to the Apache Software Foundation (ASF) under one or more
>>> +//  contributor license agreements.  See the NOTICE file distributed
>> with
>>> +//  this work for additional information regarding copyright ownership.
>>> +//  The ASF licenses this file to You under the Apache License, Version
>> 2.0
>>> +//  (the "License"); you may not use this file except in compliance with
>>> +//  the License.  You may obtain a copy of the License at
>>> +//
>>> +//      http://www.apache.org/licenses/LICENSE-2.0
>>> +//
>>> +//  Unless required by applicable law or agreed to in writing, software
>>> +//  distributed under the License is distributed on an "AS IS" BASIS,
>>> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>>> +//  See the License for the specific language governing permissions and
>>> +//  limitations under the License.
>>> +//
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +package org.apache.royale.utils.functional
>>> +{
>>> +     COMPILE::SWF{
>>> +             import flash.utils.setTimeout;
>>> +             import flash.utils.clearTimeout;
>>> +     }
>>> +     /**
>>> +      * Returns a debounced function to run after a delay.
>>> +      * If the function is invoked within the delay period,
>>> +      * the delay will be reset to start from the latest invocation of
>> the function.
>>> +      *
>>> +   * @royalesuppressexport
>>> +      * @langversion 3.0
>>> +      * @productversion Royale 0.9.9
>>> +      *
>>> +      */
>>> +     public function debounceLong(method:Function,
>> delay:Number,thisArg:Object=null):Function
>>> +     {
>>> +             var timeoutRef:*;
>>> +             return function(...args):void
>>> +             {
>>> +                     function callback():void
>>> +                     {
>>> +                             timeoutRef = null;
>>> +                             method.apply(thisArg,args);
>>> +                     }
>>> +                     clearTimeout(timeoutRef);
>>> +                     timeoutRef = setTimeout(callback, delay);
>>> +             }
>>> +     }
>>> +}
>>> \ No newline at end of file
>>> diff --git
>> a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
>>> new file mode 100644
>>> index 0000000..113b35b
>>> --- /dev/null
>>> +++
>> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
>>> @@ -0,0 +1,51 @@
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +//
>>> +//  Licensed to the Apache Software Foundation (ASF) under one or more
>>> +//  contributor license agreements.  See the NOTICE file distributed
>> with
>>> +//  this work for additional information regarding copyright ownership.
>>> +//  The ASF licenses this file to You under the Apache License, Version
>> 2.0
>>> +//  (the "License"); you may not use this file except in compliance with
>>> +//  the License.  You may obtain a copy of the License at
>>> +//
>>> +//      http://www.apache.org/licenses/LICENSE-2.0
>>> +//
>>> +//  Unless required by applicable law or agreed to in writing, software
>>> +//  distributed under the License is distributed on an "AS IS" BASIS,
>>> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>>> +//  See the License for the specific language governing permissions and
>>> +//  limitations under the License.
>>> +//
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +package org.apache.royale.utils.functional
>>> +{
>>> +     COMPILE::SWF{
>>> +             import flash.utils.setTimeout;
>>> +             import flash.utils.clearTimeout;
>>> +     }
>>> +     /**
>>> +      * Returns a debounced function to run after a delay.
>>> +      * If the function is invoked within the delay period,
>>> +      * the delay will be from the first invocation of the function.
>>> +      *
>>> +   * @royalesuppressexport
>>> +      * @langversion 3.0
>>> +      * @productversion Royale 0.9.9
>>> +      *
>>> +      */
>>> +     public function debounceShort(method:Function,
>> delay:Number,thisArg:Object=null):Function
>>> +     {
>>> +             var timeoutRef:*;
>>> +             return function(...args):void
>>> +             {
>>> +                     function callback():void
>>> +                     {
>>> +                             timeoutRef = null;
>>> +                             method.apply(thisArg,args);
>>> +                     }
>>> +                     if(timeoutRef == null)
>>> +                     {
>>> +                             timeoutRef = setTimeout(callback, delay);
>>> +                     }
>>> +             }
>>> +     }
>>> +}
>>> \ No newline at end of file
>>> diff --git
>> a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
>> b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
>>> index a0fb801..7b15375 100644
>>> ---
>> a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
>>> +++
>> b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
>>> @@ -45,6 +45,7 @@ package flexUnitTests
>>>        public var sanitizerTest:SanitizeTest;
>>>        public var eventsTest:EventsTest;
>>>        public var objectUtilTests:ObjectUtilsTest;
>>> +        public var functionelTests:FunctionalTests;
>>> 
>>>    }
>>> }
>>> diff --git
>> a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
>> b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
>>> new file mode 100644
>>> index 0000000..10db0f2
>>> --- /dev/null
>>> +++
>> b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
>>> @@ -0,0 +1,120 @@
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +//
>>> +//  Licensed to the Apache Software Foundation (ASF) under one or more
>>> +//  contributor license agreements.  See the NOTICE file distributed
>> with
>>> +//  this work for additional information regarding copyright ownership.
>>> +//  The ASF licenses this file to You under the Apache License, Version
>> 2.0
>>> +//  (the "License"); you may not use this file except in compliance with
>>> +//  the License.  You may obtain a copy of the License at
>>> +//
>>> +//      http://www.apache.org/licenses/LICENSE-2.0
>>> +//
>>> +//  Unless required by applicable law or agreed to in writing, software
>>> +//  distributed under the License is distributed on an "AS IS" BASIS,
>>> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
>> implied.
>>> +//  See the License for the specific language governing permissions and
>>> +//  limitations under the License.
>>> +//
>>> 
>> +////////////////////////////////////////////////////////////////////////////////
>>> +package flexUnitTests
>>> +{
>>> +    COMPILE::SWF{
>>> +        import flash.utils.setTimeout;
>>> +    }
>>> +
>>> +    import org.apache.royale.test.asserts.*;
>>> +     import org.apache.royale.test.async.*;
>>> +    import org.apache.royale.utils.functional.*;
>>> +
>>> +    public class FunctionalTests
>>> +    {
>>> +        [Before]
>>> +        public function setUp():void
>>> +        {
>>> +        }
>>> +
>>> +        [After]
>>> +        public function tearDown():void
>>> +        {
>>> +        }
>>> +
>>> +        [BeforeClass]
>>> +        public static function setUpBeforeClass():void
>>> +        {
>>> +        }
>>> +
>>> +        [AfterClass]
>>> +        public static function tearDownAfterClass():void
>>> +        {
>>> +        }
>>> +
>>> +        [Test(async,timeout="300")]
>>> +        public function testDebounceLong():void
>>> +        {
>>> +            var value:Number = 0;
>>> +            var foo = function(){
>>> +                this.value = 0;
>>> +                this.increment = function(val:Number){
>>> +                    this.value+=val;
>>> +                }
>>> +            }
>>> +            var fooObj = new foo();
>>> +            var thisDebounced:Function =
>> debounceLong(fooObj.increment,30,fooObj);
>>> +            setTimeout(thisDebounced, 10,5);
>>> +            setTimeout(thisDebounced, 10,4);
>>> +            setTimeout(thisDebounced, 10,3);
>>> +            setTimeout(thisDebounced, 10,2);
>>> +            setTimeout(thisDebounced, 10,1);
>>> +            function increment(val:Number){
>>> +                value+=val;
>>> +            }
>>> +            var debounced:Function = debounceLong(increment,30);
>>> +            setTimeout(debounced, 10,5);
>>> +            setTimeout(debounced, 10,4);
>>> +            setTimeout(debounced, 10,3);
>>> +            setTimeout(debounced, 10,2);
>>> +            setTimeout(debounced, 10,1);
>>> +            Async.delayCall(this, function():void
>>> +            {
>>> +                assertTrue(fooObj.value == 1,"foo value should be
>> incremented by 1");
>>> +                assertTrue(value == 1,"Should be incremented by 1");
>>> +            }, 100);
>>> +        }
>>> +
>>> +        [Test(async,timeout="300")]
>>> +        public function testDebounceShort():void
>>> +        {
>>> +            var foo = function(){
>>> +                this.value = 0;
>>> +                this.increment = function(val:Number){
>>> +                    this.value+=val;
>>> +                }
>>> +            }
>>> +            var fooObj = new foo();
>>> +            var thisDebounced:Function =
>> debounceShort(fooObj.increment,30,fooObj);
>>> +            setTimeout(thisDebounced, 10,5);
>>> +            setTimeout(thisDebounced, 10,4);
>>> +            setTimeout(thisDebounced, 10,3);
>>> +            setTimeout(thisDebounced, 10,2);
>>> +            setTimeout(thisDebounced, 10,1);
>>> +
>>> +            var value:Number = 0;
>>> +            function increment(val:Number){
>>> +                value+=val;
>>> +            }
>>> +            var debounced:Function = debounceShort(increment,30);
>>> +            setTimeout(debounced, 10,5);
>>> +            setTimeout(debounced, 10,4);
>>> +            setTimeout(debounced, 10,3);
>>> +            setTimeout(debounced, 10,2);
>>> +            setTimeout(debounced, 10,1);
>>> +            Async.delayCall(this, function():void
>>> +            {
>>> +                assertTrue(fooObj.value > 1,"foo value should be
>> greater than 1");
>>> +                assertTrue(value > 1,"Should be greater than 1");
>>> +            }, 100);
>>> +        }
>>> +
>>> +
>>> +    }
>>> +}
>> 
>> 
> 
> -- 
> 
> Piotr Zarzycki


Re: [royale-asjs] branch develop updated: Added debounceShort and debounceLong

Posted by Piotr Zarzycki <pi...@gmail.com>.
Hi Harbs,

Great addition!

wt., 4 sty 2022 o 16:17 Harbs <ha...@gmail.com> napisał(a):

> FYI:
>
> “Debounce” is a term that AFAIK was made popular by underscore.
> https://underscorejs.org/#debounce
>
> There’s debounceLong which does the same thing as underscore’s default
> debounce functionality. Royale's version also has the option to pass in a
> “this” object. That’s necessary if you are debouncing a instance method
> which needs access to “this”.
> debounceShort is the same as debounceLong, but it debounces early like the
> “immediate” option in underscore’s version.
>
> I needed this functionality today, so I figured it’s time to start
> populating functional utilities… ;-)
>
> There’s “FunctionalTests” which show how to use it (sort of).
>
> HTH,
> Harbs
>
> > On Jan 4, 2022, at 5:10 PM, harbs@apache.org wrote:
> >
> > This is an automated email from the ASF dual-hosted git repository.
> >
> > harbs pushed a commit to branch develop
> > in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
> >
> >
> > The following commit(s) were added to refs/heads/develop by this push:
> >     new 5ca3337  Added debounceShort and debounceLong
> > 5ca3337 is described below
> >
> > commit 5ca333774e1463569ec0f291a2d17fe924b1181f
> > Author: Harbs <ha...@in-tools.com>
> > AuthorDate: Tue Jan 4 17:10:10 2022 +0200
> >
> >    Added debounceShort and debounceLong
> > ---
> > .../projects/Core/src/main/royale/CoreClasses.as   |   3 +
> > .../apache/royale/utils/functional/debounceLong.as |  49 +++++++++
> > .../royale/utils/functional/debounceShort.as       |  51 +++++++++
> > .../src/test/royale/flexUnitTests/CoreTester.as    |   1 +
> > .../test/royale/flexUnitTests/FunctionalTests.as   | 120
> +++++++++++++++++++++
> > 5 files changed, 224 insertions(+)
> >
> > diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as
> b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> > index df3709e..289429e 100644
> > --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
> > +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> > @@ -379,6 +379,9 @@ internal class CoreClasses
> >
> >       import org.apache.royale.utils.replaceBead; replaceBead;
> >
> > +     import org.apache.royale.utils.functional.debounceLong;
> debounceLong;
> > +     import org.apache.royale.utils.functional.debounceShort;
> debounceShort;
> > +
> >       import org.apache.royale.core.TextLineMetrics; TextLineMetrics;
> >       import org.apache.royale.utils.ClassSelectorList;
> ClassSelectorList;
> >
> > diff --git
> a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
> > new file mode 100644
> > index 0000000..46d2a7e
> > --- /dev/null
> > +++
> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
> > @@ -0,0 +1,49 @@
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +//
> > +//  Licensed to the Apache Software Foundation (ASF) under one or more
> > +//  contributor license agreements.  See the NOTICE file distributed
> with
> > +//  this work for additional information regarding copyright ownership.
> > +//  The ASF licenses this file to You under the Apache License, Version
> 2.0
> > +//  (the "License"); you may not use this file except in compliance with
> > +//  the License.  You may obtain a copy of the License at
> > +//
> > +//      http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +//  Unless required by applicable law or agreed to in writing, software
> > +//  distributed under the License is distributed on an "AS IS" BASIS,
> > +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> > +//  See the License for the specific language governing permissions and
> > +//  limitations under the License.
> > +//
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +package org.apache.royale.utils.functional
> > +{
> > +     COMPILE::SWF{
> > +             import flash.utils.setTimeout;
> > +             import flash.utils.clearTimeout;
> > +     }
> > +     /**
> > +      * Returns a debounced function to run after a delay.
> > +      * If the function is invoked within the delay period,
> > +      * the delay will be reset to start from the latest invocation of
> the function.
> > +      *
> > +   * @royalesuppressexport
> > +      * @langversion 3.0
> > +      * @productversion Royale 0.9.9
> > +      *
> > +      */
> > +     public function debounceLong(method:Function,
> delay:Number,thisArg:Object=null):Function
> > +     {
> > +             var timeoutRef:*;
> > +             return function(...args):void
> > +             {
> > +                     function callback():void
> > +                     {
> > +                             timeoutRef = null;
> > +                             method.apply(thisArg,args);
> > +                     }
> > +                     clearTimeout(timeoutRef);
> > +                     timeoutRef = setTimeout(callback, delay);
> > +             }
> > +     }
> > +}
> > \ No newline at end of file
> > diff --git
> a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
> > new file mode 100644
> > index 0000000..113b35b
> > --- /dev/null
> > +++
> b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
> > @@ -0,0 +1,51 @@
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +//
> > +//  Licensed to the Apache Software Foundation (ASF) under one or more
> > +//  contributor license agreements.  See the NOTICE file distributed
> with
> > +//  this work for additional information regarding copyright ownership.
> > +//  The ASF licenses this file to You under the Apache License, Version
> 2.0
> > +//  (the "License"); you may not use this file except in compliance with
> > +//  the License.  You may obtain a copy of the License at
> > +//
> > +//      http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +//  Unless required by applicable law or agreed to in writing, software
> > +//  distributed under the License is distributed on an "AS IS" BASIS,
> > +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> > +//  See the License for the specific language governing permissions and
> > +//  limitations under the License.
> > +//
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +package org.apache.royale.utils.functional
> > +{
> > +     COMPILE::SWF{
> > +             import flash.utils.setTimeout;
> > +             import flash.utils.clearTimeout;
> > +     }
> > +     /**
> > +      * Returns a debounced function to run after a delay.
> > +      * If the function is invoked within the delay period,
> > +      * the delay will be from the first invocation of the function.
> > +      *
> > +   * @royalesuppressexport
> > +      * @langversion 3.0
> > +      * @productversion Royale 0.9.9
> > +      *
> > +      */
> > +     public function debounceShort(method:Function,
> delay:Number,thisArg:Object=null):Function
> > +     {
> > +             var timeoutRef:*;
> > +             return function(...args):void
> > +             {
> > +                     function callback():void
> > +                     {
> > +                             timeoutRef = null;
> > +                             method.apply(thisArg,args);
> > +                     }
> > +                     if(timeoutRef == null)
> > +                     {
> > +                             timeoutRef = setTimeout(callback, delay);
> > +                     }
> > +             }
> > +     }
> > +}
> > \ No newline at end of file
> > diff --git
> a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> > index a0fb801..7b15375 100644
> > ---
> a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> > +++
> b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> > @@ -45,6 +45,7 @@ package flexUnitTests
> >         public var sanitizerTest:SanitizeTest;
> >         public var eventsTest:EventsTest;
> >         public var objectUtilTests:ObjectUtilsTest;
> > +        public var functionelTests:FunctionalTests;
> >
> >     }
> > }
> > diff --git
> a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> > new file mode 100644
> > index 0000000..10db0f2
> > --- /dev/null
> > +++
> b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> > @@ -0,0 +1,120 @@
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +//
> > +//  Licensed to the Apache Software Foundation (ASF) under one or more
> > +//  contributor license agreements.  See the NOTICE file distributed
> with
> > +//  this work for additional information regarding copyright ownership.
> > +//  The ASF licenses this file to You under the Apache License, Version
> 2.0
> > +//  (the "License"); you may not use this file except in compliance with
> > +//  the License.  You may obtain a copy of the License at
> > +//
> > +//      http://www.apache.org/licenses/LICENSE-2.0
> > +//
> > +//  Unless required by applicable law or agreed to in writing, software
> > +//  distributed under the License is distributed on an "AS IS" BASIS,
> > +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
> implied.
> > +//  See the License for the specific language governing permissions and
> > +//  limitations under the License.
> > +//
> >
> +////////////////////////////////////////////////////////////////////////////////
> > +package flexUnitTests
> > +{
> > +    COMPILE::SWF{
> > +        import flash.utils.setTimeout;
> > +    }
> > +
> > +    import org.apache.royale.test.asserts.*;
> > +     import org.apache.royale.test.async.*;
> > +    import org.apache.royale.utils.functional.*;
> > +
> > +    public class FunctionalTests
> > +    {
> > +        [Before]
> > +        public function setUp():void
> > +        {
> > +        }
> > +
> > +        [After]
> > +        public function tearDown():void
> > +        {
> > +        }
> > +
> > +        [BeforeClass]
> > +        public static function setUpBeforeClass():void
> > +        {
> > +        }
> > +
> > +        [AfterClass]
> > +        public static function tearDownAfterClass():void
> > +        {
> > +        }
> > +
> > +        [Test(async,timeout="300")]
> > +        public function testDebounceLong():void
> > +        {
> > +            var value:Number = 0;
> > +            var foo = function(){
> > +                this.value = 0;
> > +                this.increment = function(val:Number){
> > +                    this.value+=val;
> > +                }
> > +            }
> > +            var fooObj = new foo();
> > +            var thisDebounced:Function =
> debounceLong(fooObj.increment,30,fooObj);
> > +            setTimeout(thisDebounced, 10,5);
> > +            setTimeout(thisDebounced, 10,4);
> > +            setTimeout(thisDebounced, 10,3);
> > +            setTimeout(thisDebounced, 10,2);
> > +            setTimeout(thisDebounced, 10,1);
> > +            function increment(val:Number){
> > +                value+=val;
> > +            }
> > +            var debounced:Function = debounceLong(increment,30);
> > +            setTimeout(debounced, 10,5);
> > +            setTimeout(debounced, 10,4);
> > +            setTimeout(debounced, 10,3);
> > +            setTimeout(debounced, 10,2);
> > +            setTimeout(debounced, 10,1);
> > +            Async.delayCall(this, function():void
> > +            {
> > +                assertTrue(fooObj.value == 1,"foo value should be
> incremented by 1");
> > +                assertTrue(value == 1,"Should be incremented by 1");
> > +            }, 100);
> > +        }
> > +
> > +        [Test(async,timeout="300")]
> > +        public function testDebounceShort():void
> > +        {
> > +            var foo = function(){
> > +                this.value = 0;
> > +                this.increment = function(val:Number){
> > +                    this.value+=val;
> > +                }
> > +            }
> > +            var fooObj = new foo();
> > +            var thisDebounced:Function =
> debounceShort(fooObj.increment,30,fooObj);
> > +            setTimeout(thisDebounced, 10,5);
> > +            setTimeout(thisDebounced, 10,4);
> > +            setTimeout(thisDebounced, 10,3);
> > +            setTimeout(thisDebounced, 10,2);
> > +            setTimeout(thisDebounced, 10,1);
> > +
> > +            var value:Number = 0;
> > +            function increment(val:Number){
> > +                value+=val;
> > +            }
> > +            var debounced:Function = debounceShort(increment,30);
> > +            setTimeout(debounced, 10,5);
> > +            setTimeout(debounced, 10,4);
> > +            setTimeout(debounced, 10,3);
> > +            setTimeout(debounced, 10,2);
> > +            setTimeout(debounced, 10,1);
> > +            Async.delayCall(this, function():void
> > +            {
> > +                assertTrue(fooObj.value > 1,"foo value should be
> greater than 1");
> > +                assertTrue(value > 1,"Should be greater than 1");
> > +            }, 100);
> > +        }
> > +
> > +
> > +    }
> > +}
>
>

-- 

Piotr Zarzycki

Re: [royale-asjs] branch develop updated: Added debounceShort and debounceLong

Posted by Harbs <ha...@gmail.com>.
FYI:

“Debounce” is a term that AFAIK was made popular by underscore.
https://underscorejs.org/#debounce

There’s debounceLong which does the same thing as underscore’s default debounce functionality. Royale's version also has the option to pass in a “this” object. That’s necessary if you are debouncing a instance method which needs access to “this”.
debounceShort is the same as debounceLong, but it debounces early like the “immediate” option in underscore’s version.

I needed this functionality today, so I figured it’s time to start populating functional utilities… ;-)

There’s “FunctionalTests” which show how to use it (sort of).

HTH,
Harbs

> On Jan 4, 2022, at 5:10 PM, harbs@apache.org wrote:
> 
> This is an automated email from the ASF dual-hosted git repository.
> 
> harbs pushed a commit to branch develop
> in repository https://gitbox.apache.org/repos/asf/royale-asjs.git
> 
> 
> The following commit(s) were added to refs/heads/develop by this push:
>     new 5ca3337  Added debounceShort and debounceLong
> 5ca3337 is described below
> 
> commit 5ca333774e1463569ec0f291a2d17fe924b1181f
> Author: Harbs <ha...@in-tools.com>
> AuthorDate: Tue Jan 4 17:10:10 2022 +0200
> 
>    Added debounceShort and debounceLong
> ---
> .../projects/Core/src/main/royale/CoreClasses.as   |   3 +
> .../apache/royale/utils/functional/debounceLong.as |  49 +++++++++
> .../royale/utils/functional/debounceShort.as       |  51 +++++++++
> .../src/test/royale/flexUnitTests/CoreTester.as    |   1 +
> .../test/royale/flexUnitTests/FunctionalTests.as   | 120 +++++++++++++++++++++
> 5 files changed, 224 insertions(+)
> 
> diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> index df3709e..289429e 100644
> --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
> +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> @@ -379,6 +379,9 @@ internal class CoreClasses
> 	
> 	import org.apache.royale.utils.replaceBead; replaceBead;
> 
> +	import org.apache.royale.utils.functional.debounceLong; debounceLong;
> +	import org.apache.royale.utils.functional.debounceShort; debounceShort;
> +
> 	import org.apache.royale.core.TextLineMetrics; TextLineMetrics;
> 	import org.apache.royale.utils.ClassSelectorList; ClassSelectorList;
> 	
> diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
> new file mode 100644
> index 0000000..46d2a7e
> --- /dev/null
> +++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceLong.as
> @@ -0,0 +1,49 @@
> +////////////////////////////////////////////////////////////////////////////////
> +//
> +//  Licensed to the Apache Software Foundation (ASF) under one or more
> +//  contributor license agreements.  See the NOTICE file distributed with
> +//  this work for additional information regarding copyright ownership.
> +//  The ASF licenses this file to You under the Apache License, Version 2.0
> +//  (the "License"); you may not use this file except in compliance with
> +//  the License.  You may obtain a copy of the License at
> +//
> +//      http://www.apache.org/licenses/LICENSE-2.0
> +//
> +//  Unless required by applicable law or agreed to in writing, software
> +//  distributed under the License is distributed on an "AS IS" BASIS,
> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +//  See the License for the specific language governing permissions and
> +//  limitations under the License.
> +//
> +////////////////////////////////////////////////////////////////////////////////
> +package org.apache.royale.utils.functional
> +{
> +	COMPILE::SWF{
> +		import flash.utils.setTimeout;		
> +		import flash.utils.clearTimeout;		
> +	}
> +	/**
> +	 * Returns a debounced function to run after a delay.
> +	 * If the function is invoked within the delay period,
> +	 * the delay will be reset to start from the latest invocation of the function.
> +	 * 
> +   * @royalesuppressexport
> +	 * @langversion 3.0
> +	 * @productversion Royale 0.9.9
> +	 * 
> +	 */
> +	public function debounceLong(method:Function, delay:Number,thisArg:Object=null):Function
> +	{
> +		var timeoutRef:*;
> +		return function(...args):void
> +		{
> +			function callback():void
> +			{
> +				timeoutRef = null;
> +				method.apply(thisArg,args);
> +			}
> +			clearTimeout(timeoutRef);
> +			timeoutRef = setTimeout(callback, delay);
> +		}
> +	}
> +}
> \ No newline at end of file
> diff --git a/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
> new file mode 100644
> index 0000000..113b35b
> --- /dev/null
> +++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/debounceShort.as
> @@ -0,0 +1,51 @@
> +////////////////////////////////////////////////////////////////////////////////
> +//
> +//  Licensed to the Apache Software Foundation (ASF) under one or more
> +//  contributor license agreements.  See the NOTICE file distributed with
> +//  this work for additional information regarding copyright ownership.
> +//  The ASF licenses this file to You under the Apache License, Version 2.0
> +//  (the "License"); you may not use this file except in compliance with
> +//  the License.  You may obtain a copy of the License at
> +//
> +//      http://www.apache.org/licenses/LICENSE-2.0
> +//
> +//  Unless required by applicable law or agreed to in writing, software
> +//  distributed under the License is distributed on an "AS IS" BASIS,
> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +//  See the License for the specific language governing permissions and
> +//  limitations under the License.
> +//
> +////////////////////////////////////////////////////////////////////////////////
> +package org.apache.royale.utils.functional
> +{
> +	COMPILE::SWF{
> +		import flash.utils.setTimeout;		
> +		import flash.utils.clearTimeout;		
> +	}
> +	/**
> +	 * Returns a debounced function to run after a delay.
> +	 * If the function is invoked within the delay period,
> +	 * the delay will be from the first invocation of the function.
> +	 * 
> +   * @royalesuppressexport
> +	 * @langversion 3.0
> +	 * @productversion Royale 0.9.9
> +	 * 
> +	 */
> +	public function debounceShort(method:Function, delay:Number,thisArg:Object=null):Function
> +	{
> +		var timeoutRef:*;
> +		return function(...args):void
> +		{
> +			function callback():void
> +			{
> +				timeoutRef = null;
> +				method.apply(thisArg,args);
> +			}
> +			if(timeoutRef == null)
> +			{
> +				timeoutRef = setTimeout(callback, delay);
> +			}
> +		}
> +	}
> +}
> \ No newline at end of file
> diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> index a0fb801..7b15375 100644
> --- a/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> +++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/CoreTester.as
> @@ -45,6 +45,7 @@ package flexUnitTests
>         public var sanitizerTest:SanitizeTest;
>         public var eventsTest:EventsTest;
>         public var objectUtilTests:ObjectUtilsTest;
> +        public var functionelTests:FunctionalTests;
> 
>     }
> }
> diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> new file mode 100644
> index 0000000..10db0f2
> --- /dev/null
> +++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> @@ -0,0 +1,120 @@
> +////////////////////////////////////////////////////////////////////////////////
> +//
> +//  Licensed to the Apache Software Foundation (ASF) under one or more
> +//  contributor license agreements.  See the NOTICE file distributed with
> +//  this work for additional information regarding copyright ownership.
> +//  The ASF licenses this file to You under the Apache License, Version 2.0
> +//  (the "License"); you may not use this file except in compliance with
> +//  the License.  You may obtain a copy of the License at
> +//
> +//      http://www.apache.org/licenses/LICENSE-2.0
> +//
> +//  Unless required by applicable law or agreed to in writing, software
> +//  distributed under the License is distributed on an "AS IS" BASIS,
> +//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> +//  See the License for the specific language governing permissions and
> +//  limitations under the License.
> +//
> +////////////////////////////////////////////////////////////////////////////////
> +package flexUnitTests
> +{
> +    COMPILE::SWF{
> +        import flash.utils.setTimeout;
> +    }
> +
> +    import org.apache.royale.test.asserts.*;
> +	import org.apache.royale.test.async.*;
> +    import org.apache.royale.utils.functional.*;
> +    
> +    public class FunctionalTests
> +    {		
> +        [Before]
> +        public function setUp():void
> +        {
> +        }
> +        
> +        [After]
> +        public function tearDown():void
> +        {
> +        }
> +        
> +        [BeforeClass]
> +        public static function setUpBeforeClass():void
> +        {
> +        }
> +        
> +        [AfterClass]
> +        public static function tearDownAfterClass():void
> +        {
> +        }
> +
> +        [Test(async,timeout="300")]
> +        public function testDebounceLong():void
> +        {
> +            var value:Number = 0;
> +            var foo = function(){
> +                this.value = 0;
> +                this.increment = function(val:Number){
> +                    this.value+=val;
> +                }
> +            }
> +            var fooObj = new foo();
> +            var thisDebounced:Function = debounceLong(fooObj.increment,30,fooObj);
> +            setTimeout(thisDebounced, 10,5);
> +            setTimeout(thisDebounced, 10,4);
> +            setTimeout(thisDebounced, 10,3);
> +            setTimeout(thisDebounced, 10,2);
> +            setTimeout(thisDebounced, 10,1);
> +            function increment(val:Number){
> +                value+=val;
> +            }
> +            var debounced:Function = debounceLong(increment,30);
> +            setTimeout(debounced, 10,5);
> +            setTimeout(debounced, 10,4);
> +            setTimeout(debounced, 10,3);
> +            setTimeout(debounced, 10,2);
> +            setTimeout(debounced, 10,1);
> +            Async.delayCall(this, function():void
> +            {
> +                assertTrue(fooObj.value == 1,"foo value should be incremented by 1");
> +                assertTrue(value == 1,"Should be incremented by 1");
> +            }, 100);
> +        }
> +
> +        [Test(async,timeout="300")]
> +        public function testDebounceShort():void
> +        {
> +            var foo = function(){
> +                this.value = 0;
> +                this.increment = function(val:Number){
> +                    this.value+=val;
> +                }
> +            }
> +            var fooObj = new foo();
> +            var thisDebounced:Function = debounceShort(fooObj.increment,30,fooObj);
> +            setTimeout(thisDebounced, 10,5);
> +            setTimeout(thisDebounced, 10,4);
> +            setTimeout(thisDebounced, 10,3);
> +            setTimeout(thisDebounced, 10,2);
> +            setTimeout(thisDebounced, 10,1);
> +
> +            var value:Number = 0;
> +            function increment(val:Number){
> +                value+=val;
> +            }
> +            var debounced:Function = debounceShort(increment,30);
> +            setTimeout(debounced, 10,5);
> +            setTimeout(debounced, 10,4);
> +            setTimeout(debounced, 10,3);
> +            setTimeout(debounced, 10,2);
> +            setTimeout(debounced, 10,1);
> +            Async.delayCall(this, function():void
> +            {
> +                assertTrue(fooObj.value > 1,"foo value should be greater than 1");
> +                assertTrue(value > 1,"Should be greater than 1");
> +            }, 100);
> +        }
> +
> +
> +    }
> +}