Sha256: ed7e58e3ba98e60330e7451de050f1bac284761ec9a8585f4b294817d38dc572
Contents?: true
Size: 1.76 KB
Versions: 2
Compression:
Stored size: 1.76 KB
Contents
# frozen_string_literal: true class MemoizeUntil class Store attr_reader :_store, :_kind, :_mutex def initialize(kind) @_store = {} @_kind = kind @_mutex = Mutex.new end # returns the value from memory if already memoized for "now" for the given key # else evaluates the block and memoizes that # caches nils too def fetch(key) now = Time.now.public_send(_kind) value = get(key, now) if value.nil? clear_all(key) value = set(key, now, set_nil(yield)) end unset_nil(value) end # add runtime keys def add(key) _mutex.synchronize do _store[key] ||= {} end end # clears all previously memoized values for the given key # only clears memory in the process that this code runs. # added for supporting fetch and custom scripts def clear_all(key) _mutex.synchronize do _store[key] = {} end end # clears previously memoized value for "now" for the given key # only clears memory in the process that this code runs on. # added for supporting custom scripts / test cases def clear_now(key) now = Time.now.public_send(_kind) set(key, now, nil) end private # caches nils through a pseudo object def set_nil(value) value.nil? ? NullObject.instance : value end # replaces cached pseudo object and returns nil def unset_nil(value) value.is_a?(NullObject) ? nil : value end def set(key, now, value) _mutex.synchronize do _store[key][now] = value end end def get(key, now) _mutex.synchronize do purpose = _store[key] raise NotImplementedError unless purpose purpose[now] end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
memoize_until-1.3.2 | lib/memoize_until/store.rb |
memoize_until-1.3.1 | lib/memoize_until/store.rb |