OSDN Git Service

Let's try out the "snippets" idea.
authorSimon Forman <sforman@hushmail.com>
Tue, 1 Mar 2022 22:13:07 +0000 (14:13 -0800)
committerSimon Forman <sforman@hushmail.com>
Tue, 1 Mar 2022 22:13:07 +0000 (14:13 -0800)
Represent strings (byte strings) as three-tuples of (git sha hash,
offset, length) immutable datastructures.

implementations/Python/joy/utils/snippets.py [new file with mode: 0644]

diff --git a/implementations/Python/joy/utils/snippets.py b/implementations/Python/joy/utils/snippets.py
new file mode 100644 (file)
index 0000000..843c325
--- /dev/null
@@ -0,0 +1,34 @@
+from collections import namedtuple
+from re import compile as RE
+
+Snippet = namedtuple('Snippet', 'sha offset length')
+fmt = '{%s %i %i}'
+pat = (
+    '{'
+    '\s*'
+    '(?P<sha>[a-f0-9]+)'
+    '\s+'
+    '(?P<offset>\d+)'
+    '\s+'
+    '(?P<length>\d+)'
+    '\s*'
+    '}'
+    )
+PAT = RE(pat)
+
+
+def to_string(snip):
+    return fmt % _ts(*snip)
+
+def _ts(sha, offset, length):
+    return sha.decode('ascii'), offset, length
+
+def from_string(text):
+    m = PAT.match(text)
+    if not m:
+        raise ValueError
+    return _fs(**m.groupdict())
+
+def _fs(sha, offset, length):
+    return Snippet(sha.encode('ascii'), int(offset), int(length))
+