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/05 23:28:36 UTC

[royale-asjs] branch develop updated: Another fun function

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 63bad6b  Another fun function
63bad6b is described below

commit 63bad6b4ab5e4af2953fedc34fa01a301c50052e
Author: Harbs <ha...@in-tools.com>
AuthorDate: Thu Jan 6 01:28:22 2022 +0200

    Another fun function
---
 .../projects/Core/src/main/royale/CoreClasses.as   |  1 +
 .../royale/utils/functional/delayFunction.as       | 69 ++++++++++++++++++++++
 .../test/royale/flexUnitTests/FunctionalTests.as   | 34 +++++++++++
 3 files changed, 104 insertions(+)

diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as
index 48189b5..e3da6a1 100644
--- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
+++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
@@ -383,6 +383,7 @@ internal class CoreClasses
 	import org.apache.royale.utils.functional.debounceShort; debounceShort;
 	import org.apache.royale.utils.functional.throttle; throttle;
 	import org.apache.royale.utils.functional.animateFunction; animateFunction;
+	import org.apache.royale.utils.functional.delayFunction; delayFunction;
 
 	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/delayFunction.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/delayFunction.as
new file mode 100644
index 0000000..44367f1
--- /dev/null
+++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/delayFunction.as
@@ -0,0 +1,69 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  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 function which when run will invoke the wrapped function after a delay.
+	 * Defaults to 0 which will execute at the next opportune time.
+	 * In JS this uses requestAnimationFrame
+	 * 
+   * @royalesuppressexport
+	 * @langversion 3.0
+	 * @productversion Royale 0.9.9
+	 * 
+	 */
+	public function delayFunction(method:Function, delay:Number=0):Function
+	{
+		return function(...args):void
+		{
+
+			function callback():void
+			{
+				method.apply(null,args);
+			}
+
+			COMPILE::SWF
+			{
+				setTimeout(function():void{
+					callback();
+				},delay);
+			}
+
+			COMPILE::JS
+			{
+				if(delay)
+				{
+					setTimeout(function():void{
+						requestAnimationFrame(callback);
+					},delay);
+				}
+				else
+				{
+					requestAnimationFrame(callback);
+				}
+
+			}
+
+		}
+	}
+}
\ No newline at end of file
diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
index 75f320c..f17c1a7 100644
--- a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
+++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
@@ -27,6 +27,7 @@ package flexUnitTests
     import org.apache.royale.utils.functional.*;
     import org.apache.royale.utils.functional.animateFunction;
     import org.apache.royale.test.asserts.assertTrue;
+    import org.apache.royale.test.asserts.assertEquals;
     
     public class FunctionalTests
     {		
@@ -226,6 +227,39 @@ package flexUnitTests
                 assertTrue(savedValue<3,"value should be 2");
             }, 300);
         }
+        public function testDelay():void
+        {
+            var foo:Foo = new Foo();
+            var delayedThis:Function = delayFunction(foo.increment,20);
+
+            delayedThis(1);
+
+            var firstThisValue:Number = foo.value;
+
+            var savedThisValue:Number;
+            setTimeout(function():void{
+                savedThisValue = foo.value;
+            },75);
+
+            var value:Number = 0;
+            function increment(val:Number):void{
+                value+=val;
+            }
+            var delayed:Function = delayFunction(increment,20);
+            delayed(1);
+            var firstValue:Number = value;
+            var savedValue:Number;
+            setTimeout(function():void{
+                savedValue = value;
+            },75);
+            Async.delayCall(this, function():void
+            {
+                assertEquals(firstThisValue,0,"foo value should be 0")
+                assertEquals(savedThisValue,1,"foo value should be 1")
+                assertEquals(firstValue,0,"value should be 0")
+                assertEquals(savedValue,1,"value should be 1")
+            }, 200);
+        }
 
 
     }

Re: [royale-asjs] branch develop updated: Another fun function

Posted by Harbs <ha...@gmail.com>.
Here’s another fun one:

Let’s say you have a class

 public class Foo{
	public function Foo(){

	}
	public function doSomethingIntense(intensity:Number):void{

	}

	public function somthingElse():void{
		if(fooBaz){
			doSomethingIntense();
		} else if(fooBar){
			doSomeOtherThing();
			doSomethingIntense();
		}
	}
}

Now, you really should pull doSomethingIntense() out into a requestAnimationFrame. But every time you invoke doSomethingIntense() having to wrap it in requestAnimationFrame with a function is annoying and error prone.

With delayFunction you can do the following:

	public function Foo(){
		delayedIntenseThing = delayFunction(doSomethingIntense);
	}
	private var delayedIntenseThing:Function

And then you can just call delayedIntenseThing() the same way you’d call doSomethingIntense().

