-
-
Notifications
You must be signed in to change notification settings - Fork 373
/
Bool.pm
106 lines (82 loc) · 3.37 KB
/
Bool.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
my class Bool {
multi method Bool(Bool:D:) { self }
multi method Numeric(Bool:D:) { self ?? 1 !! 0 }
multi method Str(Bool:D:) { self ?? 'True' !! 'False' }
multi method gist(Bool:D:) { self ?? 'True' !! 'False' }
method Int() { self ?? 1 !! 0 }
method pred() { Bool::False }
method succ() { Bool::True }
method key() { self.Str }
method value() { self.Numeric }
method pick(Bool:U: $n = 1) { (Bool::True, Bool::False).pick($n) }
method roll(Bool:U: $n = 1) { (Bool::True, Bool::False).roll($n) }
multi method ACCEPTS(Bool:D: Mu \topic ) { self }
multi method perl(Bool:D:) { self ?? 'Bool::True' !! 'Bool::False' }
method enums() {
my % = False => 0, True => 1
}
}
multi prefix:<++>(Bool:U \a is rw) { a = True; }
multi prefix:<-->(Bool:U \a is rw) { a = False; }
multi postfix:<++>(Bool:U \a is rw) { a = True; False; }
multi postfix:<-->(Bool:U \a is rw) { a = False; }
proto prefix:<?>(Mu $) { * }
multi prefix:<?>(Bool:D \a) { a }
multi prefix:<?>(Mu \a) { a.Bool }
proto prefix:<so>(Mu $) { * }
multi prefix:<so>(Bool:D \a) { a }
multi prefix:<so>(Mu \a) { a.Bool }
proto prefix:<!>(Mu $) { * }
multi prefix:<!>(Bool \a) { nqp::p6bool(a ?? 0 !! 1) }
multi prefix:<!>(Mu \a) { nqp::p6bool(a.Bool ?? 0 !! 1) }
proto prefix:<not>(Mu $) { * }
multi prefix:<not>(Bool \a) { nqp::p6bool(a ?? 0 !! 1) }
multi prefix:<not>(Mu \a) { nqp::p6bool(a.Bool ?? 0 !! 1) }
proto prefix:<?^>(Mu $) { * }
multi prefix:<?^>(Mu \a) { not a }
proto infix:<?&>(|) { * }
multi infix:<?&>(Mu $x = Bool::True) { $x.Bool }
multi infix:<?&>(Mu \a, Mu \b) { a.Bool && b.Bool }
proto infix:<?|>(|) { * }
multi infix:<?|>(Mu $x = Bool::False) { $x.Bool }
multi infix:<?|>(Mu \a, Mu \b) { a.Bool || b.Bool }
proto infix:<?^>(|) { * }
multi infix:<?^>(Mu $x = Bool::False) { $x.Bool }
multi infix:<?^>(Mu \a, Mu \b) { a.Bool ^^ b.Bool }
# These operators are normally handled as macros in the compiler;
# we define them here for use as arguments to functions.
proto infix:<&&>(|) { * }
multi infix:<&&>(Mu $x = Bool::True) { $x }
multi infix:<&&>(Mu \a, Mu \b) { a && b }
proto infix:<||>(|) { * }
multi infix:<||>(Mu $x = Bool::False) { $x }
multi infix:<||>(Mu \a, Mu \b) { a || b }
proto infix:<^^>(|) { * }
multi infix:<^^>(Mu $x = Bool::False) { $x }
multi infix:<^^>(Mu \a, Mu \b) { a ^^ b }
multi infix:<^^>(*@a) {
my $a = shift @a;
while @a {
my $b := shift @a;
next unless $b;
return Nil if $a;
$a := $b;
}
$a;
}
proto infix:<//>(|) { * }
multi infix:<//>(Mu $x = Any) { $x }
multi infix:<//>(Mu \a, Mu \b) { a // b }
proto infix:<and>(|) { * }
multi infix:<and>(Mu $x = Bool::True) { $x }
multi infix:<and>(Mu \a, Mu \b) { a && b }
proto infix:<or>(|) { * }
multi infix:<or>(Mu $x = Bool::False) { $x }
multi infix:<or>(Mu \a, Mu \b) { a || b }
proto infix:<xor>(|) { * }
multi infix:<xor>(Mu $x = Bool::False) { $x }
multi infix:<xor>(Mu \a, Mu \b) { a ^^ b }
multi infix:<xor>(*@a) { &infix:<^^>(@a); }
proto infix:<orelse>(|) { * }
multi infix:<orelse>(Mu $x = Any) { $x }
multi infix:<orelse>(Mu \a, Mu \b) { a // b }