Last active
June 11, 2021 09:49
-
-
Save julianrubisch/5cbd3458fe214af1c5ab47c52e9cc803 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
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