Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # By Pseudon Mousie
- class SlidingWindowMap
- # Create a hash, with the keys as keys
- # The values will be the timestamps when the key was used.
- def initialize(keys, max_count, period_ms, verbose=false)
- @verbose = verbose
- @key_counts = Hash.new
- keys.each{|key|
- @key_counts[key] = []
- }
- @max_count = max_count
- # store period in floating point seconds to match Time objects
- @period_f_sec = period_ms / 1000.0
- puts "keycounts:#{@key_counts.inspect}..." if @verbose
- end
- def getNextKey()
- @key_counts.keys.each{|key|
- puts "checking #{key}..." if @verbose
- return key if has_uses_remaining?(key)
- }
- nil
- end
- # Calling this function counts as a "use"
- # unless there are no uses available.
- def has_uses_remaining?(key)
- times_used = @key_counts[key]
- # Clear out expired uses
- while !(times_used.empty?) && (times_used.first < Time.now)
- times_used.shift
- end
- if times_used.length < @max_count
- times_used.push(Time.now + @period_f_sec)
- return true
- else
- return false
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement