(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))) (defun html-encode-with-http (str) (let* ((pairs (tuples 2 (tok-str str #/https?:\/\/\S+/ t)))) (cat-str (mappend (tb ((text : link)) (list (html-encode text) (if link `[link]`))) pairs))))