Skip to content

Commit

Permalink
Make roles Baggy / Setty (almost) completely self-contained
Browse files Browse the repository at this point in the history
Apparently, you cannot have a BUILD in the role, as it doesn't see its
own attributes, as they only exist when they're composed.
  • Loading branch information
lizmat committed Sep 7, 2013
1 parent 799989a commit 06622f7
Show file tree
Hide file tree
Showing 4 changed files with 69 additions and 61 deletions.
42 changes: 42 additions & 0 deletions src/core/Baggy.pm
Original file line number Diff line number Diff line change
@@ -1,6 +1,48 @@
my role Baggy does Associative {
has %!elems; # should be UInt

#- specific methods for users of role ------------------------------------------
submethod BUILD (:%elems) {
nqp::bindattr(self, KeyBag, '%!elems', %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: 0 additions & 36 deletions src/core/KeyBag.pm
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,6 @@ my class KeyBag does Baggy {
nqp::bindattr(self, KeyBag, '%!elems', %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 Bag { Bag.new-fp(nqp::getattr(self, KeyBag, '%!elems').values) }
method KeyBag { self }
}
25 changes: 0 additions & 25 deletions src/core/KeySet.pm
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,6 @@ my class KeySet does Setty {
nqp::bindattr(self, KeySet, '%!elems', %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 Set { Set.new(self.keys) }
method KeySet { self }
}
27 changes: 27 additions & 0 deletions src/core/Setty.pm
Original file line number Diff line number Diff line change
@@ -1,6 +1,33 @@
my role Setty does Associative {
has %!elems;

#- specific methods for users of role ------------------------------------------
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 06622f7

Please sign in to comment.