Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Move at_key/delete to from role to class (where they should be)
  • Loading branch information
lizmat committed Sep 11, 2013
1 parent 1980a70 commit 69c3cce
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 67 deletions.
39 changes: 0 additions & 39 deletions src/core/Baggy.pm
@@ -1,46 +1,7 @@
my role Baggy does Associative {
has %!elems; # key.WHICH => (key=>value)

#- specific methods for users of role ------------------------------------------
method BUILD (:%!elems) {}

method at_key($k) {
Proxy.new(
FETCH => {
my $key := $k.WHICH;
my $elems := nqp::getattr(self, KeyBag, '%!elems');
$elems.exists($key) ?? $elems{$key}.value !! 0;
},
STORE => -> $, $value {
if $value > 0 {
(nqp::getattr(self, KeyBag, '%!elems'){$k.WHICH}
//= ($k => 0)).value = $value;
}
elsif $value == 0 {
self.delete($k);
}
else {
fail "Cannot put negative value $value for $k in {self.^name}";
}
$value;
}
);
}

method delete($k) {
my $key := $k.WHICH;
my $elems := nqp::getattr(self, KeyBag, '%!elems');
if $elems.exists($key) {
my $value = $elems{$key}.value;
$elems.delete($key);
$value;
}
else {
0;
}
}
#-------------------------------------------------------------------------------

method default(--> Int) { 0 }
method keys { %!elems.values.map( {.key} ) }
method values { %!elems.values.map( {.value} ) }
Expand Down
36 changes: 36 additions & 0 deletions src/core/KeyBag.pm
@@ -1,5 +1,41 @@
my class KeyBag does Baggy {

method at_key($k) {
Proxy.new(
FETCH => {
my $key := $k.WHICH;
my $elems := nqp::getattr(self, KeyBag, '%!elems');
$elems.exists($key) ?? $elems{$key}.value !! 0;
},
STORE => -> $, $value {
if $value > 0 {
(nqp::getattr(self, KeyBag, '%!elems'){$k.WHICH}
//= ($k => 0)).value = $value;
}
elsif $value == 0 {
self.delete($k);
}
else {
fail "Cannot put negative value $value for $k in {self.^name}";
}
$value;
}
);
}

method delete($k) {
my $key := $k.WHICH;
my $elems := nqp::getattr(self, KeyBag, '%!elems');
if $elems.exists($key) {
my $value = $elems{$key}.value;
$elems.delete($key);
$value;
}
else {
0;
}
}

method Bag (:$view) {
if $view {
my $bag := nqp::create(Bag);
Expand Down
25 changes: 25 additions & 0 deletions src/core/KeySet.pm
@@ -1,5 +1,30 @@
my class KeySet does Setty {

method at_key($k --> Bool) {
Proxy.new(
FETCH => {
so nqp::getattr(self, KeySet, '%!elems').exists($k.WHICH);
},
STORE => -> $, $value {
if $value {
nqp::getattr(self, KeySet, '%!elems'){$k.WHICH} = $k;
}
else {
nqp::getattr(self, KeySet, '%!elems').delete($k.WHICH);
}
so $value;
});
}

method delete($k --> Bool) {
my $elems := nqp::getattr(self, KeySet, '%!elems');
my $key := $k.WHICH;
return False unless $elems.exists($key);

$elems.delete($key);
True;
}

method Set (:$view) {
if $view {
my $set := nqp::create(Set);
Expand Down
28 changes: 0 additions & 28 deletions src/core/Setty.pm
@@ -1,35 +1,7 @@
my role Setty does Associative {
has %!elems; # key.WHICH => key

#- specific methods for users of role ------------------------------------------
method BUILD (:%!elems) {}

method at_key($k --> Bool) {
Proxy.new(
FETCH => {
so nqp::getattr(self, KeySet, '%!elems').exists($k.WHICH);
},
STORE => -> $, $value {
if $value {
nqp::getattr(self, KeySet, '%!elems'){$k.WHICH} = $k;
}
else {
nqp::getattr(self, KeySet, '%!elems').delete($k.WHICH);
}
so $value;
});
}

method delete($k --> Bool) {
my $elems := nqp::getattr(self, KeySet, '%!elems');
my $key := $k.WHICH;
return False unless $elems.exists($key);

$elems.delete($key);
True;
}
#-------------------------------------------------------------------------------

method default(--> Bool) { False }
method keys { %!elems.values }
method values { True xx %!elems.elems }
Expand Down

0 comments on commit 69c3cce

Please sign in to comment.