> WrapLog(3)
WrapLog(3) : i8
BndKind:Call, Type:i8, Bnd:(Call(∂.Test.WrapLog(3:i8):i8))
// (<ctx>) : i8
top(Arr<obj>, Arr<obj>):obj
      1) ldarg.1 [Arr<obj>]
      1) ldc.i4.0
      1) ldelem.ref
      5) call static CodeGenUtil::ToRef(obj):ExecCtx
      1) stloc.0 [ExecCtx]
      1) ldc.i4.3
      1) conv.i8
      1) dup
      5) box [i8]
      1) stloc.1 [obj]
      1) ldloc.0 [ExecCtx]
      1) ldc.i4.0
      5) ldstr [WrapLog<i8>: {0}]
      1) ldloc.1 [obj]
      5) call static str::Format(str, obj):str
      5) callvirt ExecCtx::Log(i4, str):Void
      5) box [i8]
      1) ret
  Total Size: 42

Func sig: (<ctx>:x) to i8
  ** [0] WrapLog<i8>: 3
Type: i8, Value: 3
*** Ctx ping count: 0
###
> WrapLog("hello")
WrapLog("hello") : s
BndKind:Call, Type:s, Bnd:(Call(∂.Test.WrapLog(str(hello)):s))
// (<ctx>) : s
top(Arr<obj>, Arr<obj>):obj
      1) ldarg.1 [Arr<obj>]
      1) ldc.i4.0
      1) ldelem.ref
      5) call static CodeGenUtil::ToRef(obj):ExecCtx
      1) stloc.0 [ExecCtx]
      5) ldstr [hello]
      1) dup
      1) stloc.1 [obj]
      1) ldloc.0 [ExecCtx]
      1) ldc.i4.0
      5) ldstr [WrapLog<s>: {0}]
      1) ldloc.1 [obj]
      5) call static str::Format(str, obj):str
      5) callvirt ExecCtx::Log(i4, str):Void
      1) ret
  Total Size: 35

Func sig: (<ctx>:x) to s
  ** [0] WrapLog<s>: hello
Type: str, Value: hello
*** Ctx ping count: 0
###
> WrapLog(true)
WrapLog(true) : b
BndKind:Call, Type:b, Bnd:(Call(∂.Test.WrapLog(true:b):b))
// (<ctx>) : b
top(Arr<obj>, Arr<obj>):obj
      1) ldarg.1 [Arr<obj>]
      1) ldc.i4.0
      1) ldelem.ref
      5) call static CodeGenUtil::ToRef(obj):ExecCtx
      1) stloc.0 [ExecCtx]
      1) ldc.i4.1
      1) dup
      5) box [bool]
      1) stloc.1 [obj]
      1) ldloc.0 [ExecCtx]
      1) ldc.i4.0
      5) ldstr [WrapLog<b>: {0}]
      1) ldloc.1 [obj]
      5) call static str::Format(str, obj):str
      5) callvirt ExecCtx::Log(i4, str):Void
      5) box [bool]
      1) ret
  Total Size: 41

Func sig: (<ctx>:x) to b
  ** [0] WrapLog<b>: True
Type: bool, Value: true 
*** Ctx ping count: 0
###
> WrapLog(true and null)
WrapLog(true and null) : b?
BndKind:Call, Type:b?, Bnd:(Call(∂.Test.WrapLog(null:b?):b?))
// (<ctx>) : b?
top(Arr<obj>, Arr<obj>):obj
      1) ldarg.1 [Arr<obj>]
      1) ldc.i4.0
      1) ldelem.ref
      5) call static CodeGenUtil::ToRef(obj):ExecCtx
      1) stloc.0 [ExecCtx]
      5) call static CodeGenUtil::GetDefault():Opt<bool>
      1) dup
      5) box [Opt<bool>]
      1) stloc.1 [obj]
      1) ldloc.0 [ExecCtx]
      1) ldc.i4.0
      5) ldstr [WrapLog<b?>: {0}]
      1) ldloc.1 [obj]
      5) call static str::Format(str, obj):str
      5) callvirt ExecCtx::Log(i4, str):Void
      5) box [Opt<bool>]
      1) ret
  Total Size: 45

