// Attention : ce fichier a été automatiquement généré par un // template T4. Toute modification manuelle sera écrasée !!! using System; using System.Collections.Generic; namespace Developpez.Dotnet { public static partial class FuncExtensions { private struct Tuple { public readonly T1 Value1; public readonly T2 Value2; public Tuple(T1 value1, T2 value2) { this.Value1 = value1; this.Value2 = value2; } } /// /// Renvoie un wrapper de la fonction qui met en cache le résultat /// pour chaque ensemble de valeurs des arguments, de façon à n'appeler la fonction /// qu'une seule fois pour chaque ensemble de valeurs des arguments /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type de retour de la fonction /// La fonction à mettre en cache /// Une version de la fonction qui met en cache ses résultats public static Func AsCached(this Func function) { var cachedResults = new Dictionary, TResult>(); return (value1, value2) => { TResult result; var paramsTuple = new Tuple(value1, value2); lock(cachedResults) { if (!cachedResults.TryGetValue(paramsTuple, out result)) { result = function(value1, value2); cachedResults.Add(paramsTuple, result); } } return result; }; } private struct Tuple { public readonly T1 Value1; public readonly T2 Value2; public readonly T3 Value3; public Tuple(T1 value1, T2 value2, T3 value3) { this.Value1 = value1; this.Value2 = value2; this.Value3 = value3; } } /// /// Renvoie un wrapper de la fonction qui met en cache le résultat /// pour chaque ensemble de valeurs des arguments, de façon à n'appeler la fonction /// qu'une seule fois pour chaque ensemble de valeurs des arguments /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type de retour de la fonction /// La fonction à mettre en cache /// Une version de la fonction qui met en cache ses résultats public static Func AsCached(this Func function) { var cachedResults = new Dictionary, TResult>(); return (value1, value2, value3) => { TResult result; var paramsTuple = new Tuple(value1, value2, value3); lock(cachedResults) { if (!cachedResults.TryGetValue(paramsTuple, out result)) { result = function(value1, value2, value3); cachedResults.Add(paramsTuple, result); } } return result; }; } private struct Tuple { public readonly T1 Value1; public readonly T2 Value2; public readonly T3 Value3; public readonly T4 Value4; public Tuple(T1 value1, T2 value2, T3 value3, T4 value4) { this.Value1 = value1; this.Value2 = value2; this.Value3 = value3; this.Value4 = value4; } } /// /// Renvoie un wrapper de la fonction qui met en cache le résultat /// pour chaque ensemble de valeurs des arguments, de façon à n'appeler la fonction /// qu'une seule fois pour chaque ensemble de valeurs des arguments /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à mettre en cache /// Une version de la fonction qui met en cache ses résultats public static Func AsCached(this Func function) { var cachedResults = new Dictionary, TResult>(); return (value1, value2, value3, value4) => { TResult result; var paramsTuple = new Tuple(value1, value2, value3, value4); lock(cachedResults) { if (!cachedResults.TryGetValue(paramsTuple, out result)) { result = function(value1, value2, value3, value4); cachedResults.Add(paramsTuple, result); } } return result; }; } /// /// Renvoie une version curryfiée de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type de retour de la fonction /// La fonction à curryfier /// une version curryfiée de la fonction public static Func> Curry(this Func function) { return arg1 => arg2 => function(arg1, arg2); } /// /// Renvoie une version curryfiée de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// L'action à curryfier /// une version curryfiée de l'action public static Func> Curry(this Action action) { return arg1 => arg2 => action(arg1, arg2); } /// /// Renvoie une version curryfiée de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type de retour de la fonction /// La fonction à curryfier /// une version curryfiée de la fonction public static Func>> Curry(this Func function) { return arg1 => arg2 => arg3 => function(arg1, arg2, arg3); } /// /// Renvoie une version curryfiée de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// L'action à curryfier /// une version curryfiée de l'action public static Func>> Curry(this Action action) { return arg1 => arg2 => arg3 => action(arg1, arg2, arg3); } /// /// Renvoie une version curryfiée de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à curryfier /// une version curryfiée de la fonction public static Func>>> Curry(this Func function) { return arg1 => arg2 => arg3 => arg4 => function(arg1, arg2, arg3, arg4); } /// /// Renvoie une version curryfiée de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// L'action à curryfier /// une version curryfiée de l'action public static Func>>> Curry(this Action action) { return arg1 => arg2 => arg3 => arg4 => action(arg1, arg2, arg3, arg4); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le premier paramètre de la fonction /// une application partielle de la fonction public static Func ApplyFirst(this Func function, T1 firstArg) { return (secondArg) => function(firstArg, secondArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// L'action à appliquer partiellement /// La valeur fixe pour le premier paramètre de l'action /// une application partielle de l'action public static Action ApplyFirst(this Action action, T1 firstArg) { return (secondArg) => action(firstArg, secondArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le second paramètre de la fonction /// une application partielle de la fonction public static Func ApplySecond(this Func function, T2 secondArg) { return (firstArg) => function(firstArg, secondArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// L'action à appliquer partiellement /// La valeur fixe pour le second paramètre de l'action /// une application partielle de l'action public static Action ApplySecond(this Action action, T2 secondArg) { return (firstArg) => action(firstArg, secondArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le premier paramètre de la fonction /// une application partielle de la fonction public static Func ApplyFirst(this Func function, T1 firstArg) { return (secondArg, thirdArg) => function(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// L'action à appliquer partiellement /// La valeur fixe pour le premier paramètre de l'action /// une application partielle de l'action public static Action ApplyFirst(this Action action, T1 firstArg) { return (secondArg, thirdArg) => action(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le second paramètre de la fonction /// une application partielle de la fonction public static Func ApplySecond(this Func function, T2 secondArg) { return (firstArg, thirdArg) => function(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// L'action à appliquer partiellement /// La valeur fixe pour le second paramètre de l'action /// une application partielle de l'action public static Action ApplySecond(this Action action, T2 secondArg) { return (firstArg, thirdArg) => action(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le troisième paramètre de la fonction /// une application partielle de la fonction public static Func ApplyThird(this Func function, T3 thirdArg) { return (firstArg, secondArg) => function(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// L'action à appliquer partiellement /// La valeur fixe pour le troisième paramètre de l'action /// une application partielle de l'action public static Action ApplyThird(this Action action, T3 thirdArg) { return (firstArg, secondArg) => action(firstArg, secondArg, thirdArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le premier paramètre de la fonction /// une application partielle de la fonction public static Func ApplyFirst(this Func function, T1 firstArg) { return (secondArg, thirdArg, fourthArg) => function(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// L'action à appliquer partiellement /// La valeur fixe pour le premier paramètre de l'action /// une application partielle de l'action public static Action ApplyFirst(this Action action, T1 firstArg) { return (secondArg, thirdArg, fourthArg) => action(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le second paramètre de la fonction /// une application partielle de la fonction public static Func ApplySecond(this Func function, T2 secondArg) { return (firstArg, thirdArg, fourthArg) => function(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// L'action à appliquer partiellement /// La valeur fixe pour le second paramètre de l'action /// une application partielle de l'action public static Action ApplySecond(this Action action, T2 secondArg) { return (firstArg, thirdArg, fourthArg) => action(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le troisième paramètre de la fonction /// une application partielle de la fonction public static Func ApplyThird(this Func function, T3 thirdArg) { return (firstArg, secondArg, fourthArg) => function(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// L'action à appliquer partiellement /// La valeur fixe pour le troisième paramètre de l'action /// une application partielle de l'action public static Action ApplyThird(this Action action, T3 thirdArg) { return (firstArg, secondArg, fourthArg) => action(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de la fonction /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// Le type de retour de la fonction /// La fonction à appliquer partiellement /// La valeur fixe pour le quatrième paramètre de la fonction /// une application partielle de la fonction public static Func ApplyFourth(this Func function, T4 fourthArg) { return (firstArg, secondArg, thirdArg) => function(firstArg, secondArg, thirdArg, fourthArg); } /// /// Renvoie une application partielle de l'action /// /// Le type du paramètre 1 /// Le type du paramètre 2 /// Le type du paramètre 3 /// Le type du paramètre 4 /// L'action à appliquer partiellement /// La valeur fixe pour le quatrième paramètre de l'action /// une application partielle de l'action public static Action ApplyFourth(this Action action, T4 fourthArg) { return (firstArg, secondArg, thirdArg) => action(firstArg, secondArg, thirdArg, fourthArg); } } }