aboutsummaryrefslogtreecommitdiff
path: root/nomnom/source.nom
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2018-11-02 15:17:48 -0700
committerBruce Hill <bruce@bruce-hill.com>2018-11-02 15:17:49 -0700
commit0f17c5eb9ac4660f2f969bd1e67af42713e45eac (patch)
tree279ca7da2de0efe2f363684f3c84a540635f11a8 /nomnom/source.nom
parentacd9c2acd4688f2301b091daad910c04e402bd6a (diff)
parentdc41f30c73c9686685e3a4183c1213fb4ba55c90 (diff)
Merge branch 'master' into working
Diffstat (limited to 'nomnom/source.nom')
-rw-r--r--nomnom/source.nom54
1 files changed, 54 insertions, 0 deletions
diff --git a/nomnom/source.nom b/nomnom/source.nom
new file mode 100644
index 0000000..c36216f
--- /dev/null
+++ b/nomnom/source.nom
@@ -0,0 +1,54 @@
+#!/usr/bin/env nomsu -V4.8.10
+use "lib/object.nom"
+
+object (Source):
+ externally (Source from text %text) means:
+ %match = (%text::matching groups "^@(.-)%[(%d+):(%d+)%]$")
+ set {%filename:%match.1, %start:%match.2, %stop:%match.3}
+ unless %filename:
+ %match = (%text::matching groups "^@(.-)%[(%d+)%]$")
+ set {%filename:%match.1, %start:%match.2}
+
+ return (..)
+ Source {filename:%filename, start:(%start or 1) as number, stop:%stop as number}
+
+ my action [as text] "\
+ ..@\(%me.filename)[\(%me.start)\(":\(%me.stop)" if %me.stop else "")]"
+ my action [as lua] "\
+ ..Source{filename=\(%me.filename::as lua), start=\(%me.start)\(..)
+ ", stop=\(%me.stop)" if %stop else ""
+ ..}"
+
+ my action [as nomsu] "\
+ ..(Source {filename:\(%me.filename::as nomsu), start:\(%me.start)\(..)
+ ", stop:\(%me.stop)" if %stop else ""
+ ..})"
+
+ my action [== %other] (..)
+ all of [..]
+ (%me's metatable) == (%other's metatable)
+ %me.filename == %other.filename
+ %me.start == %other.start
+ %me.stop == %other.stop
+
+ my action [< %other]:
+ assume %me.filename == %other.filename
+ if (%start == %other.start):
+ return ((%me.stop or %me.start) < (%other.stop or %other.start))
+ ..else:
+ return (%me.start < %other.start)
+
+ my action [<= %other]:
+ assume %me.filename == %other.filename
+ if (%start == %other.start):
+ return ((%me.stop or %me.start) <= (%other.stop or %other.start))
+ ..else:
+ return (%me.start <= %other.start)
+
+ my action [+ %offset]:
+ if ((type of %me) == "number"):
+ set {%me:%offset, %offset:%me}
+ ..else:
+ assume (type of %offset) == "number"
+
+ return (Source {filename:%me.filename, start:%me.start + %offset, stop:%me.stop})