a537826e3141

Refactor actions, rearrange code

Allows non-TTY actions to avoid `endwin`ing and blitting.
[view raw] [browse files]
author Steve Losh <steve@stevelosh.com>
date Thu, 10 May 2018 22:02:42 -0400
parents 44469630ef2a
children 2f0928adebb9
branches/tags (none)
files src/main.lisp

Changes

--- a/src/main.lisp	Tue May 08 18:56:22 2018 -0400
+++ b/src/main.lisp	Thu May 10 22:02:42 2018 -0400
@@ -1,5 +1,6 @@
 (in-package :brows)
 
+;;;; State --------------------------------------------------------------------
 (defparameter *regex*
   (ppcre:create-scanner
     ;; https://gist.github.com/gruber/249502
@@ -12,14 +13,7 @@
 (defparameter *actions* (make-hash-table))
 
 
-(defun find-urls (string)
-  (-<> string
-    (ppcre:all-matches-as-strings
-      *regex* <>
-      :sharedp nil) ; ccl can't take non-simple-strings as external program args, because fuck me
-    (remove-duplicates <> :test #'string-equal)
-    (coerce <> 'vector)))
-
+;;;; Utils --------------------------------------------------------------------
 (defun read-standard-input-into-string ()
   (with-output-to-string (result)
     (let* ((buffer-size 4096)
@@ -33,6 +27,46 @@
   (setf *pos* (clamp 0 (1- (length *urls*))
                      (+ *pos* delta))))
 
+
+;;;; Actions ------------------------------------------------------------------
+(defclass* (action :conc-name "") ()
+  (tty keys thunk))
+
+(defun create-action (thunk keys tty)
+  (let ((action (make-instance 'action :thunk thunk :keys keys :tty tty)))
+    (dolist (key (ensure-list keys))
+      (setf (gethash key *actions*) action))))
+
+(defmacro define-action (keys program &key
+                         (url 'url)
+                         (arguments `(list ,url))
+                         tty)
+  `(create-action
+     (lambda (,url)
+       (external-program:run ,program ,arguments
+                             ,@(if tty
+                                 '(:output t :input t)
+                                 '())))
+     ,keys
+     ,tty))
+
+(defun perform-action (action)
+  (when (tty action)
+    (charms/ll:endwin))
+  (funcall (thunk action) (aref *urls* *pos*))
+  (when (tty action)
+    (boots:blit)))
+
+
+;;;; Input --------------------------------------------------------------------
+(defun find-urls (string)
+  (-<> string
+    (ppcre:all-matches-as-strings
+      *regex* <>
+      :sharedp nil) ; ccl can't take non-simple-strings as external program args, because fuck me
+    (remove-duplicates <> :test #'string-equal)
+    (coerce <> 'vector)))
+
 (defun read-input (path)
   (if (equal "-" path)
     (read-standard-input-into-string)
@@ -41,22 +75,8 @@
 (defun process-input (input)
   (find-urls input))
 
-(defmacro define-action (keys program &key
-                         (url 'url)
-                         (arguments `(list ,url))
-                         tty)
-  (with-gensyms (action key)
-    `(let ((,action (lambda (,url)
-                      (external-program:run ,program ,arguments
-                                            ,@(if tty '(:output t :input t) '())))))
-       (dolist (,key (ensure-list ,keys))
-         (setf (gethash ,key *actions*) ,action)))))
 
-(defun perform-action (action)
-  (charms/ll:endwin)
-  (funcall action (aref *urls* *pos*))
-  (boots:blit))
-
+;;;; UI -----------------------------------------------------------------------
 (defun draw (canvas)
   (boots:clear canvas)
   (boots:draw canvas 0 0 (format nil "brows v~A" *version*))
@@ -97,4 +117,3 @@
           (boots:canvas () #'draw)
         (init)
         (main)))))
-