Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Make SetHash.pairs/values/kv left-valuable
Which means, that if you assign a False value to it, the key will
be removed from the SetHash.  Just like setting the value to 0 with
BagHash and MixHash.
  • Loading branch information
lizmat committed Oct 6, 2015
1 parent b6c528d commit e5612aa
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 5 deletions.
2 changes: 2 additions & 0 deletions src/core/Set.pm
Expand Up @@ -2,6 +2,8 @@ my class Set does Setty {
has Int $!total;
has $!WHICH;

method ISINSET(\key) { True }

method total (--> Int) { $!total //= %!elems.elems }
multi method WHICH (Set:D:) {
$!WHICH := self.^name ~ '|' ~ %!elems.keys.sort if !$!WHICH.defined;
Expand Down
10 changes: 10 additions & 0 deletions src/core/SetHash.pm
@@ -1,5 +1,15 @@
my class SetHash does Setty {

method ISINSET(\key) {
Proxy.new(
FETCH => { %!elems.EXISTS-KEY(key) },
STORE => -> $, \value {
%!elems.DELETE-KEY(key) unless value;
value;
}
);
}

method Set (:$view) {
if $view {
Set.bless( :elems(%!elems) );
Expand Down
20 changes: 15 additions & 5 deletions src/core/Setty.pm
Expand Up @@ -4,9 +4,21 @@ my role Setty does QuantHash {
submethod BUILD (:%!elems) { }
method default(--> Bool) { False }

multi method keys(Setty:D:) { %!elems.values }
multi method kv(Setty:D:) { flat %!elems.values X, True }
multi method values(Setty:D:) { True xx %!elems.elems }
multi method keys(Setty:D:) {
%!elems.values
}
multi method kv(Setty:D:) {
%!elems.values.map: -> \key { |(key,self.ISINSET(key.WHICH)) }
}
multi method values(Setty:D:) {
%!elems.values.map: -> \key { self.ISINSET(key.WHICH) }
}
multi method pairs(Setty:D:) {
%!elems.values.map: -> \key { Pair.new(key,self.ISINSET(key.WHICH)) }
}
multi method antipairs(Setty:D:) {
%!elems.values.map: -> \key { Pair.new(True,key) }
}

method elems(Setty:D: --> Int) { %!elems.elems }
method total(Setty:D: --> Int) { %!elems.elems }
Expand Down Expand Up @@ -60,8 +72,6 @@ my role Setty does QuantHash {
~ ')';
}

multi method pairs(Setty:D:) { %!elems.values.map: { $_ => True } }
multi method antipairs(Setty:D:) { %!elems.values.map: { True => $_ } }
method grab(Setty:D: $count = 1) {
(%!elems{ %!elems.keys.pick($count) }:delete).cache;
}
Expand Down

0 comments on commit e5612aa

Please sign in to comment.