Func sig: (<ctx>:x) to b?
  ** [0] WrapLog<b?>: 
Type: <null>, Value: <null>
*** Ctx ping count: 0
###
> Map(Range(5), Wrap(it * 3)) // No currying needed
Map(Range(5), Wrap(it * 3)) : i8*
BndKind:Call, Type:i8*, Bnd:(Call(∂.ForEach([map:1] Call(∂.Range(5:i8):i8*), Call(∂.Test.Wrap(Mul(Scope(1), 3:i8)):i8)):i8*))
// () : i8*
ForEach_1(Arr<obj>, i8):i8
      1) ldarg.1 [i8]
      1) ldc.i4.3
      1) conv.i8
      1) mul
      5) call static WrapFuncGen::Exec(i8):i8
      1) ret
  Total Size: 10

top(Arr<obj>, Arr<obj>):obj
      1) ldc.i4.5
      1) conv.i8
      5) call static RangeGen::Exec(i8):ICachingEnumerable<i8>
      1) ldarg.0 [Arr<obj>]
      1) ldc.i4.0
      5) ldelem [Func<i8,i8>]
      5) call static ForEachGen::Exec(Seq<i8>, Func<i8,i8>):Seq<i8>
      5) call static CodeGenUtil::EnumerableToCaching(Seq<i8>):Seq<i8>
      1) ret
  Total Size: 25

Func sig: () to i8*
Sequence: Seq<i8>
 0) 0
 1) 3
 2) 6
 3) 9
 4) 12
###
> Map(Range(5), WrapLog(it * 3)) // Currying needed
Map(Range(5), WrapLog(it * 3)) : i8*
BndKind:Call, Type:i8*, Bnd:(Call(∂.ForEach([map:1] Call(∂.Range(5:i8):i8*), Call(∂.Test.WrapLog(Mul(Scope(1), 3:i8)):i8)):i8*))
// (<ctx>) : i8*
ForEach_1(Arr<obj>, i8):i8
      1) ldarg.1 [i8]
      1) ldc.i4.3
      1) conv.i8
      1) mul
      1) dup
      5) box [i8]
      1) stloc.0 [obj]
      1) ldarg.0 [Arr<obj>]
      1) ldc.i4.1
      5) ldelem [ExecCtx]
      1) ldc.i4.0
      5) ldstr [WrapLog<i8>: {0}]
      1) ldloc.0 [obj]
      5) call static str::Format(str, obj):str
      5) callvirt ExecCtx::Log(i4, str):Void
      1) ret
  Total Size: 36

top(Arr<obj>, Arr<obj>):obj
      1) ldarg.1 [Arr<obj>]
      1) ldc.i4.0
      1) ldelem.ref
      5) call static CodeGenUtil::ToRef(obj):ExecCtx
      1) stloc.0 [ExecCtx]
      1) ldc.i4.5
      1) conv.i8
      5) call static RangeGen::Exec(i8):ICachingEnumerable<i8>
      1) ldarg.0 [Arr<obj>]
      1) ldc.i4.0
      5) ldelem [MethodInfo]
      5) ldtoken [Func<i8,i8>]
      5) call static Type::GetTypeFromHandle(RuntimeTypeHandle):Type
      1) ldc.i4.2
      5) newarr [obj]
      1) dup
      1) ldc.i4.1
      1) ldloc.0 [ExecCtx]
      5) stelem [ExecCtx]
      5) callvirt DynamicMethod::CreateDelegate(Type, obj):Delegate
      5) call static ForEachGen::Exec(Seq<i8>, Func<i8,i8>):Seq<i8>
      5) call static CodeGenUtil::EnumerableToCaching(Seq<i8>):Seq<i8>
      1) ret
  Total Size: 63

Func sig: (<ctx>:x) to i8*
Sequence: Seq<i8>
  ** [0] WrapLog<i8>: 0
 0) 0
  ** [0] WrapLog<i8>: 3
 1) 3
  ** [0] WrapLog<i8>: 6
 2) 6
  ** [0] WrapLog<i8>: 9
 3) 9
  ** [0] WrapLog<i8>: 12
 4) 12
*** Ctx ping count: 0
###
