Created
July 18, 2022 16:04
-
-
Save JoshCheek/b20739908dd0b6c131eedcc0a41b7680 to your computer and use it in GitHub Desktop.
Just an idea about how to memoize some calculations
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class MemoizedToggles | |
attr_reader :memoizations | |
def initialize(&constructor) | |
@constructor = constructor | |
@memoizations = ObjectSpace::WeakMap.new | |
end | |
def enabled?(user, toggle) | |
@memoizations[user] ||= Hash.new do |hash, key| | |
hash[:toggle] = @constructor[user] unless hash.key? :toggle | |
hash[key] = hash[:toggle].enabled? key | |
end | |
@memoizations[user][toggle] | |
end | |
end | |
class Toggles | |
def self.enabled?(user, toggle) | |
memoized.enabled? user, toggle | |
end | |
def self.memoized | |
@memoized ||= MemoizedToggles.new { |user| new user } | |
end | |
# just a stub definition, we will say it is enabled if the user, a string, | |
# contains the toggle name as a substring | |
def initialize(user) | |
@user = user | |
end | |
def enabled?(toggle) | |
toggle # => "j", "J", "garbage-collected", "j", "J" | |
@user.include? toggle | |
end | |
end | |
user = 'josh' | |
# second invocations here will be returned from the memo | |
Toggles.enabled? user, 'j' # => true | |
Toggles.enabled? user, 'j' # => true | |
Toggles.enabled? user, 'J' # => false | |
Toggles.enabled? user, 'J' # => false | |
GC.start | |
Toggles.enabled? user, 'garbage-collected' | |
# The memoization got GC'd b/c there is no reference to the hash storing this | |
# user's memoizations, so now we will it re-query "j" and "J" | |
Toggles.enabled? user, 'j' # => true | |
Toggles.enabled? user, 'j' # => true | |
Toggles.enabled? user, 'J' # => false | |
Toggles.enabled? user, 'J' # => false | |
# Could possiby be improved by storing the memoization hash as an ivar on the | |
# user because then it wouldn't invalidate the user's cache unless the user got GC'd. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment