/
Setty.pm
77 lines (70 loc) · 2.24 KB
/
Setty.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
my role Setty does QuantHash {
has %!elems; # key.WHICH => key
method BUILD (:%!elems) {}
method default(--> Bool) { False }
method keys { %!elems.values }
method values { True xx %!elems.elems }
method elems(--> Int) { %!elems.elems }
method total(--> Int) { %!elems.elems }
method exists ($k --> Bool) { # is DEPRECATED doesn't work in settings
DEPRECATED("the :exists adverb");
self.exists_key($k);
}
method exists_key($k --> Bool) {
so nqp::existskey(%!elems, nqp::unbox_s($k.WHICH));
}
method Bool { %!elems.Bool }
method hash(--> Hash) {
my %e;
%e{$_} = True for %!elems.values;
%e;
}
method new(*@args --> Setty) {
my %e = (); # need (), otherwise Set.new<a>:exists fails
%e{$_.WHICH} = $_ for @args;
self.bless(:elems(%e));
}
method new-fp(*@pairs --> Setty) {
my %e;
for @pairs {
when Pair {
%e{.key.WHICH} //= $_.key if .value;
}
default {
%e{.WHICH} //= $_;
}
}
self.bless(:elems(%e));
}
method ACCEPTS($other) {
self.defined
?? $other (<=) self && self (<=) $other
!! $other.^does(self);
}
multi method Str(Setty:D $ : --> Str) { ~ %!elems.values }
multi method gist(Setty:D $ : --> Str) {
my $name := self.^name;
( $name eq 'Set' ?? 'set' !! "$name.new" )
~ '('
~ %!elems.values.map( {.gist} ).join(', ')
~ ')';
}
multi method perl(Setty:D $ : --> Str) {
my $name := self.^name;
( $name eq 'Set' ?? 'set' !! "$name.new" )
~ '('
~ %!elems.values.map( {.perl} ).join(',')
~ ')';
}
method list() { %!elems.values }
method pairs() { %!elems.values.map({ $_ => True }) }
method grab($count = 1) {
(%!elems{ %!elems.keys.pick($count) }:delete).list;
}
method grabpairs($count = 1) {
(%!elems{ %!elems.keys.pick($count) }:delete).map( { ($_=>True) } );
}
method pick($count = 1) { %!elems.values.pick($count) }
method roll($count = 1) { %!elems.values.roll($count) }
# TODO: WHICH will require the capability for >1 pointer in ObjAt
}