Find file
Fetching contributors…
Cannot retrieve contributors at this time
16347 lines (16262 sloc) 775 KB
<doc>
<assembly>
<name>Cadenza</name>
</assembly>
<members>
<member name="T:Cadenza.ActionCoda">
<summary>
Provides extension methods on <see cref="T:System.Action{T}" />,
<see cref="T:System.Func{T,TResult}" />, and related delegates.
</summary>
<remarks>
<para>
<see cref="T:Cadenza.ActionCoda" /> provides methods methods for:
</para>
<list type="bullet">
<item>
<term>
Delegate currying and partial application (<see cref="M:Cadenza.DelegateCoda.Curry" />)
</term>
</item>
<item>
<term>
Delegate composition (<see cref="M:Cadenza.DelegateCoda.Compose" />)
</term>
</item>
<item>
<term>
Timing generation (<see cref="M:Cadenza.DelegateCoda.Timings" />)
</term>
</item>
</list>
<para>
Currying via partial application is a way to easily transform
functions which accept N arguments into functions which accept
N-1 arguments, by "fixing" arguments with a value.
</para>
<code lang="C#">
// partial application:
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,int,int&gt; f_3 = function.Curry (3);
Func&lt;int&gt; f_321 = function.Curry (3, 2, 1);
Console.WriteLine (f_3 (2, 1)); // prints (3 + 2 + 1) == "6"
Console.WriteLine (f_321 ()); // prints (3 + 2 + 1) == "6"</code>
<para>
"Traditional" currying converts a delegate that accepts N arguments
into a delegate which accepts only one argument, but when invoked may
return a further delegate (etc.) until the final value is returned.
</para>
<code lang="C#">
// traditional currying:
Func&lt;int, Func&lt;int, Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Func&lt;int, Func&lt;int, int&gt;&gt; fc_1 = curry (1);
Func&lt;int, int&gt; fc_12 = fc_1 (2);
Console.WriteLine (fc_12 (3)); // prints (3 + 2 + 1) == "6"
Console.WriteLine (curry (3)(2)(1)); // prints (3 + 2 + 1) == "6"</code>
<para>
Composition is a way to easy chain (or pipe) together multiple delegates
so that the return value of a "composer" delegate is used as the input
parameter for the chained delegate:
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
<para>
All possible argument and return delegate permutations are provided
for the <see cref="T:System.Action{T}" /> and related types.
</para>
</remarks>
</member>
<member name="M:Cadenza.ActionCoda.Compose``1(System.Action{``0},System.Func{``0})">
<typeparam name="T">
The <see cref="T:System.Func{T}" /> return type, and <see cref="T:System.Action{T}" /> argument type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Compose``2(System.Action{``1},System.Func{``0,``1})">
<typeparam name="T1">To be added.</typeparam>
<typeparam name="T2">
The <see cref="T:System.Func{T1,T2}" /> return type, and <see cref="T:System.Action{T2}" /> argument type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T2}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Action{T1}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T1}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Compose``3(System.Action{``2},System.Func{``0,``1,``2})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">To be added.</typeparam>
<typeparam name="T3">
The <see cref="T:System.Func{T1,T2,T3}" /> return type, and <see cref="T:System.Action{T3}" /> argument type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T3}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Action{T1,T2}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T1,T2}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Compose``4(System.Action{``3},System.Func{``0,``1,``2,``3})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Func{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">To be added.</typeparam>
<typeparam name="T4">
The <see cref="T:System.Func{T1,T2,T3,T4}" /> return type, and <see cref="T:System.Action{T4}" /> argument type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T4}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3,T4}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Action{T1,T2,T3}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T1,T2,T3}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Compose``5(System.Action{``4},System.Func{``0,``1,``2,``3,``4})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T4">To be added.</typeparam>
<typeparam name="T5">
The <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> return type, and <see cref="T:System.Action{T5}" /> argument type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T5}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Action{T1,T2,T3,T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T1,T2,T3,T4}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``1(System.Action{``0})">
<typeparam name="T">
The first value type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to curry.
</param>
<summary>
Creates a <see cref="T:System.Action{T}" /> for currying.
</summary>
<returns>
A <see cref="T:System.Action{T}" /> which, when invoked, will
invoke <paramref name="self" />.
</returns>
<remarks>
<para>
This is the more "traditional" view of currying, turning a method
which takes <c>(X * Y)-&gt;Z</c> (i.e. separate arguments) into a
<c>X -&gt; (Y -&gt; Z)</c> (that is a "chain" of nested Funcs such that
you provide only one argument to each Func until you provide enough
arguments to invoke the original method).
</para>
<code lang="C#">
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,Func&lt;int,Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Assert.AreEqual(6, curry (3)(2)(1));</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``1(System.Action{``0},Cadenza.Tuple{``0})">
<typeparam name="T">
A <see cref="T:System.Action{T}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``1(System.Action{``0},``0)">
<typeparam name="T">
A <see cref="T:System.Action{T}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to curry.
</param>
<param name="value">
A value of type <typeparamref name="T" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``2(System.Action{``0,``1})">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to curry.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,System.Action{T2}}" /> for currying.
</summary>
<returns>
A <see cref="T:System.Func{T1,System.Action{T2}}" /> which, when invoked, will
return a <see cref="T:System.Action{T2}" /> which, when invoked, will
invoke <paramref name="self" />.
</returns>
<remarks>
<para>
This is the more "traditional" view of currying, turning a method
which takes <c>(X * Y)-&gt;Z</c> (i.e. separate arguments) into a
<c>X -&gt; (Y -&gt; Z)</c> (that is a "chain" of nested Funcs such that
you provide only one argument to each Func until you provide enough
arguments to invoke the original method).
</para>
<code lang="C#">
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,Func&lt;int,Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Assert.AreEqual(6, curry (3)(2)(1));</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``2(System.Action{``0,``1},Cadenza.Tuple{``0,``1})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``2(System.Action{``0,``1},Cadenza.Tuple{``0})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``2(System.Action{``0,``1},``0)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``2(System.Action{``0,``1},``0,``1)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2})">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<typeparam name="T3">
The third value type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,System.Func{T2,System.Action{T3}}}" /> for currying.
</summary>
<returns>
A <see cref="T:System.Func{T1,System.Func{T2,System.Action{T3}}}" /> which, when invoked, will
return a <see cref="T:System.Func{T2,System.Action{T3}}" /> which, when invoked, will return a <see cref="T:System.Action{T3}" /> which, when invoked, will
invoke <paramref name="self" />.
</returns>
<remarks>
<para>
This is the more "traditional" view of currying, turning a method
which takes <c>(X * Y)-&gt;Z</c> (i.e. separate arguments) into a
<c>X -&gt; (Y -&gt; Z)</c> (that is a "chain" of nested Funcs such that
you provide only one argument to each Func until you provide enough
arguments to invoke the original method).
</para>
<code lang="C#">
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,Func&lt;int,Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Assert.AreEqual(6, curry (3)(2)(1));</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},Cadenza.Tuple{``0,``1,``2})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2,T3}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},Cadenza.Tuple{``0,``1})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T3}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T3}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},Cadenza.Tuple{``0})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2,T3}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2,T3}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},``0)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2,T3}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2,T3}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},``0,``1)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T3}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T3}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``3(System.Action{``0,``1,``2},``0,``1,``2)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<param name="value3">
A value of type <typeparamref name="T3" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3})">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<typeparam name="T3">
The third value type.
</typeparam>
<typeparam name="T4">
The fourth value type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,System.Func{T2,System.Func{T3,System.Action{T4}}}}" /> for currying.
</summary>
<returns>
A <see cref="T:System.Func{T1,System.Func{T2,System.Func{T3,System.Action{T4}}}}" /> which, when invoked, will
return a <see cref="T:System.Func{T2,System.Func{T3,System.Action{T4}}}" /> which, when invoked, will return a <see cref="T:System.Func{T3,System.Action{T4}}" /> which, when invoked, will return a <see cref="T:System.Action{T4}" /> which, when invoked, will
invoke <paramref name="self" />.
</returns>
<remarks>
<para>
This is the more "traditional" view of currying, turning a method
which takes <c>(X * Y)-&gt;Z</c> (i.e. separate arguments) into a
<c>X -&gt; (Y -&gt; Z)</c> (that is a "chain" of nested Funcs such that
you provide only one argument to each Func until you provide enough
arguments to invoke the original method).
</para>
<code lang="C#">
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,Func&lt;int,Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Assert.AreEqual(6, curry (3)(2)(1));</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},Cadenza.Tuple{``0,``1,``2,``3})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2,T3,T4}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},Cadenza.Tuple{``0,``1,``2})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2,T3}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},Cadenza.Tuple{``0,``1})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1,T2}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T3,T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T3,T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},Cadenza.Tuple{``0})">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T1}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2,T3,T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2,T3,T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},``0)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T2,T3,T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T2,T3,T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},``0,``1)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T3,T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T3,T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},``0,``1,``2)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<param name="value3">
A value of type <typeparamref name="T3" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action{T4}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action{T4}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Curry``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to curry.
</param>
<param name="value1">
A value of type <typeparamref name="T1" /> to fix.
</param>
<param name="value2">
A value of type <typeparamref name="T2" /> to fix.
</param>
<param name="value3">
A value of type <typeparamref name="T3" /> to fix.
</param>
<param name="value4">
A value of type <typeparamref name="T4" /> to fix.
</param>
<summary>
Creates a <see cref="T:System.Action" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Action" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings(System.Action,System.Int32)">
<param name="self">
The <see cref="T:System.Action" /> to generate timings for.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
This is equivalent to calling
<see cref="M:Cadenza.ActionCoda.Timings(System.Action,System.Int32,System.Int32)" />
with a <paramref name="loopsPerRun" /> value of <c>1</c>,
e.g. as if by calling <c>self.Timing (runs, 1)</c>.
</para>
</remarks>
<altmember cref="M:Cadenza.ActionCoda.Timings(System.Action,System.Int32,System.Int32)" />
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings(System.Action,System.Int32,System.Int32)">
<param name="self">
The <see cref="T:System.Action" /> to generate timings for.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<param name="loopsPerRun">
An <see cref="T:System.Int32" /> containing the number of times to invoke <paramref name="self" /> for each <see cref="T:System.TimeSpan" /> value returned.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
Generates <paramref name="runs" /><see cref="T:System.TimeSpan" />
instances, in which each <c>TimeSpan</c> instance is the amount of time
required to execute <paramref name="self" /> for
<paramref name="loopsPerRun" /> times.
</para>
</remarks>
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
<para>-or-</para>
<para>
<paramref name="loopsPerRun" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``1(System.Action{``0},``0,System.Int32)">
<typeparam name="T">
A <see cref="T:System.Action{T}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to generate timings for.
</param>
<param name="value">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
This is equivalent to calling
<see cref="M:Cadenza.ActionCoda.Timings``1(System.Action{``0},``0,System.Int32,System.Int32)" />
with a <paramref name="loopsPerRun" /> value of <c>1</c>,
e.g. as if by calling <c>self.Timing (value, runs, 1)</c>.
</para>
</remarks>
<altmember cref="M:Cadenza.ActionCoda.Timings``1(System.Action{``0},``0,System.Int32,System.Int32)" />
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``1(System.Action{``0},``0,System.Int32,System.Int32)">
<typeparam name="T">
A <see cref="T:System.Action{T}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T}" /> to generate timings for.
</param>
<param name="value">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<param name="loopsPerRun">
An <see cref="T:System.Int32" /> containing the number of times to invoke <paramref name="self" /> for each <see cref="T:System.TimeSpan" /> value returned.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
Generates <paramref name="runs" /><see cref="T:System.TimeSpan" />
instances, in which each <c>TimeSpan</c> instance is the amount of time
required to execute <paramref name="self" /> for
<paramref name="loopsPerRun" /> times.
</para>
</remarks>
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
<para>-or-</para>
<para>
<paramref name="loopsPerRun" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``2(System.Action{``0,``1},``0,``1,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
This is equivalent to calling
<see cref="M:Cadenza.ActionCoda.Timings``2(System.Action{``0,``1},``0,``1,System.Int32,System.Int32)" />
with a <paramref name="loopsPerRun" /> value of <c>1</c>,
e.g. as if by calling <c>self.Timing (value1, value2, runs, 1)</c>.
</para>
</remarks>
<altmember cref="M:Cadenza.ActionCoda.Timings``2(System.Action{``0,``1},``0,``1,System.Int32,System.Int32)" />
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``2(System.Action{``0,``1},``0,``1,System.Int32,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<param name="loopsPerRun">
An <see cref="T:System.Int32" /> containing the number of times to invoke <paramref name="self" /> for each <see cref="T:System.TimeSpan" /> value returned.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
Generates <paramref name="runs" /><see cref="T:System.TimeSpan" />
instances, in which each <c>TimeSpan</c> instance is the amount of time
required to execute <paramref name="self" /> for
<paramref name="loopsPerRun" /> times.
</para>
</remarks>
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
<para>-or-</para>
<para>
<paramref name="loopsPerRun" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``3(System.Action{``0,``1,``2},``0,``1,``2,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value3">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
This is equivalent to calling
<see cref="M:Cadenza.ActionCoda.Timings``3(System.Action{``0,``1,``2},``0,``1,``2,System.Int32,System.Int32)" />
with a <paramref name="loopsPerRun" /> value of <c>1</c>,
e.g. as if by calling <c>self.Timing (value1, value2, value3, runs, 1)</c>.
</para>
</remarks>
<altmember cref="M:Cadenza.ActionCoda.Timings``3(System.Action{``0,``1,``2},``0,``1,``2,System.Int32,System.Int32)" />
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``3(System.Action{``0,``1,``2},``0,``1,``2,System.Int32,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value3">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<param name="loopsPerRun">
An <see cref="T:System.Int32" /> containing the number of times to invoke <paramref name="self" /> for each <see cref="T:System.TimeSpan" /> value returned.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
Generates <paramref name="runs" /><see cref="T:System.TimeSpan" />
instances, in which each <c>TimeSpan</c> instance is the amount of time
required to execute <paramref name="self" /> for
<paramref name="loopsPerRun" /> times.
</para>
</remarks>
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
<para>-or-</para>
<para>
<paramref name="loopsPerRun" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value3">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value4">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
This is equivalent to calling
<see cref="M:Cadenza.ActionCoda.Timings``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3,System.Int32,System.Int32)" />
with a <paramref name="loopsPerRun" /> value of <c>1</c>,
e.g. as if by calling <c>self.Timing (value1, value2, value3, value4, runs, 1)</c>.
</para>
</remarks>
<altmember cref="M:Cadenza.ActionCoda.Timings``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3,System.Int32,System.Int32)" />
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.ActionCoda.Timings``4(System.Action{``0,``1,``2,``3},``0,``1,``2,``3,System.Int32,System.Int32)">
<typeparam name="T1">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T4">
A <see cref="T:System.Action{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<param name="self">
The <see cref="T:System.Action{T1,T2,T3,T4}" /> to generate timings for.
</param>
<param name="value1">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value2">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value3">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="value4">
The *unknown* <paramref name="self" /> parameter value.
</param>
<param name="runs">
An <see cref="T:System.Int32" /> containing the number of <see cref="T:System.TimeSpan" /> values to return.
</param>
<param name="loopsPerRun">
An <see cref="T:System.Int32" /> containing the number of times to invoke <paramref name="self" /> for each <see cref="T:System.TimeSpan" /> value returned.
</param>
<summary>
Get timing information for delegate invocations.
</summary>
<returns>
An <see cref="T:System.Collections.Generic.IEnumerable{System.TimeSpan}" />
which will return the timing information for <paramref name="self" />.
</returns>
<remarks>
<para>
Generates <paramref name="runs" /><see cref="T:System.TimeSpan" />
instances, in which each <c>TimeSpan</c> instance is the amount of time
required to execute <paramref name="self" /> for
<paramref name="loopsPerRun" /> times.
</para>
</remarks>
<exception cref="T:System.ArgumentException">
<para>
<paramref name="runs" /> is negative.
</para>
<para>-or-</para>
<para>
<paramref name="loopsPerRun" /> is negative.
</para>
</exception>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="T:Cadenza.Either">
<summary>
Provides static utility methods to create
<see cref="T:Cadenza.Either{TValue,Exception}" /> instances.
</summary>
<remarks>
Use the <see cref="M:Cadenza.Either.TryParse" /> methods if it is
necessary to know why the value couldn't be parsed. Otherwise, use the
<see cref="M:Cadenza.Maybe.TryParse" /> methods.
</remarks>
</member>
<member name="M:Cadenza.Either.TryConvert``1(System.Object)">
<typeparam name="TResult">To be added.</typeparam>
<param name="value">To be added.</param>
<summary>To be added.</summary>
<returns>To be added.</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">To be added; from: <see cref="M:Cadenza.Either.TryConvert``1(System.Object)" /></exception>
</member>
<member name="M:Cadenza.Either.TryConvert``2(``0)">
<typeparam name="TSource">
The type to convert from.
</typeparam>
<typeparam name="TResult">
The type to convert to.
</typeparam>
<param name="value">
An instance of type <typeparamref name="TSource" /> containing the
value to convert into a <typeparamref name="TResult" /> instance.
</param>
<summary>
Attempt to convert the value within a <typeparamref name="TSource" />
into an instance of type <typeparamref name="TResult" />.
</summary>
<returns>
A <see cref="T:Cadenza.Either{``1,System.Exception}" />
containing either the parsed value or the error that results from
attempting to convert <paramref name="value" /> into an instance
of type <typeparamref name="TResult" />.
</returns>
<remarks>
<para>
<c>TryParse</c> attempts to use a variety of mechanisms to convert
<paramref name="value" /> into a <typeparamref name="TResult" />,
attempting, in order:
</para>
<list type="number">
<item>
<term>
<c>TypeDescriptor.GetConverter(typeof(TResult)).ConvertFrom(value)</c>
</term>
</item>
<item>
<term>
<c>TypeDescriptor.GetConverter(typeof(TSource)).ConvertTo(value, typeof(TResult))</c>
</term>
</item>
<item>
<term>
<c>Convert.ChangeType(value, typeof(TResult))</c>
</term>
</item>
</list>
<para>
If none of these methods are able to convert the value, then the returned
<see cref="T:Cadenza.Either{TSource,System.Exception}" /> will contain
a <see cref="T:System.NotSupportedException" />, and
<see cref="P:System.Exception.InnerException" /> will contain the original
exception.
</para>
<code lang="C#" src="../../Test/Cadenza/EitherTest.cs#TryConvert">Either&lt;DateTime, Exception&gt; a = Either.TryConvert&lt;int, DateTime&gt; (42);
Exception e = a.Fold (i =&gt; null, i =&gt; i);
Assert.IsNotNull (e);
Assert.AreEqual (typeof (InvalidCastException), e.GetType ());
Either&lt;string, Exception&gt; b = Either.TryConvert&lt;int, string&gt; (42);
string n2 = b.Fold (i =&gt; i, i =&gt; null);
Assert.AreEqual ("42", n2);
Either&lt;int, Exception&gt; c =
Either.TryConvert&lt;CustomConvertible, int&gt; (new CustomConvertible ());
int n3 = c.Fold (i =&gt; i, i =&gt; -1);
Assert.AreEqual (CustomConvertible.Int32, n3);
Either&lt;ulong, Exception&gt; u =
Either.TryConvert&lt;CustomConvertible, ulong&gt; (new CustomConvertible ());
e = u.Fold (i =&gt; null, i =&gt; i);
Assert.IsNotNull (e);
Assert.AreEqual (typeof (NotSupportedException), e.GetType ());
Assert.AreEqual (typeof (BadException), e.InnerException.GetType ());
</code>
</remarks>
<altmember cref="M:System.Convert.ChangeType(System.Object,System.Type)" />
<altmember cref="M:System.ComponentModel.TypeConverter.ConvertFrom(System.Object)" />
<altmember cref="M:System.ComponentModel.TypeConverter.ConvertTo(System.Object,System.Type)" />
<altmember cref="M:System.ComponentModel.TypeDescriptor.GetConverter(System.Type)" />
</member>
<member name="M:Cadenza.Either.TryParse``1(System.String)">
<typeparam name="T">
The type to convert <paramref name="value" /> to.
</typeparam>
<param name="value">
A <see cref="T:System.String" /> containing the value to convert
into a <typeparamref name="T" />.
</param>
<summary>
Attempt to convert the value within a <see cref="T:System.String" />
into an instance of type <typeparamref name="T" />.
</summary>
<returns>
A <see cref="T:Cadenza.Either{``0,System.Exception}" />
containing either the parsed value or the error that results from
attempting to convert <paramref name="value" /> into an instance
of type <typeparamref name="T" />.
</returns>
<remarks>
<para>
This method calls
<see cref="M:Cadenza.Either.TryConvert``2(``0)" />, with
<see cref="T:System.String" /> as the
<typeparamref name="TSource" /> type.
</para>
<code lang="C#" src="../../Test/Cadenza/EitherTest.cs#TryParse">var v = Either.TryParse&lt;int&gt; ("3.14159");
var e = v.Fold (i =&gt; null, i =&gt; i);
Assert.IsNotNull (e);
Assert.IsTrue (typeof(Exception).IsAssignableFrom (e.GetType()));
v = Either.TryParse&lt;int&gt; ("42");
var n = v.Fold (i =&gt; i, i =&gt; -1);
Assert.AreEqual (42, n);
var v2 = Either.TryParse&lt;int?&gt; ("3.14159");
e = v2.Fold (i =&gt; null, i =&gt; i);
Assert.IsNotNull (e);
Assert.IsTrue (typeof(Exception).IsAssignableFrom (e.GetType()));
v2 = Either.TryParse&lt;int?&gt; ("42");
n = v2.Fold (i =&gt; i.Value, i =&gt; -1);
Assert.AreEqual (42, n);
</code>
</remarks>
</member>
<member name="T:Cadenza.Either`2">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<summary>
A union of 2 values.
</summary>
<remarks>
<para>
An <c>Either</c> is an immutable, strongly typed union of variously
typed values with each value lacking an otherwise meaningful name aside
from its position, which is not exposed. It stores only one (non-null)
value from a set of types (as determined by the type parameter list).
</para>
<para>
The value held by a <see cref="T:Cadenza.Either{T1, T2}" /> instance
can be converted into a value by using the
<see cref="M:Cadenza.Either{T1, T2}.Fold``1(System.Func{`0,``0},System.Func{`1,``0})" /> method.
<c>Fold</c> takes a list of delegates to perform the conversion; the
delegate used to perform the conversion is based upon the internal
position of the value stored.
</para>
<para>
<c>Either</c> instances are created through one of the following
creation methods:
</para>
<list type="bullet">
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2}.A(`0)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2}.op_Implicit(`0)~Cadenza.Either{`0,`1}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2}.B(`1)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2}.op_Implicit(`1)~Cadenza.Either{`0,`1}" />
</term>
</item>
</list>
<code lang="C#">
var a = Either&lt;double, string&gt;.A (Math.PI); // value stored in 1st position
int r = a.Fold (
v =&gt; (int) v, // 1st position converter
v =&gt; v.Length); // 2nd position converter
Console.WriteLine (r); // prints 3</code>
</remarks>
</member>
<member name="M:Cadenza.Either`2.A(``10T1`1``10`1)">
<param name="value">
A <typeparamref name="T1" /> containing the value
to provide to the first
<see cref="M:Cadenza.Either{T1,T2}.Fold``1(System.Func{`0,``0},System.Func{`1,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2}" /> instance which holds a
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2}.Fold``1(System.Func{`0,``0},System.Func{`1,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2}" /> instance
will invoke the first delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`2.B(``10T2`1``10`1)">
<param name="value">
A <typeparamref name="T2" /> containing the value
to provide to the second
<see cref="M:Cadenza.Either{T1,T2}.Fold``1(System.Func{`0,``0},System.Func{`1,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2}" /> instance which holds a
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2}.Fold``1(System.Func{`0,``0},System.Func{`1,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2}" /> instance
will invoke the second delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`2.Equals(``10Cadenza`1``10`1.``10Either`1``10`1{``10T1`1``10`1,``10T2`1``10`1})">
<param name="obj">
A <see cref="T:Cadenza.Either{T1,T2}" />to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified <see cref="T:Cadenza.Either{T1,T2}" /> have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`2.Equals(``10System`1``10`1.``10Object`1``10`1)">
<param name="obj">
A <see cref="T:System.Object" /> to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified object have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if <paramref name="obj" /> is a
<see cref="T:Cadenza.Either{T1,T2}" /> and each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.Equals(System.Object)" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`2.Fold``1(``10System`1``10`1.``10Func`1``10`1{``10T1`1``10`1,``10TResult`1``10`1},``10System`1``10`1.``10Func`1``10`1{``10T2`1``10`1,``10TResult`1``10`1})">
<typeparam name="TResult">
The type to convert the <see cref="T:Cadenza.Either{T1,T2}" /> to.
</typeparam>
<param name="a">
A <see cref="T:System.Func{T1,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2}" /> stores a
<typeparamref name="T1" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="b">
A <see cref="T:System.Func{T2,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2}" /> stores a
<typeparamref name="T2" /> value into a
<typeparamref name="TResult" /> value.
</param>
<summary>
Converts a <see cref="T:Cadenza.Either{T1,T2}" /> into a <typeparamref name="TResult" /> value.
</summary>
<returns>
A <typeparamref name="TResult" /> as generated by one
of the conversion delegate parameters.
</returns>
<remarks>
<para>
Converts a <see cref="T:Cadenza.Either{T1,T2}" /> into a <typeparamref name="TResult" />
by invoking one of the provided delegate parameters.
</para>
<para>
The parameter which is invoked is predicated upon the internal position of
the value held. For example, if the internal value is in the first position
(i.e. <see cref="M:Cadenza.Either{T1,T2}.A(`0)" />
was used to create the <see cref="T:Cadenza.Either{T1,T2}" /> instance), then
<paramref name="a" /> (the first delegate parameter) will be invoked to
convert the <typeparamref name="T1" /> into a
<typeparamref name="TResult" />.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="a" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="b" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.Either`2.GetHashCode">
<summary>
Generates a hash code for the current instance.
</summary>
<returns>
A <see cref="T:System.Int32" /> containing the hash code for this instance.
</returns>
<remarks>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.GetHashCode" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`2.op_Implicit(``10T1`1``10`1)~``10Cadenza`1``10`1.``10Either`1``10`1{``10T1`1``10`1,``10T2`1``10`1}">
<param name="value">
A <typeparamref name="T1" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2}.A(`0)" />
</member>
<member name="M:Cadenza.Either`2.op_Implicit(``10T2`1``10`1)~``10Cadenza`1``10`1.``10Either`1``10`1{``10T1`1``10`1,``10T2`1``10`1}">
<param name="value">
A <typeparamref name="T2" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2}" /> instance which
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2}.B(`1)" />
</member>
<member name="T:Cadenza.Either`3">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<typeparam name="T3">
The third value type.
</typeparam>
<summary>
A union of 3 values.
</summary>
<remarks>
<para>
An <c>Either</c> is an immutable, strongly typed union of variously
typed values with each value lacking an otherwise meaningful name aside
from its position, which is not exposed. It stores only one (non-null)
value from a set of types (as determined by the type parameter list).
</para>
<para>
The value held by a <see cref="T:Cadenza.Either{T1, T2, T3}" /> instance
can be converted into a value by using the
<see cref="M:Cadenza.Either{T1, T2, T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" /> method.
<c>Fold</c> takes a list of delegates to perform the conversion; the
delegate used to perform the conversion is based upon the internal
position of the value stored.
</para>
<para>
<c>Either</c> instances are created through one of the following
creation methods:
</para>
<list type="bullet">
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.A(`0)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.op_Implicit(`0)~Cadenza.Either{`0,`1,`2}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.B(`1)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.op_Implicit(`1)~Cadenza.Either{`0,`1,`2}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.C(`2)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3}.op_Implicit(`2)~Cadenza.Either{`0,`1,`2}" />
</term>
</item>
</list>
<code lang="C#">
var a = Either&lt;double, string&gt;.A (Math.PI); // value stored in 1st position
int r = a.Fold (
v =&gt; (int) v, // 1st position converter
v =&gt; v.Length); // 2nd position converter
Console.WriteLine (r); // prints 3</code>
</remarks>
</member>
<member name="M:Cadenza.Either`3.A(```210T1`2``21`2```210`2``21`2)">
<param name="value">
A <typeparamref name="T1" /> containing the value
to provide to the first
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which holds a
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance
will invoke the first delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`3.B(```210T2`2``21`2```210`2``21`2)">
<param name="value">
A <typeparamref name="T2" /> containing the value
to provide to the second
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which holds a
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance
will invoke the second delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`3.C(```210T3`2``21`2```210`2``21`2)">
<param name="value">
A <typeparamref name="T3" /> containing the value
to provide to the third
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T3" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which holds a
holds a <typeparamref name="T3" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance
will invoke the third delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`3.Equals(```210Cadenza`2``21`2```210`2``21`2.```210Either`2``21`2```210`2``21`2{```210T1`2``21`2```210`2``21`2,```210T2`2``21`2```210`2``21`2,```210T3`2``21`2```210`2``21`2})">
<param name="obj">
A <see cref="T:Cadenza.Either{T1,T2,T3}" />to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified <see cref="T:Cadenza.Either{T1,T2,T3}" /> have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`3.Equals(```210System`2``21`2```210`2``21`2.```210Object`2``21`2```210`2``21`2)">
<param name="obj">
A <see cref="T:System.Object" /> to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified object have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if <paramref name="obj" /> is a
<see cref="T:Cadenza.Either{T1,T2,T3}" /> and each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.Equals(System.Object)" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`3.Fold``1(```210System`2``21`2```210`2``21`2.```210Func`2``21`2```210`2``21`2{```210T1`2``21`2```210`2``21`2,```210TResult`2``21`2```210`2``21`2},```210System`2``21`2```210`2``21`2.```210Func`2``21`2```210`2``21`2{```210T2`2``21`2```210`2``21`2,```210TResult`2``21`2```210`2``21`2},```210System`2``21`2```210`2``21`2.```210Func`2``21`2```210`2``21`2{```210T3`2``21`2```210`2``21`2,```210TResult`2``21`2```210`2``21`2})">
<typeparam name="TResult">
The type to convert the <see cref="T:Cadenza.Either{T1,T2,T3}" /> to.
</typeparam>
<param name="a">
A <see cref="T:System.Func{T1,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3}" /> stores a
<typeparamref name="T1" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="b">
A <see cref="T:System.Func{T2,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3}" /> stores a
<typeparamref name="T2" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="c">
A <see cref="T:System.Func{T3,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3}" /> stores a
<typeparamref name="T3" /> value into a
<typeparamref name="TResult" /> value.
</param>
<summary>
Converts a <see cref="T:Cadenza.Either{T1,T2,T3}" /> into a <typeparamref name="TResult" /> value.
</summary>
<returns>
A <typeparamref name="TResult" /> as generated by one
of the conversion delegate parameters.
</returns>
<remarks>
<para>
Converts a <see cref="T:Cadenza.Either{T1,T2,T3}" /> into a <typeparamref name="TResult" />
by invoking one of the provided delegate parameters.
</para>
<para>
The parameter which is invoked is predicated upon the internal position of
the value held. For example, if the internal value is in the first position
(i.e. <see cref="M:Cadenza.Either{T1,T2,T3}.A(`0)" />
was used to create the <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance), then
<paramref name="a" /> (the first delegate parameter) will be invoked to
convert the <typeparamref name="T1" /> into a
<typeparamref name="TResult" />.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="a" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="b" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="c" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.Either`3.GetHashCode">
<summary>
Generates a hash code for the current instance.
</summary>
<returns>
A <see cref="T:System.Int32" /> containing the hash code for this instance.
</returns>
<remarks>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.GetHashCode" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`3.op_Implicit(```210T1`2``21`2```210`2``21`2)~```210Cadenza`2``21`2```210`2``21`2.```210Either`2``21`2```210`2``21`2{```210T1`2``21`2```210`2``21`2,```210T2`2``21`2```210`2``21`2,```210T3`2``21`2```210`2``21`2}">
<param name="value">
A <typeparamref name="T1" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3}.A(`0)" />
</member>
<member name="M:Cadenza.Either`3.op_Implicit(```210T2`2``21`2```210`2``21`2)~```210Cadenza`2``21`2```210`2``21`2.```210Either`2``21`2```210`2``21`2{```210T1`2``21`2```210`2``21`2,```210T2`2``21`2```210`2``21`2,```210T3`2``21`2```210`2``21`2}">
<param name="value">
A <typeparamref name="T2" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3}.B(`1)" />
</member>
<member name="M:Cadenza.Either`3.op_Implicit(```210T3`2``21`2```210`2``21`2)~```210Cadenza`2``21`2```210`2``21`2.```210Either`2``21`2```210`2``21`2{```210T1`2``21`2```210`2``21`2,```210T2`2``21`2```210`2``21`2,```210T3`2``21`2```210`2``21`2}">
<param name="value">
A <typeparamref name="T3" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T3" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3}" /> instance which
holds a <typeparamref name="T3" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3}.C(`2)" />
</member>
<member name="T:Cadenza.Either`4">
<typeparam name="T1">
The first value type.
</typeparam>
<typeparam name="T2">
The second value type.
</typeparam>
<typeparam name="T3">
The third value type.
</typeparam>
<typeparam name="T4">
The fourth value type.
</typeparam>
<summary>
A union of 4 values.
</summary>
<remarks>
<para>
An <c>Either</c> is an immutable, strongly typed union of variously
typed values with each value lacking an otherwise meaningful name aside
from its position, which is not exposed. It stores only one (non-null)
value from a set of types (as determined by the type parameter list).
</para>
<para>
The value held by a <see cref="T:Cadenza.Either{T1, T2, T3, T4}" /> instance
can be converted into a value by using the
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" /> method.
<c>Fold</c> takes a list of delegates to perform the conversion; the
delegate used to perform the conversion is based upon the internal
position of the value stored.
</para>
<para>
<c>Either</c> instances are created through one of the following
creation methods:
</para>
<list type="bullet">
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.A(`0)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.op_Implicit(`0)~Cadenza.Either{`0,`1,`2,`3}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.B(`1)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.op_Implicit(`1)~Cadenza.Either{`0,`1,`2,`3}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.C(`2)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.op_Implicit(`2)~Cadenza.Either{`0,`1,`2,`3}" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.D(`3)" />
</term>
</item>
<item>
<term>
<see cref="M:Cadenza.Either{T1, T2, T3, T4}.op_Implicit(`3)~Cadenza.Either{`0,`1,`2,`3}" />
</term>
</item>
</list>
<code lang="C#">
var a = Either&lt;double, string&gt;.A (Math.PI); // value stored in 1st position
int r = a.Fold (
v =&gt; (int) v, // 1st position converter
v =&gt; v.Length); // 2nd position converter
Console.WriteLine (r); // prints 3</code>
</remarks>
</member>
<member name="M:Cadenza.Either`4.A(````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)">
<param name="value">
A <typeparamref name="T1" /> containing the value
to provide to the first
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which holds a
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance
will invoke the first delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`4.B(````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)">
<param name="value">
A <typeparamref name="T2" /> containing the value
to provide to the second
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which holds a
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance
will invoke the second delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`4.C(````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)">
<param name="value">
A <typeparamref name="T3" /> containing the value
to provide to the third
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T3" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which holds a
holds a <typeparamref name="T3" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance
will invoke the third delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`4.D(````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)">
<param name="value">
A <typeparamref name="T4" /> containing the value
to provide to the fourth
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
delegate.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T4" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which holds a
holds a <typeparamref name="T4" /> value.
</returns>
<remarks>
<para>
When
<see cref="M:Cadenza.Either{T1,T2,T3,T4}.Fold``1(System.Func{`0,``0},System.Func{`1,``0},System.Func{`2,``0},System.Func{`3,``0})" />
is invoked,
the returned <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance
will invoke the fourth delegate
for conversions.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.Either`4.Equals(````3210Cadenza`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Either`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3})">
<param name="obj">
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" />to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`4.Equals(````3210System`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Object`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)">
<param name="obj">
A <see cref="T:System.Object" /> to compare this instance against.
</param>
<summary>
Determines whether the current instance and the specified object have the same value.
</summary>
<returns>
<para>
<see langword="true" /> if <paramref name="obj" /> is a
<see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> and each member of <paramref name="obj" />
and the current instance have the same value (according to
<see cref="M:System.Object.Equals(System.Object)" />); otherwise
<see langword="false" /> is returned.
</para>
</returns>
<remarks>
<para>
This method checks for value equality
(<see cref="M:System.Object.Equals(System.Object)" />), as defined by each
value type.
</para>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.Equals(System.Object)" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`4.Fold``1(````3210System`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Func`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210TResult`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3},````3210System`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Func`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210TResult`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3},````3210System`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Func`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210TResult`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3},````3210System`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Func`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210TResult`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3})">
<typeparam name="TResult">
The type to convert the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> to.
</typeparam>
<param name="a">
A <see cref="T:System.Func{T1,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> stores a
<typeparamref name="T1" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="b">
A <see cref="T:System.Func{T2,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> stores a
<typeparamref name="T2" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="c">
A <see cref="T:System.Func{T3,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> stores a
<typeparamref name="T3" /> value into a
<typeparamref name="TResult" /> value.
</param>
<param name="d">
A <see cref="T:System.Func{T4,TResult}" />
used if the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> stores a
<typeparamref name="T4" /> value into a
<typeparamref name="TResult" /> value.
</param>
<summary>
Converts a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> into a <typeparamref name="TResult" /> value.
</summary>
<returns>
A <typeparamref name="TResult" /> as generated by one
of the conversion delegate parameters.
</returns>
<remarks>
<para>
Converts a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> into a <typeparamref name="TResult" />
by invoking one of the provided delegate parameters.
</para>
<para>
The parameter which is invoked is predicated upon the internal position of
the value held. For example, if the internal value is in the first position
(i.e. <see cref="M:Cadenza.Either{T1,T2,T3,T4}.A(`0)" />
was used to create the <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance), then
<paramref name="a" /> (the first delegate parameter) will be invoked to
convert the <typeparamref name="T1" /> into a
<typeparamref name="TResult" />.
</para>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="a" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="b" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="c" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="d" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.Either`4.GetHashCode">
<summary>
Generates a hash code for the current instance.
</summary>
<returns>
A <see cref="T:System.Int32" /> containing the hash code for this instance.
</returns>
<remarks>
<para>
<block subset="none" type="note">
This method overrides <see cref="M:System.Object.GetHashCode" />.
</block>
</para>
</remarks>
</member>
<member name="M:Cadenza.Either`4.op_Implicit(````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)~````3210Cadenza`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Either`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3}">
<param name="value">
A <typeparamref name="T1" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T1" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T1" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3,T4}.A(`0)" />
</member>
<member name="M:Cadenza.Either`4.op_Implicit(````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)~````3210Cadenza`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Either`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3}">
<param name="value">
A <typeparamref name="T2" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T2" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T2" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3,T4}.B(`1)" />
</member>
<member name="M:Cadenza.Either`4.op_Implicit(````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)~````3210Cadenza`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Either`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3}">
<param name="value">
A <typeparamref name="T3" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T3" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T3" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3,T4}.C(`2)" />
</member>
<member name="M:Cadenza.Either`4.op_Implicit(````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3)~````3210Cadenza`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3.````3210Either`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3{````3210T1`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T2`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T3`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3,````3210T4`3``32`3```321`3``32`3````3210`3``32`3```321`3``32`3}">
<param name="value">
A <typeparamref name="T4" /> containing the value to store.
</param>
<summary>
Creates a <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T4" /> value.
</summary>
<returns>
A <see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance which
holds a <typeparamref name="T4" /> value.
</returns>
<remarks>
<para>
This conversion operator is provided to make
<see cref="T:Cadenza.Either{T1,T2,T3,T4}" /> instance creation easier:
</para>
<code lang="C#">
Either&lt;int, double&gt; value = 42.0; // value stored in 2nd position</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="value" /> is <see langword="null" />.
</exception>
<altmember cref="M:Cadenza.Either{T1,T2,T3,T4}.D(`3)" />
</member>
<member name="T:Cadenza.EventHandlerCoda">
<summary>To be added.</summary>
<remarks>To be added.</remarks>
</member>
<member name="M:Cadenza.EventHandlerCoda.Raise(System.EventHandler,System.Object)">
<param name="self">To be added.</param>
<param name="sender">To be added.</param>
<summary>To be added.</summary>
<remarks>To be added.</remarks>
</member>
<member name="M:Cadenza.EventHandlerCoda.Raise(System.EventHandler,System.Object,System.EventArgs)">
<param name="self">To be added.</param>
<param name="sender">To be added.</param>
<param name="e">To be added.</param>
<summary>To be added.</summary>
<remarks>To be added.</remarks>
</member>
<member name="M:Cadenza.EventHandlerCoda.Raise(System.EventHandler,System.Object,System.Func{System.EventArgs})">
<param name="self">To be added.</param>
<param name="sender">To be added.</param>
<param name="creator">To be added.</param>
<summary>To be added.</summary>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">To be added; from: <see cref="M:Cadenza.EventHandlerCoda.Raise(System.EventHandler,System.Object,System.Func{System.EventArgs})" /></exception>
</member>
<member name="M:Cadenza.EventHandlerCoda.Raise``1(System.EventHandler{``0},System.Object,System.Func{``0})">
<typeparam name="T">To be added.</typeparam>
<param name="self">To be added.</param>
<param name="sender">To be added.</param>
<param name="creator">To be added.</param>
<summary>To be added.</summary>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">To be added; from: <see cref="M:Cadenza.EventHandlerCoda.Raise``1(System.EventHandler{``0},System.Object,System.Func{``0})" /></exception>
</member>
<member name="M:Cadenza.EventHandlerCoda.Raise``1(System.EventHandler{``0},System.Object,``0)">
<typeparam name="T">To be added.</typeparam>
<param name="self">To be added.</param>
<param name="sender">To be added.</param>
<param name="args">To be added.</param>
<summary>To be added.</summary>
<remarks>To be added.</remarks>
</member>
<member name="T:Cadenza.FuncCoda">
<summary>
Provides extension methods on <see cref="T:System.Action{T}" />,
<see cref="T:System.Func{T,TResult}" />, and related delegates.
</summary>
<remarks>
<para>
<see cref="T:Cadenza.FuncCoda" /> provides methods methods for:
</para>
<list type="bullet">
<item>
<term>
Delegate currying and partial application (<see cref="M:Cadenza.DelegateCoda.Curry" />)
</term>
</item>
<item>
<term>
Delegate composition (<see cref="M:Cadenza.DelegateCoda.Compose" />)
</term>
</item>
<item>
<term>
Timing generation (<see cref="M:Cadenza.DelegateCoda.Timings" />)
</term>
</item>
</list>
<para>
Currying via partial application is a way to easily transform
functions which accept N arguments into functions which accept
N-1 arguments, by "fixing" arguments with a value.
</para>
<code lang="C#">
// partial application:
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,int,int&gt; f_3 = function.Curry (3);
Func&lt;int&gt; f_321 = function.Curry (3, 2, 1);
Console.WriteLine (f_3 (2, 1)); // prints (3 + 2 + 1) == "6"
Console.WriteLine (f_321 ()); // prints (3 + 2 + 1) == "6"</code>
<para>
"Traditional" currying converts a delegate that accepts N arguments
into a delegate which accepts only one argument, but when invoked may
return a further delegate (etc.) until the final value is returned.
</para>
<code lang="C#">
// traditional currying:
Func&lt;int, Func&lt;int, Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Func&lt;int, Func&lt;int, int&gt;&gt; fc_1 = curry (1);
Func&lt;int, int&gt; fc_12 = fc_1 (2);
Console.WriteLine (fc_12 (3)); // prints (3 + 2 + 1) == "6"
Console.WriteLine (curry (3)(2)(1)); // prints (3 + 2 + 1) == "6"</code>
<para>
Composition is a way to easy chain (or pipe) together multiple delegates
so that the return value of a "composer" delegate is used as the input
parameter for the chained delegate:
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
<para>
All possible argument and return delegate permutations are provided
for the <see cref="T:System.Func{T,TResult}" /> and related types.
</para>
</remarks>
</member>
<member name="M:Cadenza.FuncCoda.Compose``2(System.Func{``0,``1},System.Func{``0})">
<typeparam name="T">
The <see cref="T:System.Func{T}" /> return type, and <see cref="T:System.Func{T,TResult}" /> argument type.
</typeparam>
<typeparam name="TResult">
The <see cref="T:System.Func{T,TResult}" /> return type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T,TResult}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Func{TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{TResult}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Compose``3(System.Func{``1,``2},System.Func{``0,``1})">
<typeparam name="T1">To be added.</typeparam>
<typeparam name="T2">
The <see cref="T:System.Func{T1,T2}" /> return type, and <see cref="T:System.Func{T2,TResult}" /> argument type.
</typeparam>
<typeparam name="TResult">
The <see cref="T:System.Func{T2,TResult}" /> return type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T2,TResult}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{T1,TResult}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Compose``4(System.Func{``2,``3},System.Func{``0,``1,``2})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3}" /> parameter type.
</typeparam>
<typeparam name="T2">To be added.</typeparam>
<typeparam name="T3">
The <see cref="T:System.Func{T1,T2,T3}" /> return type, and <see cref="T:System.Func{T3,TResult}" /> argument type.
</typeparam>
<typeparam name="TResult">
The <see cref="T:System.Func{T3,TResult}" /> return type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T3,TResult}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,T2,TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{T1,T2,TResult}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Compose``5(System.Func{``3,``4},System.Func{``0,``1,``2,``3})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Func{T1,T2,T3,T4}" /> parameter type.
</typeparam>
<typeparam name="T3">To be added.</typeparam>
<typeparam name="T4">
The <see cref="T:System.Func{T1,T2,T3,T4}" /> return type, and <see cref="T:System.Func{T4,TResult}" /> argument type.
</typeparam>
<typeparam name="TResult">
The <see cref="T:System.Func{T4,TResult}" /> return type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T4,TResult}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3,T4}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,T2,T3,TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{T1,T2,T3,TResult}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Compose``6(System.Func{``4,``5},System.Func{``0,``1,``2,``3,``4})">
<typeparam name="T1">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T2">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T3">
A <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> parameter type.
</typeparam>
<typeparam name="T4">To be added.</typeparam>
<typeparam name="T5">
The <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> return type, and <see cref="T:System.Func{T5,TResult}" /> argument type.
</typeparam>
<typeparam name="TResult">
The <see cref="T:System.Func{T5,TResult}" /> return type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T5,TResult}" /> to compose.
</param>
<param name="composer">
The <see cref="T:System.Func{T1,T2,T3,T4,T5}" /> to compose with <paramref name="self" />.
</param>
<summary>
Creates a <see cref="T:System.Func{T1,T2,T3,T4,TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{T1,T2,T3,T4,TResult}" /> which, when invoked, will
invoke <paramref name="composer" /> and pass the return value of
<paramref name="composer" /> to <paramref name="self" />.
</returns>
<remarks>
<para>
Composition is useful for chaining delegates together, so that the
return value of <paramref name="composer" /> is automatically used as
the input parameter for <paramref name="self" />.
</para>
<code lang="C#">
Func&lt;int,string&gt; tostring = Lambda.F ((int n) =&gt; n.ToString ());
Func&lt;int, int&gt; doubler = Lambda.F ((int n) =&gt; n * 2);
Func&lt;int, string&gt;
double_then_tostring = tostring.Compose (doubler);
Console.WriteLine (double_then_tostring (5));
// Prints "10";</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
<para>
<paramref name="self" /> is <see langword="null" />.
</para>
<para>-or-</para>
<para>
<paramref name="composer" /> is <see langword="null" />.
</para>
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Curry``2(System.Func{``0,``1})">
<typeparam name="T">
The first value type.
</typeparam>
<typeparam name="TResult">
The return value type.
</typeparam>
<param name="self">
The <see cref="T:System.Func{T,TResult}" /> to curry.
</param>
<summary>
Creates a <see cref="T:System.Func{T,TResult}" /> for currying.
</summary>
<returns>
A <see cref="T:System.Func{T,TResult}" /> which, when invoked, will
invoke <paramref name="self" />.
</returns>
<remarks>
<para>
This is the more "traditional" view of currying, turning a method
which takes <c>(X * Y)-&gt;Z</c> (i.e. separate arguments) into a
<c>X -&gt; (Y -&gt; Z)</c> (that is a "chain" of nested Funcs such that
you provide only one argument to each Func until you provide enough
arguments to invoke the original method).
</para>
<code lang="C#">
Func&lt;int,int,int,int&gt; function = (int a, int b, int c) =&gt; a + b + c;
Func&lt;int,Func&lt;int,Func&lt;int, int&gt;&gt;&gt; curry = function.Curry ();
Assert.AreEqual(6, curry (3)(2)(1));</code>
</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Curry``2(System.Func{``0,``1},Cadenza.Tuple{``0})">
<typeparam name="T">
A <see cref="T:System.Func{T,TResult}" /> parameter type.
</typeparam>
<typeparam name="TResult">To be added.</typeparam>
<param name="self">
The <see cref="T:System.Func{T,TResult}" /> to curry.
</param>
<param name="values">
A value of type <see cref="T:Cadenza.Tuple{T}" /> which contains the values to fix.
</param>
<summary>
Creates a <see cref="T:System.Func{TResult}" /> delegate.
</summary>
<returns>
Returns a <see cref="T:System.Func{TResult}" /> which, when invoked, will
invoke <paramref name="self" /> along with the provided fixed parameters.
</returns>
<remarks>To be added.</remarks>
<exception cref="T:System.ArgumentNullException">
if <paramref name="self" /> is <see langword="null" />.
</exception>
</member>
<member name="M:Cadenza.FuncCoda.Curry``2(System.Func{``0,``1},``0)">
<typeparam name="T">
A <see cref="T:System.Func{T,TResult}" /> parameter type.
</typeparam>
<typeparam name="TResult">To be added.</typeparam>
<param name="self">
The <see cref="T:System.Func{T,TResult}" /> to curry.
</param>
<param name=<