mirror of
https://github.com/pestctrl/emacs-config.git
synced 2026-02-16 16:24:18 +00:00
Ehhh, I wanna go a different direction
This commit is contained in:
parent
4c026227c8
commit
1015f5c9a5
2 changed files with 140 additions and 9 deletions
66
lisp/cf-map-test.el
Normal file
66
lisp/cf-map-test.el
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
;;; cf-map-test.el --- -*- lexical-binding: t -*-
|
||||||
|
|
||||||
|
;; Copyright (C) 2024 Benson Chu
|
||||||
|
|
||||||
|
;; Author: Benson Chu <bensonchu457@gmail.com>
|
||||||
|
;; Created: [2024-04-26 07:05]
|
||||||
|
|
||||||
|
;; This file is not part of GNU Emacs
|
||||||
|
|
||||||
|
;; This program is free software: you can redistribute it and/or modify
|
||||||
|
;; it under the terms of the GNU General Public License as published by
|
||||||
|
;; the Free Software Foundation, either version 3 of the License, or
|
||||||
|
;; (at your option) any later version.
|
||||||
|
|
||||||
|
;; This program is distributed in the hope that it will be useful,
|
||||||
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
;; GNU General Public License for more details.
|
||||||
|
|
||||||
|
;; You should have received a copy of the GNU General Public License
|
||||||
|
;; along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
;;; Commentary:
|
||||||
|
|
||||||
|
;;; Code:
|
||||||
|
(require 'cf-map)
|
||||||
|
|
||||||
|
(ert-deftest inside-test ()
|
||||||
|
(should-not (cfmap--inside '(1 . 10) '(2 . 5)))
|
||||||
|
(should-not (cfmap--inside '(1 . 10) '(8 . 12)))
|
||||||
|
(should-not (cfmap--inside '(5 . 10) '(2 . 7)))
|
||||||
|
(should (cfmap--inside '(2 . 5) '(1 . 10))))
|
||||||
|
|
||||||
|
(ert-deftest overlapping-test ()
|
||||||
|
(should (cfmap-overlapping '(1 . 10) '(2 . 5)))
|
||||||
|
(should (cfmap-overlapping '(1 . 10) '(8 . 12)))
|
||||||
|
(should (cfmap-overlapping '(5 . 10) '(2 . 7)))
|
||||||
|
(should (cfmap-overlapping '(2 . 5) '(1 . 10)))
|
||||||
|
|
||||||
|
(should-not (cfmap-overlapping '(1 . 2) '(3 . 4)))
|
||||||
|
(should-not (cfmap-overlapping '(5 . 6) '(3 . 4))))
|
||||||
|
|
||||||
|
(ert-deftest regionify-one-region ()
|
||||||
|
(should (= 1 (length (cfmap-regionify '((1 . 10) (2 . 5))))))
|
||||||
|
(should (= 1 (length (cfmap-regionify '((1 . 10) (8 . 12))))))
|
||||||
|
(should (= 1 (length (cfmap-regionify '((5 . 10) (2 . 7))))))
|
||||||
|
(should (= 1 (length (cfmap-regionify '((2 . 5) (1 . 10))))))
|
||||||
|
|
||||||
|
(should (= 2 (length (cfmap-regionify '((1 . 2) (3 . 4)))))))
|
||||||
|
|
||||||
|
(ert-deftest test-subregions ()
|
||||||
|
;; This is one region with 2 sub-regions
|
||||||
|
(should (= 2
|
||||||
|
(length
|
||||||
|
(plist-get (car (cfmap-regionify '((1 . 10) (2 . 3) (4 . 5))))
|
||||||
|
:subregions))))
|
||||||
|
;; One subregion, since things overlap
|
||||||
|
(should (= 1
|
||||||
|
(length
|
||||||
|
(plist-get (car (cfmap-regionify '((1 . 10) (2 . 4) (3 . 5))))
|
||||||
|
:subregions)))))
|
||||||
|
|
||||||
|
;; (ert-run-tests-interactively t)
|
||||||
|
|
||||||
|
(provide 'cf-map-test)
|
||||||
|
;;; cf-map-test.el ends here
|
||||||
|
|
@ -498,7 +498,7 @@ If REMOVE is non-nil, remove cfmap from other modes."
|
||||||
(if (eq (point) (line-end-position))
|
(if (eq (point) (line-end-position))
|
||||||
(insert "|" (make-string arrow-length ? ))
|
(insert "|" (make-string arrow-length ? ))
|
||||||
(delete-char 1)
|
(delete-char 1)
|
||||||
(if (eq (point) (line-end-position))
|
(if (not (looking-at-p "|"))
|
||||||
(insert "|")
|
(insert "|")
|
||||||
(insert "+"))))
|
(insert "+"))))
|
||||||
((eq type 'ingress)
|
((eq type 'ingress)
|
||||||
|
|
@ -512,13 +512,13 @@ If REMOVE is non-nil, remove cfmap from other modes."
|
||||||
(make-string arrow-length ?-))))))
|
(make-string arrow-length ?-))))))
|
||||||
(my-next-line ()
|
(my-next-line ()
|
||||||
(forward-line 1)))
|
(forward-line 1)))
|
||||||
(goto-line (1+ start))
|
(goto-line start)
|
||||||
(insert-arrow-part
|
(insert-arrow-part
|
||||||
(if (eq dir 'up)
|
(if (eq dir 'up)
|
||||||
'ingress
|
'ingress
|
||||||
'egress))
|
'egress))
|
||||||
(let ((i 0)
|
(let ((i 0)
|
||||||
(end (abs (- start end))))
|
(end (1- (abs (- start end)))))
|
||||||
(while (< i end)
|
(while (< i end)
|
||||||
(my-next-line)
|
(my-next-line)
|
||||||
(insert-arrow-part 'line)
|
(insert-arrow-part 'line)
|
||||||
|
|
@ -531,20 +531,85 @@ If REMOVE is non-nil, remove cfmap from other modes."
|
||||||
|
|
||||||
(defvar cfmap-test
|
(defvar cfmap-test
|
||||||
'(-1
|
'(-1
|
||||||
(5 . 20)
|
(5 . 11)
|
||||||
(10 . 2)
|
(7 . 3)
|
||||||
(1 . 22)
|
(15 . 18)
|
||||||
|
(2 . 22)
|
||||||
|
(24 . 30)
|
||||||
;; (22 . 25)
|
;; (22 . 25)
|
||||||
))
|
))
|
||||||
|
|
||||||
|
(defun cfmap--point-inside (p r)
|
||||||
|
(and
|
||||||
|
(< (car r) p)
|
||||||
|
(< p (cdr r))))
|
||||||
|
|
||||||
|
(defun cfmap--inside (r1 r2)
|
||||||
|
(and
|
||||||
|
(cfmap--point-inside (car r1) r2)
|
||||||
|
(cfmap--point-inside (cdr r1) r2)))
|
||||||
|
|
||||||
|
(defun cfmap-overlapping (r1 r2)
|
||||||
|
(or
|
||||||
|
(cfmap--point-inside (car r2) r1)
|
||||||
|
(cfmap--point-inside (cdr r2) r1)
|
||||||
|
(cfmap--inside r1 r2)))
|
||||||
|
|
||||||
|
(defun cfmap-regionify (list)
|
||||||
|
(let ((points (sort (cdr cfmap-test)
|
||||||
|
(lambda (x y)
|
||||||
|
(< (car x) (car y)))))
|
||||||
|
(remaining list)
|
||||||
|
regions
|
||||||
|
cur-region)
|
||||||
|
(labels ((make-one-region
|
||||||
|
()
|
||||||
|
(let ((region-over nil)
|
||||||
|
(depth 0)
|
||||||
|
the-region super-region
|
||||||
|
sub-regions)
|
||||||
|
(while (and (not region-over)
|
||||||
|
(not (zerop (length remaining))))
|
||||||
|
(let* ((curr-region (car remaining))
|
||||||
|
(curr-start (car curr-region))
|
||||||
|
(curr-end (cdr curr-region)))
|
||||||
|
(cond
|
||||||
|
((not super-region)
|
||||||
|
(push curr-region the-region)
|
||||||
|
(setq super-region (copy-tree curr-region)
|
||||||
|
remaining (cdr remaining)))
|
||||||
|
((not (cfmap-overlapping super-region curr-region))
|
||||||
|
;; Region is officially over
|
||||||
|
(setq region-over t))
|
||||||
|
((not (cfmap--inside curr-region super-region))
|
||||||
|
;; Extend current region
|
||||||
|
(push curr-region the-region)
|
||||||
|
(setcdr super-region curr-end)
|
||||||
|
(setq remaining (cdr remaining)))
|
||||||
|
(t
|
||||||
|
(push (make-one-region) sub-regions)))))
|
||||||
|
(list :region (reverse the-region)
|
||||||
|
:subregions (reverse sub-regions)))))
|
||||||
|
(while (not (zerop (length remaining)))
|
||||||
|
(push (make-one-region) regions))
|
||||||
|
)
|
||||||
|
regions))
|
||||||
|
|
||||||
|
(defun cfmap-max-live (region)
|
||||||
|
)
|
||||||
|
|
||||||
|
;; (cfmap-regionify cfmap-test)
|
||||||
|
|
||||||
(defvar cfmap-arrow-depth 0)
|
(defvar cfmap-arrow-depth 0)
|
||||||
|
|
||||||
(progn
|
(progn
|
||||||
(with-current-buffer (get-buffer "*scratch0*")
|
(with-current-buffer (get-buffer "*scratch0*")
|
||||||
(setq cfmap-arrow-depth 3)
|
(setq cfmap-arrow-depth 3)
|
||||||
(erase-buffer)
|
(erase-buffer)
|
||||||
|
;; (dotimes (i 637)
|
||||||
|
;; (insert (format "%3d" i) "\n"))
|
||||||
(dotimes (i 637)
|
(dotimes (i 637)
|
||||||
(insert (format "%3d" i) "\n"))
|
(insert "\n"))
|
||||||
(let* ((lines (reverse (cdr cfmap-test)))
|
(let* ((lines (reverse (cdr cfmap-test)))
|
||||||
(len (length lines))
|
(len (length lines))
|
||||||
(counter 0))
|
(counter 0))
|
||||||
|
|
@ -553,8 +618,8 @@ If REMOVE is non-nil, remove cfmap from other modes."
|
||||||
(b (cdr l))
|
(b (cdr l))
|
||||||
start end direction)
|
start end direction)
|
||||||
(if (< a b)
|
(if (< a b)
|
||||||
(cfmap-draw-arrow 'down a b 3 (1+ (* counter 3)) (* 3 (- len counter)))
|
(cfmap-draw-arrow 'down a b 0 (* counter 3) (* 3 (- len counter)))
|
||||||
(cfmap-draw-arrow 'up b a 3 (1+ (* counter 3)) (* 3 (- len counter))))
|
(cfmap-draw-arrow 'up b a 0 (* counter 3) (* 3 (- len counter))))
|
||||||
)
|
)
|
||||||
(cl-incf counter)))))
|
(cl-incf counter)))))
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue