Delete unused Elisp modules
It is striking how much Elisp I wrote after switching to EXWM... I think I'm finally coming down from that high.
This commit is contained in:
parent
a35f723d92
commit
69a14dd37f
12 changed files with 0 additions and 873 deletions
|
@ -1,82 +0,0 @@
|
||||||
;;; chrome.el --- Helpers for Google Chrome -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Some helper functions for working with Google Chrome.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Dependencies
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(require 'macros)
|
|
||||||
(require 'alist)
|
|
||||||
(require 'list)
|
|
||||||
(require 'general)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defvar chrome/install-kbds? t
|
|
||||||
"If t, install keybinding.")
|
|
||||||
|
|
||||||
;; TODO: Consider modelling this as a rose-tree that can nest itself
|
|
||||||
;; arbitrarily.
|
|
||||||
;; TODO: Consider exporting existing chrome bookmarks.
|
|
||||||
(defconst chrome/label->url
|
|
||||||
'(("Google" . "www.google.com")
|
|
||||||
("Hacker News" . "news.ycombinator.com")
|
|
||||||
("Gmail" . "www.gmail.com")
|
|
||||||
("WhatsApp" . "web.whatsapp.com")
|
|
||||||
("Google Chat" . "chat/")
|
|
||||||
("Google Calendar" . "calendar/")
|
|
||||||
("Teknql" . "teknql.slack.com/messages")
|
|
||||||
("Twitter" . "twitter.com"))
|
|
||||||
"Mapping labels to urls for my bookmarks.")
|
|
||||||
|
|
||||||
(defconst chrome/splash-pages
|
|
||||||
'("Google Calendar"
|
|
||||||
"Gmail"
|
|
||||||
"Google Chat"
|
|
||||||
"WhatsApp"
|
|
||||||
"Teknql")
|
|
||||||
"The pages that should open when I open Chrome.")
|
|
||||||
|
|
||||||
;; TODO: Add defensive check to start chrome if it isn't already open.
|
|
||||||
|
|
||||||
;; TODO: Support option to create new session even if one already exists.
|
|
||||||
|
|
||||||
(defun chrome/open-splash-pages ()
|
|
||||||
"Opens Chrome with my preferred splash pages."
|
|
||||||
(interactive)
|
|
||||||
(->> chrome/splash-pages
|
|
||||||
(-map (lambda (x) (alist/get x chrome/label->url)))
|
|
||||||
chrome/open-urls))
|
|
||||||
|
|
||||||
;; TODO: Support optional kwargs.
|
|
||||||
(cl-defun chrome/open-url (url &key new-window?)
|
|
||||||
"Opens `URL' in google-chrome.
|
|
||||||
Will open without toolbars if APP-MODE? is t."
|
|
||||||
(shell-command (s-concat
|
|
||||||
"google-chrome "
|
|
||||||
(if new-window? "--new-window " "")
|
|
||||||
url)))
|
|
||||||
|
|
||||||
(defun chrome/open-urls (urls)
|
|
||||||
"Open multiple `URLS' in chrome."
|
|
||||||
(chrome/open-url
|
|
||||||
(list/join " " urls)))
|
|
||||||
|
|
||||||
(defun chrome/browse ()
|
|
||||||
"Display a counsel window for browsing URLs."
|
|
||||||
(interactive)
|
|
||||||
(ivy-read
|
|
||||||
"URL: "
|
|
||||||
chrome/label->url
|
|
||||||
:action (lambda (entry)
|
|
||||||
(chrome/open-url (cdr entry)))))
|
|
||||||
|
|
||||||
(provide 'chrome)
|
|
||||||
;;; chrome.el ends here
|
|
|
@ -1,54 +0,0 @@
|
||||||
;;; do.el --- Small assertion library for Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Assertion library inspired by Elixir's core testing library.
|
|
||||||
;;
|
|
||||||
;; The goal here is to create this module without relying on other non-core
|
|
||||||
;; Elisp libraries. I will attempt to do this as long as I'm not sacrificing
|
|
||||||
;; the readability of this code nor the ease at which it can be written.
|
|
||||||
;;
|
|
||||||
;; A note on testing:
|
|
||||||
;; Another goal with this library is to blur the line between testing code and
|
|
||||||
;; runtime code. Developers should ideally be using `do/assert' and `do/refute'
|
|
||||||
;; in their library code. Because of this, I'm avoiding referring
|
|
||||||
;; to the notion of testing in the names of these functions.
|
|
||||||
;;
|
|
||||||
;; Hypothesis:
|
|
||||||
;; The lower the friction is for writing tests, the more likely people will
|
|
||||||
;; write tests.
|
|
||||||
|
|
||||||
;; TODO: Support better error messages, which might include information about
|
|
||||||
;; line numbers in source code where the assertion failed.
|
|
||||||
|
|
||||||
;; TODO: Consider offering the ability to have some of these functions compile
|
|
||||||
;; to nothing at runtime if developers want to use them while developing without
|
|
||||||
;; incurring the costs at runtime.
|
|
||||||
|
|
||||||
;; TODO: Consider using this module instead of prelude.el. Right now, I'm
|
|
||||||
;; having troubling preferring one to the other. The benefit of this module is
|
|
||||||
;; that it's independent of prelude, but that might also be a downside, since
|
|
||||||
;; the messaging that asserting should be a critical part of any core library
|
|
||||||
;; like prelude.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defmacro do/assert (x)
|
|
||||||
"Errors unless X is t.
|
|
||||||
These are strict assertions and purposely do not rely on truthiness."
|
|
||||||
(let ((as-string (format "%s" x)))
|
|
||||||
`(unless (equal t ,x)
|
|
||||||
(error (concat "Assertion failed: " ,as-string)))))
|
|
||||||
|
|
||||||
(defmacro do/refute (x)
|
|
||||||
"Errors unless X is nil."
|
|
||||||
(let ((as-string (format "%s" x)))
|
|
||||||
`(unless (eq nil ,x)
|
|
||||||
(error (concat "Refutation failed: " ,as-string)))))
|
|
||||||
|
|
||||||
(provide 'do)
|
|
||||||
;;; do.el ends here
|
|
|
@ -1,98 +0,0 @@
|
||||||
;;; enum.el --- Enumerable protocol for Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Heavily influenced by Elixir.
|
|
||||||
|
|
||||||
;; I will not be implement every function in the Enum library, since I don't
|
|
||||||
;; need every function. Some of the streaming functionality may prove difficult
|
|
||||||
;; to write in Elisp. We shall see.
|
|
||||||
|
|
||||||
;; TODO: Implement the following functions:
|
|
||||||
;; - all?/2
|
|
||||||
;; - any?/2
|
|
||||||
;; - at/3
|
|
||||||
;; - chunk_by/2
|
|
||||||
;; - chunk_every/{2,3,4}
|
|
||||||
;; - chunk_while/4
|
|
||||||
;; - concat/1
|
|
||||||
;; - concat/2
|
|
||||||
;; - count/{1,2}
|
|
||||||
;; - dedup/1 # prefer calling this function dedupe
|
|
||||||
;; - dedup_by/2 # same as above
|
|
||||||
;; - drop/2
|
|
||||||
;; - drop_every/2
|
|
||||||
;; - drop_while/2
|
|
||||||
;; - each/2
|
|
||||||
;; - empty?/1
|
|
||||||
;; - fetch/2
|
|
||||||
;; - fetch!/2
|
|
||||||
;; - filter/2
|
|
||||||
;; - find/3
|
|
||||||
;; - find_index/2
|
|
||||||
;; - find_value/3
|
|
||||||
;; - flat_map/2
|
|
||||||
;; - flat_map_reduce/3
|
|
||||||
;; - group_by/3
|
|
||||||
;; - intersperse/2
|
|
||||||
;; - into/{2,3}
|
|
||||||
;; - join/2
|
|
||||||
;; - map/2
|
|
||||||
;; - map_every/3
|
|
||||||
;; - map_join/3
|
|
||||||
;; - map_reduce/3
|
|
||||||
;; - max/2
|
|
||||||
;; - max_by/3
|
|
||||||
;; - member?/2 # consider calling this contains?
|
|
||||||
;; - min/2
|
|
||||||
;; - min_by/2
|
|
||||||
;; - min_max/2 # This is a great function because of O(n) time.
|
|
||||||
;; - min_max_by/3
|
|
||||||
;; - random/1 # Consider just sample with num=1
|
|
||||||
;; - reduce/{2,3}
|
|
||||||
;; - reduce_while/3
|
|
||||||
;; - reject/2
|
|
||||||
;; - reverse/{1,2}
|
|
||||||
;; - reverse_slice/3
|
|
||||||
;; - scan/{2,3}
|
|
||||||
;; - shuffle/1
|
|
||||||
;; - slice/{2,3}
|
|
||||||
;; - sort/{1,2}
|
|
||||||
;; - sort/2
|
|
||||||
;; - sort_by/3
|
|
||||||
;; - split/2
|
|
||||||
;; - split_while/2
|
|
||||||
;; - split_with/2
|
|
||||||
;; - sum/1
|
|
||||||
;; - take/2
|
|
||||||
;; - take_every/2
|
|
||||||
;; - take_random/2 # prefer calling this function sample
|
|
||||||
;; - take_while/2
|
|
||||||
;; - to_list/1
|
|
||||||
;; - uniq/1 # prefer calling this unique
|
|
||||||
;; - uniq_by/2 # prefer calling this unique-by
|
|
||||||
;; - unzip/1
|
|
||||||
;; - with_index/2
|
|
||||||
;; - zip/{1,2}
|
|
||||||
|
|
||||||
;; TODO: Consider how to handle dispatching by type.
|
|
||||||
|
|
||||||
;; TODO: Which types should be supported herein?
|
|
||||||
;; - linked-lists
|
|
||||||
;; - associative-lists
|
|
||||||
;; - cycles
|
|
||||||
|
|
||||||
;; Warning: This module is a total work-in-progress, and it's quite possible
|
|
||||||
;; that I may never even finish it.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(defun enum/count (xs)
|
|
||||||
"Return the number of elements in `XS'."
|
|
||||||
(cond
|
|
||||||
((alist/instance? xs) (alist/count xs))
|
|
||||||
((list/instance? xs) (list/length xs)))
|
|
||||||
)
|
|
||||||
|
|
||||||
(provide 'enum)
|
|
||||||
;;; enum.el ends here
|
|
|
@ -1,119 +0,0 @@
|
||||||
;;; finance.el --- Functions to help me organize my finances -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Using functions to organize my financial thinking.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Dependencies
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(require 'prelude)
|
|
||||||
(require 'math)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defvar finance/enable-tests? t
|
|
||||||
"When t, run the tests defined herein.")
|
|
||||||
|
|
||||||
;; TODO: Support printing an org-table of these amount in a similar format to:
|
|
||||||
;; https://keisan.casio.com/exec/system/1234231998
|
|
||||||
(cl-defun finance/future-value (amt
|
|
||||||
&key
|
|
||||||
num-years
|
|
||||||
(frequency 'monthly)
|
|
||||||
(interest-rate 0.06)
|
|
||||||
(payment-due-at 'beg)
|
|
||||||
(present-value 0))
|
|
||||||
"Compute the Future Value of AMT.
|
|
||||||
|
|
||||||
This function assumes that the interest rate is applied annually and not
|
|
||||||
monthly.
|
|
||||||
|
|
||||||
This function will attempt to provide the following defaults:
|
|
||||||
- frequency: 'monthly
|
|
||||||
- interest-rate: 6%
|
|
||||||
- payment-due-at: 'beg
|
|
||||||
- present-value: 0.00"
|
|
||||||
(prelude/assert (set/contains? payment-due-at (set/new 'beg 'end)))
|
|
||||||
(prelude/assert (set/contains? frequency (set/new 'annually
|
|
||||||
'semiannually
|
|
||||||
'quarterly
|
|
||||||
'monthly)))
|
|
||||||
(let ((pmt amt)
|
|
||||||
(k (alist/get frequency '((annually . 1)
|
|
||||||
(semiannually . 2)
|
|
||||||
(quarterly . 4)
|
|
||||||
(monthly . 12))))
|
|
||||||
(r interest-rate)
|
|
||||||
(n num-years)
|
|
||||||
(pv present-value))
|
|
||||||
(if (= 0 r)
|
|
||||||
(+ pv (* pmt n k))
|
|
||||||
(if (equal 'beg payment-due-at)
|
|
||||||
(+ (* pv (math/exp (+ 1 (/ r k)) (* n k)))
|
|
||||||
(* pmt
|
|
||||||
(/ (- (math/exp (+ 1 (/ r k)) (* n k)) 1)
|
|
||||||
(/ r k))
|
|
||||||
(+ 1 (/ r k))))
|
|
||||||
(+ (* pv (math/exp (+ 1 (/ r k)) (* n k)))
|
|
||||||
(* pmt
|
|
||||||
(/ (- (math/exp (+ 1 (/ r k)) (* n k)) 1)
|
|
||||||
(/ r k))))))))
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Tests
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(when finance/enable-tests?
|
|
||||||
(prelude/assert
|
|
||||||
(equal "1551.27"
|
|
||||||
(string/format "%0.2f"
|
|
||||||
(finance/future-value
|
|
||||||
9.99
|
|
||||||
:interest-rate 0.05
|
|
||||||
:num-years 10
|
|
||||||
:frequency 'monthly
|
|
||||||
:payment-due-at 'end
|
|
||||||
:present-value 0))))
|
|
||||||
(prelude/assert
|
|
||||||
(equal "14318.34"
|
|
||||||
(string/format "%0.2f"
|
|
||||||
(finance/future-value 10.0 :num-years 35))))
|
|
||||||
(prelude/assert
|
|
||||||
(equal "4200.00"
|
|
||||||
(string/format "%0.2f"
|
|
||||||
(finance/future-value
|
|
||||||
10.0
|
|
||||||
:interest-rate 0.0
|
|
||||||
:num-years 35
|
|
||||||
:frequency 'monthly
|
|
||||||
:payment-due-at 'beg
|
|
||||||
:present-value 0))))
|
|
||||||
(prelude/assert
|
|
||||||
(equal "14318.34"
|
|
||||||
(string/format "%0.2f"
|
|
||||||
(finance/future-value
|
|
||||||
10.0
|
|
||||||
:interest-rate 0.06
|
|
||||||
:num-years 35
|
|
||||||
:frequency 'monthly
|
|
||||||
:payment-due-at 'beg
|
|
||||||
:present-value 0))))
|
|
||||||
(prelude/assert
|
|
||||||
(equal "38282.77"
|
|
||||||
(string/format "%0.2f"
|
|
||||||
(finance/future-value
|
|
||||||
10.0
|
|
||||||
:interest-rate 0.1
|
|
||||||
:num-years 35
|
|
||||||
:frequency 'monthly
|
|
||||||
:payment-due-at 'beg
|
|
||||||
:present-value 0)))))
|
|
||||||
|
|
||||||
(provide 'finance)
|
|
||||||
;;; finance.el ends here
|
|
|
@ -1,95 +0,0 @@
|
||||||
;;; iso.el --- Isomorphisms in Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Providing basic isomorphisms to improve code quality.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(require 'dotted)
|
|
||||||
(require 'tuple)
|
|
||||||
(require 'symbol)
|
|
||||||
(require 'string)
|
|
||||||
(require 'list)
|
|
||||||
(require 'alist)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(cl-defstruct iso to from x)
|
|
||||||
|
|
||||||
(defconst iso/whitelist
|
|
||||||
'((dotted . tuple)
|
|
||||||
(symbol . string))
|
|
||||||
"Alist representing supported isomorphisms.")
|
|
||||||
|
|
||||||
(defconst iso/vertices
|
|
||||||
(list/concat (alist/keys iso/whitelist)
|
|
||||||
(alist/values iso/whitelist))
|
|
||||||
"List of all of the vertices in the iso graph.")
|
|
||||||
|
|
||||||
(defun iso/classify (x)
|
|
||||||
"Return type of X."
|
|
||||||
(cond
|
|
||||||
((string/instance? x) 'string)
|
|
||||||
((symbol/instance? x) 'symbol)
|
|
||||||
((dotted/instance? x) 'dotted)
|
|
||||||
((tuple/instance? x) 'tuple)))
|
|
||||||
|
|
||||||
(cl-defun iso/exists? (to from)
|
|
||||||
"Return t if an isomorphism of TO to FROM exists."
|
|
||||||
;; TODO: All of this can be improved modelling this with a graph.
|
|
||||||
(cond
|
|
||||||
;; to -> from
|
|
||||||
((list/contains? to (alist/keys iso/whitelist))
|
|
||||||
(list/contains? from (alist/values iso/whitelist)))
|
|
||||||
;; from -> to
|
|
||||||
((list/contains? from (alist/keys iso/whitelist))
|
|
||||||
(list/contains? to (alist/values iso/whitelist)))
|
|
||||||
;; doesn't exist
|
|
||||||
(t nil)))
|
|
||||||
|
|
||||||
(progn
|
|
||||||
(prelude/assert
|
|
||||||
(iso/exists? 'symbol 'string))
|
|
||||||
(prelude/assert
|
|
||||||
(iso/exists? 'dotted 'tuple))
|
|
||||||
(prelude/refute
|
|
||||||
(iso/exists? 'dotted 'symbol))
|
|
||||||
(prelude/refute
|
|
||||||
(iso/exists? 'symbol 'list)))
|
|
||||||
|
|
||||||
;; TODO: Model this as a graph.
|
|
||||||
(defconst iso/morphisms
|
|
||||||
'((string .
|
|
||||||
'(symbol #')
|
|
||||||
))
|
|
||||||
(list (:from 'string :to 'symbol :fn #'intern)
|
|
||||||
(:from 'symbol :to 'string :fn #'symbol-name)
|
|
||||||
)
|
|
||||||
"")
|
|
||||||
|
|
||||||
(defun iso/to (f x)
|
|
||||||
"Apply F to X's to."
|
|
||||||
(->> x
|
|
||||||
iso-to))
|
|
||||||
|
|
||||||
(->> (iso/new "william" :to 'symbol)
|
|
||||||
(iso/as-to #'symbol-name)
|
|
||||||
)
|
|
||||||
|
|
||||||
(cl-defun iso/new (x &key to)
|
|
||||||
"Create a new isomorphism of X mapping to TO."
|
|
||||||
(let ((from (iso/classify x)))
|
|
||||||
(prelude/assert (iso/exists? to from))
|
|
||||||
(make-iso :from from
|
|
||||||
:to to
|
|
||||||
:x x)))
|
|
||||||
|
|
||||||
(macros/comment
|
|
||||||
(iso/new "william" :to 'symbol)
|
|
||||||
(iso/new '(one . two) :to 'tuple))
|
|
||||||
|
|
||||||
(provide 'iso)
|
|
||||||
;;; iso.el ends here
|
|
|
@ -1,45 +0,0 @@
|
||||||
;;; kaomoji.el --- Supporting kaomoji usage -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Simple keyboards like this make life a bit better.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(defvar kaomoji/install-kbds?
|
|
||||||
nil
|
|
||||||
"Set to t if you'd like the keybindings to be installed.")
|
|
||||||
|
|
||||||
(defconst kaomoji/symbols '(("Joy" . "(⌒‿⌒)")
|
|
||||||
("Love" . "(ღ˘⌣˘ღ)")
|
|
||||||
("Sympathy" . "ヽ(~_~(・_・ )ゝ")
|
|
||||||
("Dissatisfaction" . "(>﹏<)")
|
|
||||||
("Anger" . "ヽ(‵﹏´)ノ")
|
|
||||||
("Hugging" . "(づ ̄ ³ ̄)づ")
|
|
||||||
("Hiding" . "┬┴┬┴┤( ͡° ͜ʖ├┬┴┬┴")
|
|
||||||
("Sleeping" . "(-_-) zzZ")
|
|
||||||
("Embarrassed" . "(×﹏×)")
|
|
||||||
("Shrug" . "ヽ(ー_ー )ノ"))
|
|
||||||
"Alist of human-readable emotions to the kaomoji.")
|
|
||||||
|
|
||||||
;; TODO: Consider supporting a hydra for these.
|
|
||||||
|
|
||||||
(defun kaomoji/select ()
|
|
||||||
"Interactively select a kaomoji and copy it to the clipboard."
|
|
||||||
(interactive)
|
|
||||||
(ivy-read
|
|
||||||
"Select a kaomoji: "
|
|
||||||
kaomoji/symbols
|
|
||||||
:action (lambda (entry)
|
|
||||||
(kill-new (cdr entry))
|
|
||||||
(alert "Copied to clipboard!"))))
|
|
||||||
|
|
||||||
;; TODO: Define Hydra for all custom keyboards.
|
|
||||||
;; TODO: Define a better keybinding in a different keymap.
|
|
||||||
(when kaomoji/install-kbds?
|
|
||||||
(general-define-key
|
|
||||||
:keymaps 'global
|
|
||||||
"M-k" #'kaomoji/select))
|
|
||||||
|
|
||||||
(provide 'kaomoji)
|
|
||||||
;;; kaomoji.el ends here
|
|
|
@ -20,7 +20,6 @@
|
||||||
|
|
||||||
(require 'clipboard)
|
(require 'clipboard)
|
||||||
(require 'screen-brightness)
|
(require 'screen-brightness)
|
||||||
(require 'chrome)
|
|
||||||
(require 'scrot)
|
(require 'scrot)
|
||||||
(require 'ivy-clipmenu)
|
(require 'ivy-clipmenu)
|
||||||
(require 'general)
|
(require 'general)
|
||||||
|
@ -126,7 +125,6 @@
|
||||||
(keybinding/exwm "<XF86AudioLowerVolume>" #'pulse-audio/decrease-volume)
|
(keybinding/exwm "<XF86AudioLowerVolume>" #'pulse-audio/decrease-volume)
|
||||||
(keybinding/exwm "<XF86AudioRaiseVolume>" #'pulse-audio/increase-volume)
|
(keybinding/exwm "<XF86AudioRaiseVolume>" #'pulse-audio/increase-volume)
|
||||||
(keybinding/exwm "<XF86AudioMicMute>" #'pulse-audio/toggle-microphone)
|
(keybinding/exwm "<XF86AudioMicMute>" #'pulse-audio/toggle-microphone)
|
||||||
(keybinding/exwm "C-M-c" #'chrome/browse)
|
|
||||||
(keybinding/exwm (kbd/raw 'x11 "s") #'scrot/select)
|
(keybinding/exwm (kbd/raw 'x11 "s") #'scrot/select)
|
||||||
(keybinding/exwm "<C-M-tab>" #'window-manager-switch-to-exwm-buffer)
|
(keybinding/exwm "<C-M-tab>" #'window-manager-switch-to-exwm-buffer)
|
||||||
|
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
;;; keymap.el --- Working with Elisp keymaps -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Very much a work-in-progress.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
(require 'macros)
|
|
||||||
(require 'symbol)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defun keymap/pretty-print (x)
|
|
||||||
"Pretty prints `X'."
|
|
||||||
;; TODO: Work-in-progress
|
|
||||||
(s-concat "\\{" (symbol/to-string x) "}"))
|
|
||||||
|
|
||||||
(macros/comment
|
|
||||||
(keymap/pretty-print lispyville-mode-map))
|
|
||||||
|
|
||||||
(provide 'keymap)
|
|
||||||
;;; keymap.el ends here
|
|
|
@ -1,245 +0,0 @@
|
||||||
;;; me-seconds.el --- How valuable is my time? -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Inspired by Google's concept of SWE-seconds, I decided to try and compute how
|
|
||||||
;; value my personal time is.
|
|
||||||
;;
|
|
||||||
;; This library should integrate with another library that handles currency
|
|
||||||
;; conversions using locally cached data for historial values and network
|
|
||||||
;; requests for current values.
|
|
||||||
;;
|
|
||||||
;; Context sensitivity:
|
|
||||||
;; Many of the values herein are based on my values that are a function of the
|
|
||||||
;; year, my current salary, my current company holiday policy, and my current
|
|
||||||
;; country holiday policy. As such, many of these constants need to be updated
|
|
||||||
;; whenever changes occur in order for these functions to be useful.
|
|
||||||
;;
|
|
||||||
;; Units of time:
|
|
||||||
;; - seconds
|
|
||||||
;; - minutes
|
|
||||||
;; - hours
|
|
||||||
;; - days
|
|
||||||
;; - weeks
|
|
||||||
;; - months
|
|
||||||
;; - years
|
|
||||||
;;
|
|
||||||
;; Wish list:
|
|
||||||
;; - I should create a money.el struct to work with herein. This module would
|
|
||||||
;; expose basic algebra for working with money structs, which would be handy.
|
|
||||||
;; - I should create a time.el struct for working with hours in the day. I'd
|
|
||||||
;; like to be able to do (+ 9:15 17:45) cleanly.
|
|
||||||
;;
|
|
||||||
;; Terminology:
|
|
||||||
;; SWE hours give an order of magnitude approximation to the cost of resources
|
|
||||||
;; in dollars per hour at 2115 hours per year.
|
|
||||||
;; - SWE hour (SWEh)
|
|
||||||
;; - SWE year (SWEy)
|
|
||||||
;; - SWE nominal
|
|
||||||
;; - SWE opportunity
|
|
||||||
;;
|
|
||||||
;; Other isomorphisms include:
|
|
||||||
;; - Borg GCU
|
|
||||||
;; - Borg RAM
|
|
||||||
;; - Tape (library)
|
|
||||||
;; - Tape (vault)
|
|
||||||
;; - Spindles (low latency)
|
|
||||||
;; - Spindles (throughput)
|
|
||||||
;; - Spindles (throughput)
|
|
||||||
;; - Tape (throughput)
|
|
||||||
;; - SWE (nominal)
|
|
||||||
;; - SWE (opportunity)
|
|
||||||
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Dependencies
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(require 'macros)
|
|
||||||
(require 'string)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Constants
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defun me-seconds/salary (amt)
|
|
||||||
"Return the yearly rate of AMT of money in GBP.
|
|
||||||
f :: Integer -> Rate"
|
|
||||||
(make-rate :money (make-money :whole amt :fractional 0 :currency 'GBP)
|
|
||||||
:unit 'year))
|
|
||||||
|
|
||||||
(defconst me-seconds/salary (me-seconds/salary 80000)
|
|
||||||
"My salary in GBP.")
|
|
||||||
|
|
||||||
;; TODO: Consider changing these into units of time.
|
|
||||||
(defconst me-seconds/months-per-year 12
|
|
||||||
"Number of months in a year.")
|
|
||||||
|
|
||||||
(defconst me-seconds/days-per-year 365
|
|
||||||
"Number of days in a year.")
|
|
||||||
|
|
||||||
(defconst me-seconds/hours-per-year (* 24 me-seconds/days-per-year)
|
|
||||||
"Number of hours in a year.")
|
|
||||||
|
|
||||||
(defconst me-seconds/minutes-per-year (* 60 me-seconds/hours-per-year)
|
|
||||||
"Number of minutes in a year.")
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Vacation
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defconst me-seconds/bank-holidays-per-year 8
|
|
||||||
"Number of bank holidays in the UK each year.")
|
|
||||||
|
|
||||||
(defconst me-seconds/pto-days-vacation-per-year 25
|
|
||||||
"Number of days of paid-time-off I receive each year in the UK.")
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Sleeping
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defconst me-seconds/sleeping-hours-per-day 8
|
|
||||||
"An approximation of the number of hours I sleep each night on average.")
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Waking
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defconst me-seconds/waking-hours-per-day
|
|
||||||
(- 24 me-seconds/sleeping-hours-per-night)
|
|
||||||
"An approximation of the number of hours I sleep each night on average.")
|
|
||||||
|
|
||||||
;; TODO: Adjust this for vacation time.
|
|
||||||
(defconst me-seconds/waking-hours-per-year
|
|
||||||
(* me-seconds/waking-hours-per-day me-seconds/days-per-year)
|
|
||||||
"The number of hours that I work each year.")
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Working
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defconst me-seconds/working-hours-per-day
|
|
||||||
(- 17 9)
|
|
||||||
"An approximation of the number of hours I work each weekday on average.
|
|
||||||
Note that this differs from the assumed SWE hours per day calculation, which
|
|
||||||
assumes 9 working hours. See the discussion about this of go/rules-of-thumb.")
|
|
||||||
|
|
||||||
(defconst me-seconds/working-hours-per-year 2115
|
|
||||||
"This number is borrowed from go/rules-of-thumb.")
|
|
||||||
|
|
||||||
;; Keep in mind that the following classifications of time:
|
|
||||||
;; - 9:00-17:00 M-F. Is this more expensive than time sleeping?
|
|
||||||
;; - Weekend
|
|
||||||
;; - Weekday
|
|
||||||
;; - Working hours
|
|
||||||
;; - Waking hours
|
|
||||||
;; - Sleeping hours
|
|
||||||
;; - Vacation hours
|
|
||||||
;;
|
|
||||||
;; TODO: Consider tax implications (i.e. after-tax amounts and pre-tax amounts).
|
|
||||||
;;
|
|
||||||
;; Should these all be treated the same since they all pull from the same pot of
|
|
||||||
;; time? Or perhaps there are multiples involved? Much to think about. How does
|
|
||||||
;; Google handle this?
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
;; Supported currencies:
|
|
||||||
;; - GBP
|
|
||||||
;; NOTE: Amount is an integer.
|
|
||||||
(cl-defstruct money whole fractional currency)
|
|
||||||
(cl-defstruct rate money unit)
|
|
||||||
|
|
||||||
;; TODO: Add to money.el.
|
|
||||||
(defun money/to-string (x)
|
|
||||||
"Return the string representation of X.
|
|
||||||
f :: Money -> String"
|
|
||||||
(let ((currency (money-currency x))
|
|
||||||
(whole (int-to-string (money-whole x)))
|
|
||||||
(fract (int-to-string (money-fractional x))))
|
|
||||||
(pcase currency
|
|
||||||
('GBP (string/concat "£" whole "." fract))
|
|
||||||
('USD (string/concat "$" whole "." fract))
|
|
||||||
(_ (error (string/concat
|
|
||||||
"Currency: \""
|
|
||||||
(symbol-name currency)
|
|
||||||
"\" not supported"))))))
|
|
||||||
|
|
||||||
(macros/comment
|
|
||||||
(money/to-string
|
|
||||||
(make-money :whole 100 :fractional 99 :currency 'GBP)))
|
|
||||||
|
|
||||||
;; TODO: Add to rate.el.
|
|
||||||
(defun rate/to-string (x)
|
|
||||||
"Message X as a rate.
|
|
||||||
f :: Rate -> String"
|
|
||||||
(string/concat
|
|
||||||
(money/to-string (rate-money x))
|
|
||||||
" / "
|
|
||||||
(pcase (rate-unit x)
|
|
||||||
('second "sec")
|
|
||||||
('minute "min")
|
|
||||||
('hour "hr")
|
|
||||||
('day "day")
|
|
||||||
('week "week")
|
|
||||||
('month "month")
|
|
||||||
('year "year"))))
|
|
||||||
|
|
||||||
(macros/comment
|
|
||||||
(rate/to-string
|
|
||||||
(make-rate
|
|
||||||
:money (make-money :whole 10 :fractional 10 :currency 'GBP)
|
|
||||||
:unit 'day)))
|
|
||||||
|
|
||||||
;; TODO: Move this to math.el?
|
|
||||||
(defun ensure-float (x)
|
|
||||||
"Ensures X is treated as a float."
|
|
||||||
(+ 0.0 x))
|
|
||||||
|
|
||||||
;; TODO: Move these to basic time mapping module.
|
|
||||||
;; TODO: Consider making this an isomorphism.
|
|
||||||
(defun minutes/to-hours (x)
|
|
||||||
"Convert X minutes to n hours."
|
|
||||||
(/ x 60.0))
|
|
||||||
|
|
||||||
(defun hours/to-minutes (x)
|
|
||||||
"Convert X hours to n minutes."
|
|
||||||
(* x 60))
|
|
||||||
|
|
||||||
(defun days/to-minutes (x)
|
|
||||||
"Convert X days to n minutes."
|
|
||||||
(* x 24 60))
|
|
||||||
|
|
||||||
(defun weeks/to-minutes (x)
|
|
||||||
"Convert X weeks to n minutes."
|
|
||||||
(* x 7 24 60))
|
|
||||||
|
|
||||||
(defun months/to-minutes (x)
|
|
||||||
"Convert X months to n minutes.
|
|
||||||
This approximates the number of days in a month to 30."
|
|
||||||
(* x 30 24 60))
|
|
||||||
|
|
||||||
;; TODO: Support algebraic functions with money structs.
|
|
||||||
;; TODO: Support isomorphisms for rates to other units of time. That would
|
|
||||||
;; subsume most of this module's use.
|
|
||||||
(defun me-seconds/value-per-minute (salary)
|
|
||||||
"Computes my value per minute based on my current SALARY.
|
|
||||||
Signature: f :: Rate -> Rate
|
|
||||||
This is assuming that all of my time is equally valuable. See the above
|
|
||||||
discussion about the various classifications of my time.")
|
|
||||||
|
|
||||||
;; TODO: See note above about isomorphisms between various rates.
|
|
||||||
(defun me-seconds/value (salary x)
|
|
||||||
"Compute the value of X minutes of my time at my current SALARY.
|
|
||||||
f :: Rate -> Integer -> Money")
|
|
||||||
|
|
||||||
(macros/comment
|
|
||||||
(rate/to-string me-seconds/salary)
|
|
||||||
)
|
|
||||||
|
|
||||||
(provide 'me-seconds)
|
|
||||||
;;; me-seconds.el ends here
|
|
|
@ -1,30 +0,0 @@
|
||||||
;;; monoid.el --- Working with Monoids in Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; The day has finally arrived where I'm using Monoids in Elisp.
|
|
||||||
;;
|
|
||||||
;; The monoid typeclass is as follows:
|
|
||||||
;; - empty :: a
|
|
||||||
;; - concat :: (list a) -> a
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;; TODO: Consider a prelude version that works for all Elisp types.
|
|
||||||
(defun monoid/classify (xs)
|
|
||||||
"Return the type of `XS'."
|
|
||||||
(cond
|
|
||||||
((listp xs) 'list)
|
|
||||||
((vectorp xs) 'vector)
|
|
||||||
((stringp xs) 'string)))
|
|
||||||
|
|
||||||
|
|
||||||
(defun monoid/empty (xs)
|
|
||||||
"Return the empty monoid for the type `XS'."
|
|
||||||
(pcase (monoid/classify xs)
|
|
||||||
('list '())
|
|
||||||
('vector [])
|
|
||||||
('string "")))
|
|
||||||
|
|
||||||
(provide 'monoid)
|
|
||||||
;;; monoid.el ends here
|
|
|
@ -1,41 +0,0 @@
|
||||||
;;; playback.el --- Control playback with Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; As you know, my whole universe is turning Elisp, so this should too!
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Dependencies
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(require 'prelude)
|
|
||||||
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
;; Library
|
|
||||||
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
||||||
|
|
||||||
(defun playback/prev ()
|
|
||||||
"Move to the previous song."
|
|
||||||
(interactive)
|
|
||||||
(prelude/start-process
|
|
||||||
:name "playback/prev"
|
|
||||||
:command "playerctl previous"))
|
|
||||||
|
|
||||||
(defun playback/next ()
|
|
||||||
"Move to the next song."
|
|
||||||
(interactive)
|
|
||||||
(prelude/start-process
|
|
||||||
:name "playback/next"
|
|
||||||
:command "playerctl next"))
|
|
||||||
|
|
||||||
(defun playback/play-pause ()
|
|
||||||
"Play or pause the current song."
|
|
||||||
(interactive)
|
|
||||||
(prelude/start-process
|
|
||||||
:name "playback/play-pause"
|
|
||||||
:command "playerctl play-pause"))
|
|
||||||
|
|
||||||
(provide 'playback)
|
|
||||||
;;; playback.el ends here
|
|
|
@ -1,37 +0,0 @@
|
||||||
;;; polymorphism.el --- Sketching my ideas for polymorphism in Elisp -*- lexical-binding: t -*-
|
|
||||||
;; Author: William Carroll <wpcarro@gmail.com>
|
|
||||||
|
|
||||||
;;; Commentary:
|
|
||||||
;; Once again: modelled after Elixir.
|
|
||||||
|
|
||||||
;;; Code:
|
|
||||||
|
|
||||||
;; More sketches of Elisp polymorphism initiative.
|
|
||||||
;;
|
|
||||||
;; Two macros:
|
|
||||||
;; - `defprotocol'
|
|
||||||
;; - `definstance'
|
|
||||||
;;
|
|
||||||
;; Is it just a coincidence that these two macros have the same number of
|
|
||||||
;;characters or is that fate? I say fate.
|
|
||||||
;;
|
|
||||||
;; (defprotocol monoid
|
|
||||||
;; :functions (empty concat))
|
|
||||||
;;
|
|
||||||
;; (definstance monoid vector
|
|
||||||
;; :empty
|
|
||||||
;; (lambda () [])
|
|
||||||
;; :concat
|
|
||||||
;; #'vector/concat)
|
|
||||||
;;
|
|
||||||
;; More sketching...
|
|
||||||
;; (defun monoid/empty ()
|
|
||||||
;; "Sketch."
|
|
||||||
;; (funcall #'(,(monoid/classify)/empty)))
|
|
||||||
;; (defun monoid/concat (xs)
|
|
||||||
;; "Sketch."
|
|
||||||
;; (apply #'(,(monoid/classify)/concat) args))
|
|
||||||
|
|
||||||
|
|
||||||
(provide 'polymorphism)
|
|
||||||
;;; polymorphism.el ends here
|
|
Loading…
Add table
Reference in a new issue