diff options
Diffstat (limited to 'meta/whimsical/rule.lua')
-rw-r--r-- | meta/whimsical/rule.lua | 128 |
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 |