/
MixHash.pm
52 lines (48 loc) · 1.29 KB
/
MixHash.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
my class MixHash does Mixy {
method at_key($k) {
Proxy.new(
FETCH => {
my $key := $k.WHICH;
%!elems.exists_key($key) ?? %!elems{$key}.value !! 0;
},
STORE => -> $, $value {
if $value != 0 {
(%!elems{$k.WHICH} //= ($k => 0)).value = $value;
}
else {
self.delete_key($k);
}
$value;
}
);
}
method delete($k) { # is DEPRECATED doesn't work in settings
DEPRECATED('the :delete adverb with postcircumfix:<{ }>');
self.delete_key($k);
}
method delete_key($k) {
my $key := $k.WHICH;
if %!elems.exists_key($key) {
my $value = %!elems{$key}.value;
%!elems.delete_key($key);
$value;
}
else {
0;
}
}
method Mix (:$view) {
if $view {
my $mix := nqp::create(Mix);
$mix.BUILD( :elems(%!elems) );
$mix;
}
else {
Mix.new-fp(%!elems.values);
}
}
method MixHash { self }
method Bag { Bag.new-fp(%!elems.values) }
method BagHash { BagHash.new-fp(%!elems.values) }
}
# vim: ft=perl6 expandtab sw=4