Test1 – this example demonstrates how to pass functions to other functions

 

using System;

 

class Test1 {

 int fun1( (int) => int fun2 ) {

  return fun2( 2 );

 }

 

 int fun3( int x ) {

  return x * x;

 }

 

 public static void Main( string[] args ) {

  Test1 t = new Test1();

  Console.WriteLine( t.fun1( t.fun3 ) );

 }

}

Test2 – this example demonstrates how to pass asynchronous functions to other functions

 

using System;

using System.Threading;

 

class Test2 {

 void fun1( (int) => async fun2 ) {

  fun2( 2 );

 }

 

 async fun3( int x ) {

  Thread.Sleep( 1000 );

  Console.WriteLine( x * x );

 }

 

 public static void Main( string[] args ) {

  Test2 t = new Test2();

  t.fun1( t.fun3 );

  Console.WriteLine( “fun1 is running… (Press Enter)” );

  Console.ReadLine();

 }

}

Test3 – this example demonstrates how to use static asynchronous functions

 

using System;

using System.Threading;

 

class Test3 {

 static async fun1( int x ) {

  Thread.Sleep( 1000 );

  Console.WriteLine( x * x );

 }

 

 public static void Main( string[] args ) {

  Test3.fun1( 2 );

  Console.WriteLine( “fun1 is running… (Press Enter)” );

  Console.ReadLine();

 }

}

Test4 – this example demonstrates how to pass function to another one function. Passed function returns void type and accepts one integer parameter

 

using System;

 

class Test4 {

 void fun1( (int) => void fun2 ) {

  fun2( 2 );

 }

 

 void fun3( int x ) {

  Console.WriteLine( x * x );

 }

 

 public static void Main( string[] args ) {

  Test4 t = new Test4();

  t.fun1( t.fun3 );

 }

}

Test5 – this example demonstrates how to pass function to another one function. The function that is passed doesn’t expect parameters and returns void

 

using System;

 

class Test5 {

 void fun1( () => void fun2 ) {

  fun2();

 }

 

 void fun3() {

  Console.WriteLine( 2 * 2 );

 }

 

 public static void Main( string[] args ) {

  Test5 t = new Test5();

  t.fun1( t.fun3 );

 }

}

Test6 – this example demonstrates how to use static movable methods

 

using System;

 

class Test6 {

 static movable fun1( int x ) {

  Console.WriteLine( “Hello world! ” + x );

 }

 

 public static void Main( string[] args ) {

  Test6.fun1( 2 );

 }

}

Test7 – this example demonstrates how to use non-static movable methods

 

using System;

 

class Test7 {

 movable fun1( int x ) {

  Console.WriteLine( “Hello world! ” + x );

 }

 

 public static void Main( string[] args ) {

  Test7 t = new Test7();

  t.fun1( 2 );

 }

}

Test8 – this example demonstrates how to call proxy functions from movable methods. Proxy function doesn’t expect parameters and returns some inv value

 

using System;

 

class Test8 {

 movable fun1( (int) => int fun ) {

  Console.WriteLine( fun( 2 ) );

 }

 

 int fun2( int x ) {

  return x * x;

 }

 

 public static void Main( string[] args ) {

  Test8 t = new Test8();

  t.fun1( t.fun2 );

 }

}

Test9 – this example demonstrates how to call proxy functions from static movable methods. Proxy function doesn’t expect parameters and returns void

 

using System;

 

class Test9 {

 static movable fun1( () => void fun ) {

  fun();

 }

 

 static void fun2() {

  Console.WriteLine( “fun2 has been called!” );

 }

 

 public static void Main( string[] args ) {

  Test9.fun1( Test9.fun2 );

 }

}

Test10 – this example demonstrates how to use local function pointers

 

using System;

 

class Test10 {

 static movable fun1( () => void fun ) {

  () => proxy void myfun = fun;

  myfun();

 }

 

 static void fun2() {

  Console.WriteLine( “fun2 has been called!” );

 }

 

 public static void Main( string[] args ) {

  Test10.fun1( Test10.fun2 );

 }

}

Test11 – this example demonstrates how to declare function pointers in the class structure

 

using System;

 

class Test11 {

 static () => proxy void myfun;

 

 static movable fun1( () => void fun ) {

  Test11.myfun = fun;

  Test11.myfun();

 }

 

 static void fun2() {

  Console.WriteLine( “fun2 has been called!” );

 }

 

 public static void Main( string[] args ) {

  Test11.fun1( Test11.fun2 );

 }

}

Test12 - this example demonstrates how to use asynchronous proxy functions

 

using System;

 

class Test12 {

