[Feature request] Memoize+state arg
От: Sinix  
Дата: 22.12.16 17:56
Оценка:
Нашёлся сценарий, который не покрывается текущей реализацией Memoize:
нужно кэшировать тяжёлое вычисляемое значение, при этом процесс вычисления зависит от локального состояния, которое кэшировать нельзя. Например, нужна запись в лог, но сам логгер не должен выступать ключом для Memoize.

Собственно предложение: к Memoize добавить набор таких же перегрузок с именем MemoizeWithState.
Отличие — +1 аргумент TState (последний по порядку), который не будет использоваться в ключе LazyDictionary, только передаваться в factory-метод. Как пример:
double SlowCalcSomething(int arg1, int arg2, ILogger logger) => ...

// key is tuple(int,int)
Func<int, int, ILogger> _slowCalcMemoize = Algorithms.MemoizeWithState(
  (int arg1, int arg2, ILogger logger) => SlowCalcSomething(arg1, arg2, logger));


Проблемы:
* Под капотом придётся использовать ConcurrentDictionary, не LazyDiсtionary. Или каким-то образом прикрутить GetOrAdd в ILazyDictionary, что мне не очень нравится.
* Порядок аргументов — TState предполагается сделать последним. Вроде в большинстве случаев это ок, будут возражения — давайте.
* Только один параметр-состояние. Ну да, можно передавать тюплы, но как-то это криво. Зато на моей памяти это первый более-менее реальный сценарий для тюплов в public API


Минусов хватает, поэтому я не уверен, что оно нам вообще нужно. Если есть предложения, как ещё можно реализовать этот сценарий — вэлкам!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.