Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@colomon
Created January 31, 2012 18:22
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 colomon/1712021 to your computer and use it in GitHub Desktop.
Save colomon/1712021 to your computer and use it in GitHub Desktop.
class KeySet does Associative {
has Bool %!elems;
method delete-false {
for %!elems.keys -> $key {
%!elems{$key}:delete unless %!elems{$key};
}
}
method keys { self.delete-false; %!elems.keys }
method values { self.delete-false; %!elems.values }
method elems returns Int { self.delete-false; %!elems.elems }
method exists($a) returns Bool { %!elems.exists($a) && %!elems{$a} }
method Bool { self.delete-false; %!elems.Bool }
method Numeric { self.delete-false; %!elems.Numeric }
method hash { self.delete-false; %!elems.hash }
method postcircumfix:<{ }> ($k) {
%!elems{$k} = False unless %!elems{$k}:exists;
%!elems{$k};
}
# Constructor
method new(*@args --> KeySet) {
self.bless(*, :elems(%(@args X=> True)));
}
submethod BUILD (%!elems) { }
submethod Str(Any:D $ : --> Str) { self.delete-false; "set(< %!elems.keys() >)" }
submethod gist(Any:D $ : --> Str) { self.delete-false; "set({ %!elems.keys».gist.join(', ') })" }
submethod perl(Any:D $ : --> Str) { self.delete-false; 'set(' ~ join(', ', map { .perl }, %!elems.keys) ~ ')' }
method iterator() { self.delete-false; %!elems.keys.iterator }
method list() { self.delete-false; %!elems.keys }
method pick($arg) { self.delete-false; %!elems.keys.pick: $arg }
method roll($arg) { self.delete-false; %!elems.keys.roll: $arg }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment