// https://g...content-available-to-author-only...b.com/koropicot/6483060
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PartialApply
{
class Program
{
static void Main(string[] args)
{
var func = (Func<string, string, string, string, string>)((s1, s2, s3, s4) => string.Join(" ",new[]{s1,s2,s3,s4}));
var funcPartialApplied = func.Curry()("My")._()("is")._().Uncurry();
Console.WriteLine(funcPartialApplied("name","koropicot"));
}
}
public delegate TResult PartialApply<T,TResult>(T arg);
public static class PartialApply
{
//1引数関数
public static Func<T_, TResult> _<T_, TResult>(
this Func<T_, TResult> func)
{
return func;
}
//2引数関数
public static Func<T1,Func<T_,TResult>> _<T_,T1,TResult>(
this Func<T_,Func<T1,TResult>> func)
{
return v1 => _ => func(_)(v1);
}
//3引数関数
public static Func<T1,Func<T2, Func<T_, TResult>>> _<T_, T1, T2, TResult>(
this Func<T_, Func<T1,Func<T2, TResult>>> func)
{
return v1 => v2 => _ => func(_)(v1)(v2);
}
//4引数関数
public static Func<T1, Func<T2,Func<T3, PartialApply<T_, TResult>>>> _<T_, T1, T2, T3, TResult>
(this Func<T_, Func<T1, Func<T2,Func<T3, TResult>>>> func)
{
return v1 => v2 => v3 => _ => func(_)(v1)(v2)(v3);
}
}
public static class Func
{
public static Func<T1, Func<T2, TResult>> Curry<T1, T2, TResult>(this Func<T1, T2, TResult> func)
{
return v1 => v2 => func(v1, v2);
}
public static Func<T1, T2, TResult> Uncurry<T1, T2, TResult>(this Func<T1, Func<T2, TResult>> func)
{
return (v1, v2) => func(v1)(v2);
}
public static Func<T1, Func<T2, Func<T3, TResult>>> Curry<T1, T2, T3, TResult>(this Func<T1, T2, T3, TResult> func)
{
return v1 => v2 => v3 => func(v1, v2, v3);
}
public static Func<T1, T2, T3, TResult> Uncurry<T1, T2, T3, TResult>(this Func<T1, Func<T2, Func<T3, TResult>>> func)
{
return (v1, v2, v3) => func(v1)(v2)(v3);
}
public static Func<T1, Func<T2, Func<T3, Func<T4, TResult>>>> Curry<T1, T2, T3, T4, TResult>(this Func<T1, T2, T3, T4, TResult> func)
{
return v1 => v2 => v3 => v4 => func(v1, v2, v3, v4);
}
public static Func<T1, T2, T3, T4, TResult> Uncurry<T1, T2, T3, T4, TResult>(this Func<T1, Func<T2, Func<T3, Func<T4, TResult>>>> func)
{
return (v1, v2, v3, v4) => func(v1)(v2)(v3)(v4);
}
}
}
Ly8gaHR0cHM6Ly9nLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5iLmNvbS9rb3JvcGljb3QvNjQ4MzA2MAoKdXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKdXNpbmcgU3lzdGVtLkxpbnE7CnVzaW5nIFN5c3RlbS5UZXh0OwoKbmFtZXNwYWNlIFBhcnRpYWxBcHBseQp7CiAgICBjbGFzcyBQcm9ncmFtCiAgICB7CiAgICAgICAgc3RhdGljIHZvaWQgTWFpbihzdHJpbmdbXSBhcmdzKQogICAgICAgIHsKICAgICAgICAgICAgdmFyIGZ1bmMgPSAoRnVuYzxzdHJpbmcsIHN0cmluZywgc3RyaW5nLCBzdHJpbmcsIHN0cmluZz4pKChzMSwgczIsIHMzLCBzNCkgPT4gc3RyaW5nLkpvaW4oIiAiLG5ld1tde3MxLHMyLHMzLHM0fSkpOwogICAgICAgICAgICB2YXIgZnVuY1BhcnRpYWxBcHBsaWVkID0gZnVuYy5DdXJyeSgpKCJNeSIpLl8oKSgiaXMiKS5fKCkuVW5jdXJyeSgpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZShmdW5jUGFydGlhbEFwcGxpZWQoIm5hbWUiLCJrb3JvcGljb3QiKSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBkZWxlZ2F0ZSBUUmVzdWx0IFBhcnRpYWxBcHBseTxULFRSZXN1bHQ+KFQgYXJnKTsKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFydGlhbEFwcGx5CiAgICB7CiAgICAgICAgLy8x5byV5pWw6Zai5pWwCiAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jPFRfLCBUUmVzdWx0PiBfPFRfLCBUUmVzdWx0PigKICAgICAgICAgICAgdGhpcyBGdW5jPFRfLCBUUmVzdWx0PiBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgICAgfQogICAgICAgIC8vMuW8leaVsOmWouaVsAogICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuYzxUMSxGdW5jPFRfLFRSZXN1bHQ+PiBfPFRfLFQxLFRSZXN1bHQ+KAogICAgICAgICAgICB0aGlzIEZ1bmM8VF8sRnVuYzxUMSxUUmVzdWx0Pj4gZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB2MSA9PiBfID0+IGZ1bmMoXykodjEpOwogICAgICAgIH0KICAgICAgICAvLzPlvJXmlbDplqLmlbAKICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmM8VDEsRnVuYzxUMiwgRnVuYzxUXywgVFJlc3VsdD4+PiBfPFRfLCBUMSwgVDIsIFRSZXN1bHQ+KAogICAgICAgICAgICB0aGlzIEZ1bmM8VF8sIEZ1bmM8VDEsRnVuYzxUMiwgVFJlc3VsdD4+PiBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHYxID0+IHYyID0+IF8gPT4gZnVuYyhfKSh2MSkodjIpOwogICAgICAgIH0KICAgICAgICAvLzTlvJXmlbDplqLmlbAKICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmM8VDEsIEZ1bmM8VDIsRnVuYzxUMywgUGFydGlhbEFwcGx5PFRfLCBUUmVzdWx0Pj4+PiBfPFRfLCBUMSwgVDIsIFQzLCBUUmVzdWx0PgogICAgICAgICAgICAodGhpcyBGdW5jPFRfLCBGdW5jPFQxLCBGdW5jPFQyLEZ1bmM8VDMsIFRSZXN1bHQ+Pj4+IGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdjEgPT4gdjIgPT4gdjMgPT4gXyA9PiBmdW5jKF8pKHYxKSh2MikodjMpOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZ1bmMKICAgIHsKICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmM8VDEsIEZ1bmM8VDIsIFRSZXN1bHQ+PiBDdXJyeTxUMSwgVDIsIFRSZXN1bHQ+KHRoaXMgRnVuYzxUMSwgVDIsIFRSZXN1bHQ+IGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gdjEgPT4gdjIgPT4gZnVuYyh2MSwgdjIpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jPFQxLCBUMiwgVFJlc3VsdD4gVW5jdXJyeTxUMSwgVDIsIFRSZXN1bHQ+KHRoaXMgRnVuYzxUMSwgRnVuYzxUMiwgVFJlc3VsdD4+IGZ1bmMpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gKHYxLCB2MikgPT4gZnVuYyh2MSkodjIpOwogICAgICAgIH0KCiAgICAgICAgcHVibGljIHN0YXRpYyBGdW5jPFQxLCBGdW5jPFQyLCBGdW5jPFQzLCBUUmVzdWx0Pj4+IEN1cnJ5PFQxLCBUMiwgVDMsIFRSZXN1bHQ+KHRoaXMgRnVuYzxUMSwgVDIsIFQzLCBUUmVzdWx0PiBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHYxID0+IHYyID0+IHYzID0+IGZ1bmModjEsIHYyLCB2Myk7CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgc3RhdGljIEZ1bmM8VDEsIFQyLCBUMywgVFJlc3VsdD4gVW5jdXJyeTxUMSwgVDIsIFQzLCBUUmVzdWx0Pih0aGlzIEZ1bmM8VDEsIEZ1bmM8VDIsIEZ1bmM8VDMsIFRSZXN1bHQ+Pj4gZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAodjEsIHYyLCB2MykgPT4gZnVuYyh2MSkodjIpKHYzKTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuYzxUMSwgRnVuYzxUMiwgRnVuYzxUMywgRnVuYzxUNCwgVFJlc3VsdD4+Pj4gQ3Vycnk8VDEsIFQyLCBUMywgVDQsIFRSZXN1bHQ+KHRoaXMgRnVuYzxUMSwgVDIsIFQzLCBUNCwgVFJlc3VsdD4gZnVuYykKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiB2MSA9PiB2MiA9PiB2MyA9PiB2NCA9PiBmdW5jKHYxLCB2MiwgdjMsIHY0KTsKICAgICAgICB9CgogICAgICAgIHB1YmxpYyBzdGF0aWMgRnVuYzxUMSwgVDIsIFQzLCBUNCwgVFJlc3VsdD4gVW5jdXJyeTxUMSwgVDIsIFQzLCBUNCwgVFJlc3VsdD4odGhpcyBGdW5jPFQxLCBGdW5jPFQyLCBGdW5jPFQzLCBGdW5jPFQ0LCBUUmVzdWx0Pj4+PiBmdW5jKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICh2MSwgdjIsIHYzLCB2NCkgPT4gZnVuYyh2MSkodjIpKHYzKSh2NCk7CiAgICAgICAgfQogICAgfQp9