It’s at times like this that I really wish ActionScript had typed functions with signatures...

Harbs

> On Jan 6, 2022, at 1:28 AM, 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 63bad6b  Another fun function
> 63bad6b is described below
> 
> commit 63bad6b4ab5e4af2953fedc34fa01a301c50052e
> Author: Harbs <ha...@in-tools.com>
> AuthorDate: Thu Jan 6 01:28:22 2022 +0200
> 
>    Another fun function
> ---
> .../projects/Core/src/main/royale/CoreClasses.as   |  1 +
> .../royale/utils/functional/delayFunction.as       | 69 ++++++++++++++++++++++
> .../test/royale/flexUnitTests/FunctionalTests.as   | 34 +++++++++++
> 3 files changed, 104 insertions(+)
> 
> diff --git a/frameworks/projects/Core/src/main/royale/CoreClasses.as b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> index 48189b5..e3da6a1 100644
> --- a/frameworks/projects/Core/src/main/royale/CoreClasses.as
> +++ b/frameworks/projects/Core/src/main/royale/CoreClasses.as
> @@ -383,6 +383,7 @@ internal class CoreClasses
> 	import org.apache.royale.utils.functional.debounceShort; debounceShort;
> 	import org.apache.royale.utils.functional.throttle; throttle;
> 	import org.apache.royale.utils.functional.animateFunction; animateFunction;
> +	import org.apache.royale.utils.functional.delayFunction; delayFunction;
> 
> 	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/delayFunction.as b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/delayFunction.as
> new file mode 100644
> index 0000000..44367f1
> --- /dev/null
> +++ b/frameworks/projects/Core/src/main/royale/org/apache/royale/utils/functional/delayFunction.as
> @@ -0,0 +1,69 @@
> +////////////////////////////////////////////////////////////////////////////////
> +//
> +//  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 function which when run will invoke the wrapped function after a delay.
> +	 * Defaults to 0 which will execute at the next opportune time.
> +	 * In JS this uses requestAnimationFrame
> +	 * 
> +   * @royalesuppressexport
> +	 * @langversion 3.0
> +	 * @productversion Royale 0.9.9
> +	 * 
> +	 */
> +	public function delayFunction(method:Function, delay:Number=0):Function
> +	{
> +		return function(...args):void
> +		{
> +
> +			function callback():void
> +			{
> +				method.apply(null,args);
> +			}
> +
> +			COMPILE::SWF
> +			{
> +				setTimeout(function():void{
> +					callback();
> +				},delay);
> +			}
> +
> +			COMPILE::JS
> +			{
> +				if(delay)
> +				{
> +					setTimeout(function():void{
> +						requestAnimationFrame(callback);
> +					},delay);
> +				}
> +				else
> +				{
> +					requestAnimationFrame(callback);
> +				}
> +
> +			}
> +
> +		}
> +	}
> +}
> \ No newline at end of file
> diff --git a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> index 75f320c..f17c1a7 100644
> --- a/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> +++ b/frameworks/projects/Core/src/test/royale/flexUnitTests/FunctionalTests.as
> @@ -27,6 +27,7 @@ package flexUnitTests
>     import org.apache.royale.utils.functional.*;
>     import org.apache.royale.utils.functional.animateFunction;
>     import org.apache.royale.test.asserts.assertTrue;
> +    import org.apache.royale.test.asserts.assertEquals;
> 
>     public class FunctionalTests
>     {		
> @@ -226,6 +227,39 @@ package flexUnitTests
>                 assertTrue(savedValue<3,"value should be 2");
>             }, 300);
>         }
> +        public function testDelay():void
> +        {
> +            var foo:Foo = new Foo();
> +            var delayedThis:Function = delayFunction(foo.increment,20);
> +
> +            delayedThis(1);
> +
> +            var firstThisValue:Number = foo.value;
> +
> +            var savedThisValue:Number;
> +            setTimeout(function():void{
> +                savedThisValue = foo.value;
> +            },75);
> +
> +            var value:Number = 0;
> +            function increment(val:Number):void{
> +                value+=val;
> +            }
> +            var delayed:Function = delayFunction(increment,20);
> +            delayed(1);
> +            var firstValue:Number = value;
> +            var savedValue:Number;
> +            setTimeout(function():void{
> +                savedValue = value;
> +            },75);
> +            Async.delayCall(this, function():void
> +            {
> +                assertEquals(firstThisValue,0,"foo value should be 0")
> +                assertEquals(savedThisValue,1,"foo value should be 1")
> +                assertEquals(firstValue,0,"value should be 0")
> +                assertEquals(savedValue,1,"value should be 1")
> +            }, 200);
> +        }
> 
> 
>     }