1 # coding: utf-8
2 # frozen_string_literal: true
3
4
5
6 module Umu
7
8 module Value
9
10 module Core
11
12 module Atom
13
14 class Bool < Abstract
15 define_class_method(
16 :meth_make_true,
17 :true, [],
18 [], VCA::Bool
19 )
20 def self.meth_make_true(_loc, _env, _event)
21 VC.make_true
22 end
23
24
25 define_class_method(
26 :meth_make_false,
27 :false, [],
28 [], VCA::Bool
29 )
30 def self.meth_make_false(_loc, _env, _event)
31 VC.make_false
32 end
33
34
35 alias true? val
36
37
38 def false?
39 ! self.val
40 end
41
42
43 def to_s
44 if self.val
45 'TRUE'
46 else
47 'FALSE'
48 end
49 end
50
51
52 define_instance_method(
53 :meth_is_less_than,
54 :'<', [],
55 [self], self
56 )
57 def meth_is_less_than(_loc, _env, _event, other)
58 ASSERT.kind_of other, Bool
59
60 VC.make_bool(
61 if self.val
62 ! other.val
63 else
64 false
65 end
66 )
67 end
68
69
70 define_instance_method(
71 :meth_is_greater_than,
72 :'>', [],
73 [self], VCA::Bool
74 )
75
76
77 define_instance_method(
78 :meth_is_less_equal,
79 :'<=', [],
80 [self], VCA::Bool
81 )
82
83
84 define_instance_method(
85 :meth_is_greater_equal,
86 :'>=', [],
87 [self], VCA::Bool
88 )
89
90
91 define_instance_method(
92 :meth_compare,
93 :'<=>', [],
94 [self], VCAN::Int
95 )
96
97
98 define_instance_method(
99 :meth_not,
100 :not, [],
101 [], self
102 )
103 def meth_not(_loc, _env, _event)
104 VC.make_bool(! self.val)
105 end
106 end
107 Bool.freeze
108
109 TRUE = Bool.new(true).freeze
110 FALSE = Bool.new(false).freeze
111
112 end # Umu::Value::Core::Atom
113
114
115
116 module_function
117
118 def make_true
119 Atom::TRUE
120 end
121
122
123 def make_false
124 Atom::FALSE
125 end
126
127
128 def make_bool(val)
129 ASSERT.bool val
130
131 if val
132 VC.make_true
133 else
134 VC.make_false
135 end
136 end
137
138 end # Umu::Value::Core
139
140 end # Umu::Value
141
142 end # Umu