Start fleshing out interactive funcs

This commit is contained in:
Greg Sexton 2014-04-13 21:08:02 +01:00
parent b55125cc8b
commit 1944c22931

View File

@ -51,7 +51,14 @@
(defun origami-fold-open-p (node) (aref node 2)) (defun origami-fold-open-p (node) (aref node 2))
(defun origami-fold-children (node) (aref node 3)) (defun origami-fold-children (node &optional children)
(if children
(origami-fold-node (origami-fold-beg node)
(origami-fold-end node)
(origami-fold-open-p node)
children
(origami-fold-data data))
(aref node 3)))
(defun origami-fold-data (node &optional data) (defun origami-fold-data (node &optional data)
"With optional param DATA, add or replace data. This cannot be "With optional param DATA, add or replace data. This cannot be
@ -60,16 +67,13 @@ used to nil out data. This mutates the node."
(aset node 4 data) (aset node 4 data)
(aref node 4))) (aref node 4)))
;;; need to rewrite the fold tree structure from the node downwards (defun origami-fold-open-set (path value)
;; (defun origami-fold-open-set (node value) ;; TODO:
;; (origami-fold-node (origami-fold-beg node) (origami-fold-node (origami-fold-beg node)
;; (origami-fold-end node) (origami-fold-end node)
;; value value
;; (origami-fold-children node) (origami-fold-children node)
;; (origami-fold-data node))) (origami-fold-data node)))
;; (defun origami-fold-open-toggle (node)
;; (origami-fold-open-set node (not (origami-fold-open-p node))))
(defun origami-fold-range-equal (a b) (defun origami-fold-range-equal (a b)
(and (equal (origami-fold-beg a) (origami-fold-beg b)) (and (equal (origami-fold-beg a) (origami-fold-beg b))
@ -78,6 +82,13 @@ used to nil out data. This mutates the node."
(defun origami-fold-state-equal (a b) (defun origami-fold-state-equal (a b)
(equal (origami-fold-open-p a) (origami-fold-open-p b))) (equal (origami-fold-open-p a) (origami-fold-open-p b)))
(defun origami-fold-assoc (path new-node)
"Rewrite the tree, replacing the node referenced by path with NEW-NODE"
(-reduce-r-from (lambda (node acc)
(origami-fold-children node acc))
new-node
(butlast path)))
(defun origami-fold-diff (old new on-add on-remove on-change) (defun origami-fold-diff (old new on-add on-remove on-change)
(cl-labels ((diff-children (old-children new-children) (cl-labels ((diff-children (old-children new-children)
(let ((old (car old-children)) (let ((old (car old-children))
@ -158,7 +169,7 @@ used to nil out data. This mutates the node."
(origami-content (+ (origami-content-consumed-count content) consumed) (origami-content (+ (origami-content-consumed-count content) consumed)
(substring (origami-content-string content) consumed))) (substring (origami-content-string content) consumed)))
;;; parser ;;; monadic parser combinator
(defun origami-run-parser (parser content) (defun origami-run-parser (parser content)
(funcall parser content)) (funcall parser content))
@ -246,30 +257,70 @@ used to nil out data. This mutates the node."
(origami-do (positions <- (origami-parser-1+ (origami-parser-sat pred))) (origami-do (positions <- (origami-parser-1+ (origami-parser-sat pred)))
(origami-parser-return (car (last positions))))) (origami-parser-return (car (last positions)))))
(origami-run-parser ;;; TODO: always need to parse to max nesting, even if some of it gets ignored
(origami-parser-0+ (origami-do
(origami-parser-consume-while (lambda (x)
(not (equal x "{"))))
(origami-parser-paired (origami-parser-char "{")
(origami-parser-char "}")
(origami-do
(origami-parser-consume-while (lambda (x) (and (not (equal x "}"))
(not (equal x "{")))))
(origami-parser-1?
(origami-parser-paired (origami-parser-char "{")
(origami-parser-char "}")
(origami-parser-zero)))))))
(origami-content 7 " { {} } { } "))
;;; TODO: rework this ;;; interactive utils
(defun origami-parse (buffer parser)
(with-current-buffer buffer (defun origami-get-cached-tree (buffer)
(let ((contents (buffer-string))) ;; TODO:
(origami-run-parser parser (origami-content 0 contents))))) )
(defun origami-store-cached-tree (buffer tree)
;; TODO:
)
(defun origami-build-tree (buffer parser)
(when parser
(with-current-buffer buffer
(let ((contents (buffer-string)))
(origami-run-parser parser (origami-content 0 contents))))))
(defun origami-get-parser (buffer)
;; TODO: remove hardcoding!
(origami-parser-0+ (origami-do
(origami-parser-consume-while (lambda (x)
(not (equal x "{"))))
(origami-parser-paired (origami-parser-char "{")
(origami-parser-char "}")
(origami-do
(origami-parser-consume-while (lambda (x) (and (not (equal x "}"))
(not (equal x "{")))))
(origami-parser-1?
(origami-parser-paired (origami-parser-char "{")
(origami-parser-char "}")
(origami-parser-zero))))))))
(defun origami-get-fold-tree (buffer)
"Facade. Build the tree if it hasn't already been built
otherwise fetch cached tree."
(or (origami-get-cached-tree buffer)
(origami-build-tree buffer
(origami-get-parser buffer))
;; TODO: cache built tree
))
;;; dsl ;;; dsl
;;; commands ;;; commands
;;; TODO: should ensure that minor mode is enabled?
;;; TODO: extract common pattern
(defun origami-open-node (buffer point)
(interactive (list (current-buffer) (point)))
(let ((tree (origami-get-fold-tree buffer)))
(-when-let (path (origami-fold-find-node-containing tree point))
;; TODO: don't actually compute + apply the diff
(origami-store-cached-tree buffer
(origami-fold-open-set path t)))))
(defun origami-close-node (point)
(interactive (list (current-buffer) (point)))
(let ((tree (origami-get-fold-tree buffer)))
(-when-let (path (origami-fold-find-node-containing tree point))
(origami-fold-open-set path nil))))
(defun origami-toggle-node (point))
(defun origami-reset (buffer) (defun origami-reset (buffer)
;; TODO: provide this to the user in case we get screwed up, maybe ;; TODO: provide this to the user in case we get screwed up, maybe
@ -279,4 +330,6 @@ used to nil out data. This mutates the node."
;; TODO: remove fold ds ;; TODO: remove fold ds
) )
;;; minor mode
;;; origami.el ends here ;;; origami.el ends here