summaryrefslogtreecommitdiffstats
path: root/util.tl
diff options
context:
space:
mode:
Diffstat (limited to 'util.tl')
-rw-r--r--util.tl23
1 files changed, 23 insertions, 0 deletions
diff --git a/util.tl b/util.tl
new file mode 100644
index 0000000..71fc985
--- /dev/null
+++ b/util.tl
@@ -0,0 +1,23 @@
+(defun move-impl (items keys ins-pos)
+ (let ((key-items (mapcar (op find @1 items) keys))
+ (rm-items [set-diff items keys equal]))
+ (append [rm-items 0..ins-pos]
+ key-items
+ [rm-items ins-pos..:])))
+
+(defun minpos (items keys)
+ [reduce-left min (mapcar (op posqual @1 items) keys) (length items)])
+
+(defun move-up (items keys)
+ (move-impl items keys
+ (max 0 (pred (minpos items keys)))))
+
+(defun move-down (items keys)
+ (move-impl items keys
+ (succ (minpos items keys))))
+
+(defun move-front (items keys)
+ (move-impl items keys 0))
+
+(defun move-tail (items keys)
+ (move-impl items keys (length items)))