// 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; } public override bool Equals(object other) { if (other == null) return false; if (!(other is Tuple)) return false; var t = (Tuple)other; if (!EqualityComparer.Default.Equals(t.Value1, this.Value1)) return false; if (!EqualityComparer.Default.Equals(t.Value2, this.Value2)) return false; return true; } public override int GetHashCode() { unchecked { int hash = 983; hash = hash * 457 + base.GetHashCode(); if (this.Value1 != null) hash = hash * 457 + this.Value1.GetHashCode(); if (this.Value2 != null) hash = hash * 457 + this.Value2.GetHashCode(); return hash; } } } /// /// 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; } public override bool Equals(object other) { if (other == null) return false; if (!(other is Tuple)) return false; var t = (Tuple)other; if (!EqualityComparer.Default.Equals(t.Value1, this.Value1)) return false; if (!EqualityComparer.Default.Equals(t.Value2, this.Value2)) return false; if (!EqualityComparer.Default.Equals(t.Value3, this.Value3)) return false; return true; } public override int GetHashCode() { unchecked { int hash = 983; hash = hash * 457 + base.GetHashCode(); if (this.Value1 != null) hash = hash * 457 + this.Value1.GetHashCode(); if (this.Value2 != null) hash = hash * 457 + this.Value2.GetHashCode(); if (this.Value3 != null) hash = hash * 457 + this.Value3.GetHashCode(); return hash; } } } /// /// 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; } public override bool Equals(object other) { if (other == null) return false; if (!(other is Tuple)) return false; var t = (Tuple)other; if (!EqualityComparer.Default.Equals(t.Value1, this.Value1)) return false; if (!EqualityComparer.Default.Equals(t.Value2, this.Value2)) return false; if (!EqualityComparer.Default.Equals(t.Value3, this.Value3)) return false; if (!EqualityComparer.Default.Equals(t.Value4, this.Value4)) return false; return true; } public override int GetHashCode() { unchecked { int hash = 983; hash = hash * 457 + base.GetHashCode(); if (this.Value1 != null) hash = hash * 457 + this.Value1.GetHashCode(); if (this.Value2 != null) hash = hash * 457 + this.Value2.GetHashCode(); if (this.Value3 != null) hash = hash * 457 + this.Value3.GetHashCode(); if (this.Value4 != null) hash = hash * 457 + this.Value4.GetHashCode(); return hash; } } } /// /// 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); } } }