Delete dusty Elisp code
When I first switched to EXWM, I wrote a lot of Elisp. I think I was mostly excited about having a monorepo and, as I had a backlog of ideas that I wanted to implement, I ended up writing many halfly baked ideas in Elisp. These are mostly sketches.
This commit is contained in:
		
							parent
							
								
									f17e8126eb
								
							
						
					
					
						commit
						7dbf7b025a
					
				
					 2 changed files with 0 additions and 421 deletions
				
			
		|  | @ -1,128 +0,0 @@ | ||||||
| ;;; imdb.el --- Internet Movie Database -*- lexical-binding: t -*- |  | ||||||
| ;; Author: William Carroll <wpcarro@gmail.com> |  | ||||||
| 
 |  | ||||||
| ;;; Commentary: |  | ||||||
| ;; Some Elisp to help me pick movies more quickly. |  | ||||||
| 
 |  | ||||||
| ;;; Code: |  | ||||||
| 
 |  | ||||||
| (require 'f) |  | ||||||
| (require 'macros) |  | ||||||
| (require 'pcre2el) |  | ||||||
| (require 'random) |  | ||||||
| (require 'maybe) |  | ||||||
| 
 |  | ||||||
| ;; TODO: How do you support types herein? |  | ||||||
| (cl-defstruct movie |  | ||||||
|   name |  | ||||||
|   year |  | ||||||
|   director |  | ||||||
|   watched?) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support famous directors like: |  | ||||||
| ;; - Wes Anderson |  | ||||||
| ;; - Woody Allen |  | ||||||
| ;; - Tarantino |  | ||||||
| ;; - Coen Brothers |  | ||||||
| ;; - Alfonso Cauron |  | ||||||
| ;; - Alejandro González Iñárritu |  | ||||||
| ;; - Alfred Hitchcock |  | ||||||
| ;; - Stanley Kubrick |  | ||||||
| 
 |  | ||||||
| ;; TODO: Dump this into SQL. |  | ||||||
| 
 |  | ||||||
| (defconst imdb/kubrick-films |  | ||||||
|   (->> '((:watched? nil :year 1951 :name "Flying Padre") |  | ||||||
|          (:watched? nil :year 1953 :name "Fear and Desire") |  | ||||||
|          (:watched? nil :year 1953 :name "The Seafarers") |  | ||||||
|          (:watched? nil :year 1955 :name "Killer's Kiss") |  | ||||||
|          (:watched? nil :year 1956 :name "The Killing") |  | ||||||
|          (:watched? nil :year 1957 :name "Paths of Glory") |  | ||||||
|          (:watched? nil :year 1960 :name "Spartacus") |  | ||||||
|          (:watched? nil :year 1962 :name "Lolita") |  | ||||||
|          (:watched? nil :year 1964 :name "Dr. Strangelove") |  | ||||||
|          (:watched? nil :year 1968 :name "2001: A Space Odyssey") |  | ||||||
|          (:watched? t   :year 1971 :name "A Clockwork Orange") |  | ||||||
|          (:watched? nil :year 1975 :name "Barry Lyndon") |  | ||||||
|          (:watched? nil :year 1980 :name "The Shining") |  | ||||||
|          (:watched? t   :year 1987 :name "Full Metal Jacket") |  | ||||||
|          (:watched? nil :year 1999 :name "Eyes Wide Shut")) |  | ||||||
|        (list/map (lambda (x) |  | ||||||
|                    (make-movie :name (plist-get :name x) |  | ||||||
|                                :year (plist-get :year x) |  | ||||||
|                                :director "Stanley Kubrick" |  | ||||||
|                                :watched? (plist-get :watched? x)))))) |  | ||||||
| 
 |  | ||||||
| (defconst imdb/non-top-250 |  | ||||||
|   (->> '("Doctor Zhivago" |  | ||||||
|          ) |  | ||||||
|        (list/map #'imdb/new-movie))) |  | ||||||
| 
 |  | ||||||
| (defun imdb/new-movie (name) |  | ||||||
|   "Create a new movie with NAME." |  | ||||||
|   (make-movie :name name |  | ||||||
|               :year nil |  | ||||||
|               :director nil |  | ||||||
|               :watched? nil)) |  | ||||||
| 
 |  | ||||||
| (defun imdb/org->movie (line) |  | ||||||
|   "Parse an org LINE into a movie struct." |  | ||||||
|   (let ((match (s-match |  | ||||||
|                 (pcre-to-elisp "^\*\*\s(TODO|DONE)\s(.+)$") |  | ||||||
|                 line))) |  | ||||||
|     (if (maybe/some? match) |  | ||||||
|         (make-movie :name (list/get 2 match) |  | ||||||
|                     :year nil |  | ||||||
|                     :director nil |  | ||||||
|                     :watched? (equal "DONE" (list/get 1 match))) |  | ||||||
|       (error (s-concat "Parsing error: " line))))) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Store these in a database or define them herein. |  | ||||||
| (defun imdb/org->movies () |  | ||||||
|   "Parse entire IMDB org file into movie structs." |  | ||||||
|   (->> "~/Dropbox/org/imdb_top_250.org" |  | ||||||
|        f-read |  | ||||||
|        (s-split "\n") |  | ||||||
|        (-drop 1) |  | ||||||
|        (list/filter (>> (s-starts-with? "** "))) |  | ||||||
|        (list/map #'imdb/org->movie))) |  | ||||||
| 
 |  | ||||||
| (defun imdb/watched? (movie) |  | ||||||
|   "Return t if MOVIE has been watched." |  | ||||||
|   (movie-watched? movie)) |  | ||||||
| 
 |  | ||||||
| (defconst imdb/movies (imdb/org->movies) |  | ||||||
|   "Structs of all watched movies.") |  | ||||||
| 
 |  | ||||||
| (defun imdb/unwatched () |  | ||||||
|   "Return list of unwatched movies." |  | ||||||
|   (->> imdb/movies |  | ||||||
|        (list/filter (lambda (x) (not (imdb/watched? x)))))) |  | ||||||
| 
 |  | ||||||
| (defun imdb/name (movie) |  | ||||||
|   "Return name of MOVIE." |  | ||||||
|   (movie-name movie)) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| (defun imdb/suggest () |  | ||||||
|   "Randomly select movie from unwatched list." |  | ||||||
|   (->> (imdb/unwatched) |  | ||||||
|        (random/choice) |  | ||||||
|        (imdb/name))) |  | ||||||
| 
 |  | ||||||
| (defun imdb/unwatched-list () |  | ||||||
|   "Dump all unwatched movies into a list." |  | ||||||
|   (f-write-text (->> (imdb/unwatched) |  | ||||||
|                      (list/map #'imdb/name) |  | ||||||
|                      (s-join "\n")) |  | ||||||
|                 'utf-8 |  | ||||||
|                 "/tmp/unwatched.txt")) |  | ||||||
| 
 |  | ||||||
| (macros/comment |  | ||||||
|  (imdb/org->movies) |  | ||||||
|  (imdb/unwatched-list) |  | ||||||
|  (imdb/suggest) |  | ||||||
|  ) |  | ||||||
| 
 |  | ||||||
| (provide 'imdb) |  | ||||||
| ;;; imdb.el ends here |  | ||||||
|  | @ -1,293 +0,0 @@ | ||||||
| ;;; todo.el --- Bespoke task management system -*- lexical-binding: t -*- |  | ||||||
| ;; Author: William Carroll <wpcarro@gmail.com> |  | ||||||
| 
 |  | ||||||
| ;;; Commentary: |  | ||||||
| ;; Marriage of my personal task-management system, which I've been using for 18 |  | ||||||
| ;; months and is a mixture of handwritten notes, iOS notes, and org-mode files, |  | ||||||
| ;; with Emacs's famous `org-mode'. |  | ||||||
| ;; |  | ||||||
| ;; For me, I'd like a live, reactive state management system.  I'd like |  | ||||||
| ;; `org-mode' to be a nice way of rendering my TODOs, but I think the |  | ||||||
| ;; relationship with `org-mode' ends there. |  | ||||||
| ;; |  | ||||||
| ;; Intended to supplement my org-mode workflow. |  | ||||||
| ;; |  | ||||||
| ;; Wish-list: |  | ||||||
| ;; - Daily emails for standups |  | ||||||
| ;; - Templates for commonly occurring tasks |  | ||||||
| 
 |  | ||||||
| ;; Dependencies |  | ||||||
| (require 'dash) |  | ||||||
| (require 'f) |  | ||||||
| (require 'macros) |  | ||||||
| 
 |  | ||||||
| ;;; Code: |  | ||||||
| 
 |  | ||||||
| ;; TODO: Classify habits as 'daily, 'weekly, 'monthly, 'yearly, 'event-driven |  | ||||||
| 
 |  | ||||||
| ;; TODO: Consider serving these values up to a React webpage in Chrome. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Classify meetings as either 'recurrent or 'ad-hoc. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support sorting by `type'. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support work-queue idea for "Tomorrow's todos." |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support macro to generate all possible predicates for todo types. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support export to org-mode file |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support generic way to quickly render a list |  | ||||||
| 
 |  | ||||||
| (defcustom todo/install-kbds? t |  | ||||||
|   "When t, install the keybindings.") |  | ||||||
| 
 |  | ||||||
| ;; TODO: Add documentation. |  | ||||||
| (cl-defstruct todo type label) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Consider keeping this in Dropbox. |  | ||||||
| ;; TODO: Support whether or not the todo is done. |  | ||||||
| (defconst todo/org-file-path "~/Dropbox/org/today.org") |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support remaining function for each type. |  | ||||||
| ;; TODO: Support completed function for each type. |  | ||||||
| 
 |  | ||||||
| (defun todo/completed? (x) |  | ||||||
|   "Return t is `X' is marked complete." |  | ||||||
|   (todo-complete x)) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Prefer `new-{task,habit,meeting}'. |  | ||||||
| 
 |  | ||||||
| (defun todo/completed (xs) |  | ||||||
|   "Return the todo items in `XS' that are marked complete." |  | ||||||
|   (->> xs |  | ||||||
|        (-filter #'todo/completed?))) |  | ||||||
| 
 |  | ||||||
| (defun todo/remaining (xs) |  | ||||||
|   "Return the todo items in `XS' that are not marked complete." |  | ||||||
|   (->> xs |  | ||||||
|        (-reject #'todo/completed?))) |  | ||||||
| 
 |  | ||||||
| (defun todo/task (label) |  | ||||||
|   "Convenience function for creating a task todo with `LABEL'." |  | ||||||
|   (make-todo |  | ||||||
|    :type 'task |  | ||||||
|    :label label)) |  | ||||||
| 
 |  | ||||||
| (defun todo/meeting (label) |  | ||||||
|   "Convenience function for creating a meeting todo with `LABEL'." |  | ||||||
|   (make-todo |  | ||||||
|    :type 'meeting |  | ||||||
|    :label label)) |  | ||||||
| 
 |  | ||||||
| (defun todo/habit (label) |  | ||||||
|   "Convenience function for creating a habit todo with `LABEL'." |  | ||||||
|   (make-todo |  | ||||||
|    :type 'habit |  | ||||||
|    :label label)) |  | ||||||
| 
 |  | ||||||
| (defun todo/task? (x) |  | ||||||
|   "Return t if `X' is a task." |  | ||||||
|   (equal 'task (todo-type x))) |  | ||||||
| 
 |  | ||||||
| (defun todo/habit? (x) |  | ||||||
|   "Return t if `X' is a habit." |  | ||||||
|   (equal 'habit (todo-type x))) |  | ||||||
| 
 |  | ||||||
| (defun todo/meeting? (x) |  | ||||||
|   "Return t if `X' is a meeting." |  | ||||||
|   (equal 'meeting (todo-type x))) |  | ||||||
| 
 |  | ||||||
| (defun todo/label (x) |  | ||||||
|   "Return the label of `X'." |  | ||||||
|   (todo-label x)) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support moving todos between todo/{today,tomorrow}. |  | ||||||
| ;; TODO: Consider modelling todo/{today,tomorrow} as queues instead of lists so that I can |  | ||||||
| ;; append cheaply. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Find an Elisp date library. |  | ||||||
| 
 |  | ||||||
| ;; TODO: type-driven development of this habit tree. |  | ||||||
| ;; TODO: Create this tree on a whiteboard first. |  | ||||||
| ;; (defconst todo/habits |  | ||||||
| ;;   '(:beginning-of-month |  | ||||||
| ;;     '("Create habit template for current month" |  | ||||||
| ;;       "Post mortem of previous month") |  | ||||||
| ;;     :monday    '("Jiu Jitsu") |  | ||||||
| ;;     :tuesday   '("Jiu Jitsu") |  | ||||||
| ;;     :wednesday '("Jiu Jitsu") |  | ||||||
| ;;     :thursday  '("Salsa class") |  | ||||||
| ;;     :friday    '("Jiu Jitsu") |  | ||||||
| ;;     :saturday  '("Borough market") |  | ||||||
| ;;     :sunday    '("Shave") |  | ||||||
| ;;     :weekday '(:arrive-at-work |  | ||||||
| ;;                '("Breakfast" |  | ||||||
| ;;                  "Coffee" |  | ||||||
| ;;                  "Placeholder") |  | ||||||
| ;;                :before-lunch |  | ||||||
| ;;                '("Lock laptop" |  | ||||||
| ;;                  "Placeholder") |  | ||||||
| ;;                :home->work |  | ||||||
| ;;                '("Michel Thomas Italian lessons")) |  | ||||||
| ;;     :daily '(:morning |  | ||||||
| ;;              '("Meditate" |  | ||||||
| ;;                "Stretch") |  | ||||||
| ;;              :))) |  | ||||||
| 
 |  | ||||||
| ;; overlay weekday with specific weekdays (e.g. BJJ is only on M,T,W) |  | ||||||
| 
 |  | ||||||
| ;; TODO: Extend the record type to support duration estimations for AFK, K |  | ||||||
| ;; calculations. |  | ||||||
| 
 |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| ;; Habits |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| 
 |  | ||||||
| ;; TODO: Should I be writing this in ReasonML and Haskell? |  | ||||||
| 
 |  | ||||||
| (defconst todo/monthly-habit-challenge |  | ||||||
|   "InterviewCake.com" |  | ||||||
|   "The monthly habit challenge I do for fifteen minutes each day.") |  | ||||||
| 
 |  | ||||||
| (defconst todo/daily-habits |  | ||||||
|   (->> (list "Meditate" |  | ||||||
|              todo/monthly-habit-challenge) |  | ||||||
|        (-map #'todo/habit))) |  | ||||||
| 
 |  | ||||||
| (defconst todo/first-of-the-month-stack |  | ||||||
|   '("Create habit template for current month" |  | ||||||
|     "Reserve two dinners in London for dates" |  | ||||||
|     "Post mortem of previous month" |  | ||||||
|     "Create monthly financial budget in Google Sheets") |  | ||||||
|   "A stack of habits that I do at the beginning of each month.") |  | ||||||
| 
 |  | ||||||
| (defconst todo/adhoc-habits |  | ||||||
|   (->> (list/concat |  | ||||||
|         todo/first-of-the-month-stack) |  | ||||||
|        (-map #'todo/habit)) |  | ||||||
|   "Habits that I have no classification for at the moment.") |  | ||||||
| 
 |  | ||||||
| ;; TODO: Model this as a function. |  | ||||||
| (defconst todo/habits |  | ||||||
|   (list/concat todo/daily-habits |  | ||||||
|                todo/adhoc-habits) |  | ||||||
|   "My habits for today.") |  | ||||||
| 
 |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| ;; Meetings |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| 
 |  | ||||||
| ;; TODO: Define "meeting". |  | ||||||
| 
 |  | ||||||
| (defconst todo/daily-meetings |  | ||||||
|   (->> '("Standup" |  | ||||||
|          "Lunch") |  | ||||||
|        (-map #'todo/meeting)) |  | ||||||
|   "Daily, recurrent meetings.") |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| (defconst todo/day-of-week-meetings |  | ||||||
|   '(:Monday    '("Lunch") |  | ||||||
|     :Tuesday   '("Lunch") |  | ||||||
|     :Wednesday '("Team Lunch") |  | ||||||
|     :Thursday  '("Lunch") |  | ||||||
|     :Friday    '("Lunch") |  | ||||||
|     :Satuday   '() |  | ||||||
|     :Sunday    '()) |  | ||||||
|   "Meetings that occur depending on the current day of the week.") |  | ||||||
| 
 |  | ||||||
| (parse-time-string "today") |  | ||||||
| 
 |  | ||||||
| ;; TODO: Support recurrent, non-daily meetings. |  | ||||||
| 
 |  | ||||||
| (defconst todo/adhoc-meetings |  | ||||||
|   (->> '("WSE Weekly Standup" |  | ||||||
|          "Team Lunch" |  | ||||||
|          "Karisa Explains It All") |  | ||||||
|        (-map #'todo/meeting)) |  | ||||||
|   "Non-recurrent meetings.") |  | ||||||
| 
 |  | ||||||
| (defconst todo/meetings |  | ||||||
|   (list/concat todo/daily-meetings |  | ||||||
|                todo/adhoc-meetings) |  | ||||||
|   "My meetings for today.") |  | ||||||
| 
 |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| ;; Tasks |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| 
 |  | ||||||
| (defconst todo/tasks |  | ||||||
|   (->> '("GetEmailCase" |  | ||||||
|          "Async node workflow" |  | ||||||
|          "Support C-c in EXWM" |  | ||||||
|          "Post-its for bathroom mirror" |  | ||||||
|          "Visit AtomicHabit.com/scorecard" |  | ||||||
|          "Visit AtomicHabit.com/habitstacking" |  | ||||||
|          "Create GraphViz for Carpe Diem cirriculum" |  | ||||||
|          "Create CitC client for local browsing of CE codebase" |  | ||||||
|          "Respond to SRE emails") |  | ||||||
|        (-map #'todo/task))) |  | ||||||
| 
 |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| ;; Work queues (today, tomorrow, someday) |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| 
 |  | ||||||
| ;; TODO: Generate standup documents from DONE items in the state. |  | ||||||
| 
 |  | ||||||
| ;; TODO: Learn how to create a gen-server style of live, reactive state. |  | ||||||
| ;; TODO: This should probably be `defconst' and a reference to the live state. |  | ||||||
| (defconst todo/today |  | ||||||
|   (list/concat |  | ||||||
|    todo/habits |  | ||||||
|    todo/meetings |  | ||||||
|    todo/tasks)) |  | ||||||
| 
 |  | ||||||
| (defconst todo/tomorrow |  | ||||||
|   '()) |  | ||||||
| 
 |  | ||||||
| (defconst todo/someday |  | ||||||
|   '()) |  | ||||||
| 
 |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| ;; View functions |  | ||||||
| ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |  | ||||||
| 
 |  | ||||||
| (defun todo/to-org (xs) |  | ||||||
|   "Map `XS' into a string with `org-mode' syntax." |  | ||||||
|   ;; TODO: Create function to DRY this code up. |  | ||||||
|   (let ((meetings (->> xs |  | ||||||
|                        (-filter #'todo/meeting?) |  | ||||||
|                        (-map (lambda (x) |  | ||||||
|                                (s-concat "** TODO " (todo/label x)))) |  | ||||||
|                        (s-join "\n"))) |  | ||||||
|         (tasks (->> xs |  | ||||||
|                     (-filter #'todo/task?) |  | ||||||
|                     (-map (lambda (x) |  | ||||||
|                             (s-concat "** TODO " (todo/label x)))) |  | ||||||
|                     (s-join "\n"))) |  | ||||||
|         (habits (->> xs |  | ||||||
|                      (-filter #'todo/habit?) |  | ||||||
|                      (-map (lambda (x) |  | ||||||
|                              (s-concat "** TODO " (todo/label x)))) |  | ||||||
|                      (s-join "\n")))) |  | ||||||
|     (s-join "\n" (list |  | ||||||
|                   (s-concat "* Meetings\n" meetings) |  | ||||||
|                   (s-concat "* Tasks\n" tasks) |  | ||||||
|                   (s-concat "* Habits\n" habits))))) |  | ||||||
| 
 |  | ||||||
| (defun todo/export-to-org (xs) |  | ||||||
|   "Export `XS' to `todo/org-file-path'." |  | ||||||
|   (f-write-text (->> xs |  | ||||||
|                      todo/to-org) |  | ||||||
|                 'utf-8 |  | ||||||
|                 todo/org-file-path)) |  | ||||||
| 
 |  | ||||||
| (defun todo/orgify-today () |  | ||||||
|   "Exports today's todos to an org file." |  | ||||||
|   (interactive) |  | ||||||
|   (todo/export-to-org todo/today) |  | ||||||
|   (alert (string/concat  "Exported today's TODOs to: " todo/org-file-path))) |  | ||||||
| 
 |  | ||||||
| (provide 'todo) |  | ||||||
| ;;; todo.el ends here |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue