summaryrefslogtreecommitdiff
path: root/meta/whimsical/rule.lua
diff options
context:
space:
mode:
Diffstat (limited to 'meta/whimsical/rule.lua')
-rw-r--r--meta/whimsical/rule.lua128
1 files changed, 128 insertions, 0 deletions
diff --git a/meta/whimsical/rule.lua b/meta/whimsical/rule.lua
new file mode 100644
index 00000000..0715d78f
--- /dev/null
+++ b/meta/whimsical/rule.lua
@@ -0,0 +1,128 @@
+local cat
+
+cat.rule.default = function (self)
+ self.isTruly = true
+ self.truly = self
+ self.falsy = cat.class 'never'
+ self.view = self.name
+end
+
+cat.rule.never = function (self)
+ self.isTruly = nil
+end
+
+cat.rule.any = function (self)
+ self.isTruly = nil
+ self.truly = cat.class 'truly'
+ self.falsy = cat.boolean(false) | cat.class 'nil'
+end
+
+cat.rule['nil'] = function (self)
+ self.isTruly = false
+ self.truly = cat.class 'never'
+ self.falsy = self
+end
+
+cat.rule.boolean = function (self)
+ if self.value == true then
+ self.isTruly = true
+ self.truly = self
+ self.falsy = cat.class 'never'
+ elseif self.value == false then
+ self.isTruly = false
+ self.truly = cat.class 'never'
+ self.falsy = self
+ else
+ self.isTruly = nil
+ self.truly = cat.boolean(true)
+ self.falsy = cat.boolean(false)
+ end
+end
+
+cat.rule.number = function (self)
+ self.isTruly = true
+ self.truly = self
+ self.falsy = cat.class 'never'
+ self.view = tostring(self.value)
+end
+
+cat.rule.integer = function (self)
+ self.isTruly = true
+ self.truly = self
+ self.falsy = cat.class 'never'
+ self.view = tostring(self.value)
+end
+
+cat.rule.string = function (self)
+ self.isTruly = true
+ self.truly = self
+ self.falsy = cat.class 'never'
+ self.view = cat.util.viewString(self.value, self.quotation)
+end
+
+cat.rule.union = function (self)
+ self.isTruly = function (union)
+ local isTruly = union.subs[1].isTruly
+ if isTruly == nil then
+ return nil
+ end
+ if isTruly == true then
+ for i = 2, #union.subs do
+ if union.subs[i].isTruly ~= true then
+ return nil
+ end
+ end
+ return true
+ else
+ for i = 2, #union.subs do
+ if union.subs[i].isTruly ~= false then
+ return nil
+ end
+ end
+ return false
+ end
+ return nil
+ end
+ self.truly = function (union)
+ local new = cat.union()
+ for i = 1, #union.subs do
+ new:add(union.subs[i].truly)
+ end
+ if new:len() == 0 then
+ return cat.class 'never'
+ end
+ if new:len() == 1 then
+ return new[1]
+ end
+ return new
+ end
+ self.falsy = function (union)
+ local new = cat.union()
+ for i = 1, #union.subs do
+ new:add(union.subs[i].falsy)
+ end
+ if new:len() == 0 then
+ return cat.class 'never'
+ end
+ if new:len() == 1 then
+ return new[1]
+ end
+ return new
+ end
+ self.view = function (union)
+ local views = {}
+ for i = 1, #union.subs do
+ views[i] = union.subs[i].view
+ end
+ if #views == 0 then
+ return 'never'
+ end
+ return table.concat(views, '|')
+ end
+end
+
+cat.custom.dofile.onReturn = function (context)
+ local filename = context.args[1].asString
+ local file = cat.files[filename]
+ return file.returns[1]
+end