Skip to content

Instantly share code, notes, and snippets.

@julianrubisch
Last active June 11, 2021 09:49
Show Gist options
  • Save julianrubisch/5cbd3458fe214af1c5ab47c52e9cc803 to your computer and use it in GitHub Desktop.
Save julianrubisch/5cbd3458fe214af1c5ab47c52e9cc803 to your computer and use it in GitHub Desktop.
module YieldsMembers
module ClassMethods
mattr_accessor :method_names
def yields_members_for(*method_names)
self.method_names = method_names
end
end
def initialize(...)
super(...)
class_eval do
self.method_names.each do |method_name|
define_method method_name do |*members, &proc|
super members
proc&.call send(:members)
end
end
end
end
def self.prepended(base)
base.extend ClassMethods
end
end
class Kredis::Types::Set < Kredis::Types::Proxying
proxying :smembers, :sadd, :srem, :multi, :del, :sismember, :scard, :spop
prepend YieldsMembers
yields_members_for :add, :remove
attr_accessor :typed
def members
strings_to_types(smembers || [], typed).sort
end
alias to_a members
def add(*members)
sadd types_to_strings(members) if members.flatten.any?
end
alias << add
def remove(*members)
srem types_to_strings(members) if members.flatten.any?
end
def replace(*members)
multi do
del
add members
end
end
def include?(member)
sismember type_to_string(member)
end
def size
scard.to_i
end
def take
spop
end
def clear
del
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment