Skip to content

Instantly share code, notes, and snippets.

@JoshCheek
Created July 18, 2022 16:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JoshCheek/b20739908dd0b6c131eedcc0a41b7680 to your computer and use it in GitHub Desktop.
Save JoshCheek/b20739908dd0b6c131eedcc0a41b7680 to your computer and use it in GitHub Desktop.
Just an idea about how to memoize some calculations
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