 static movable fun1( () => async fun ) {

  fun();

  Console.WriteLine( “fun1 executing” );

 }

 

 static async fun2() {

  Console.WriteLine( “fun2 executing” );

 }

 

 public static void Main( string[] args ) {

  Test12.fun1( Test12.fun2 );

 }

}

Test13 – this example demonstrates how to use joins

 

using System;

 

class Test13 {

 int Receive() & async Send( int x ) {

  return x * x;

 }

 

 public static void Main( string[] args ) {

  Test13 t = new Test13();

  t.Send( 2 );

  Console.WriteLine( t.Receive() );

 }

}

Test14 – this example demonstrates how to use totally asynchronous joins

 

using System;

 

class Test14 {

 async a() & async b() {

  Console.WriteLine( “async a() & async b()” );

 }

 

 public static void Main( string[] args ) {

  Test14 t = new Test14();

  t.b();

  t.a();

  Console.WriteLine( “Press Enter” );

  Console.ReadLine();

 }

}

Test15 – this example demonstrates how to use the same synchronous method in two joins

 

using System;

 

class Test15 {

 void a() & async b() {

  Console.WriteLine( “void a() & async b()” );

 }

 

 void a() & async c() {

  Console.WriteLine( “void a() & async c()” );

 }

 

 public static void Main( string[] args ) {

  Test15 t = new Test15();

  t.b();

  t.a();

  t.c();

  t.a();

 }

}

Test16 – this example demonstrates how to use one asynchronous method in two joins

 

using System;

 

class Test16 {

 void a() & async b() {

  Console.WriteLine( “void a() & async b()” );

 }

 

 void c() & async b() {

  Console.WriteLine( “void c() & async b()” );

 }

 

 public static void Main( string[] args ) {

  Test16 t = new Test16();

  t.b();

  t.a();

  t.b();

  t.c();

 }

}

Test17 – this example demonstrates how to use static joins

 

using System;

 

class Test17 {

 static int Receive() & static async Send( int x ) {

  return x * x;

 }

 

 public static void Main( string[] args ) {

  Test17.Send( 2 );

  Console.WriteLine( Test17.Receive() );

 }

}

Test18 – this example demonstrates how to use both static and non-static joins in one class

 

using System;

 

class Test18 {

 static int Receive() & static async Send( int x ) {

  return x * x;

 }

 

 void a() & async b() {

  Console.WriteLine( “void a() & async b()” );

 }

 

 public static void Main( string[] args ) {

  Test18.Send( 2 );

  Console.WriteLine( Test18.Receive() );

  Test18 t = new Test18();

  t.b();

  t.a();

 }

}

Test19 – this example shows the difference between passing async method to movable and local method – this test is not working in current implementation

 

using System;

 

class Test19 {

 static movable fun1( () => async fun ) {

  Console.WriteLine( “movable fun1()” );

  fun();

 }

 

 static void fun1( () => async fun ) {

  Console.WriteLine( “fun1()” );

  fun();

 }

 

 static async fun2() {

  Console.WriteLine( “fun2()” );

 }

 

 public static void Main( string[] args ) {

  Test19.fun1( proxy Test19.fun2 );

  Test19.fun1( Test19.fun2 );

 }

}

Test20 – this example demonstrates how to convert async methods to proxy async methods

 

using System;

 

class Test20 {

 static movable fun1( () => async fun ) {

  Console.WriteLine( “movable fun1()” );

  fun();

 }

 

 static async fun2() {

  Console.WriteLine( “fun2()” );

 }

 

 public static void Main( string[] args ) {

  () => async fun = Test20.fun2;

  Test20.fun1( fun );

 }

}

Test21 – this example demonstrates how to convert sync methods that returns void to proxy sync methods that returns void

 

using System;

 

class Test21 {

 static movable fun1( () => void fun ) {

  Console.WriteLine( “movable fun1()” );

  fun();

 }

 

 static void fun2() {

  Console.WriteLine( “fun2()” );

 }

 

 public static void Main( string[] args ) {

  () => void fun = Test21.fun2;

  Test21.fun1( fun );

  Console.WriteLine( “Done!” );

 }

}

Test22 - this example demonstrates how to convert non-void sync methods to proxy non-void sync methods

 

using System;

 

class Test22 {

 static movable fun1( (int) => int fun ) {

  Console.WriteLine( “movable fun1()” );

  Console.WriteLine( fun( 2 ) );

 }

 

 static int fun2( int x ) {

  Console.WriteLine( “fun2()” );

  return x * x;

 }

 

 public static void Main( string[] args ) {

  (int) => int fun = Test22.fun2;

  Test22.fun1( fun );

  Console.WriteLine( “Done!” );

 }

}