diff options
author | William Carroll <wpcarro@gmail.com> | 2022-11-25T06·26-0800 |
---|---|---|
committer | wpcarro <wpcarro@gmail.com> | 2022-11-25T07·27+0000 |
commit | 40eca908574a20caaaa61de6ea63db294dc85ab3 (patch) | |
tree | 60042d0d18f21a7f43d2fef9b2e94b36bf6e9318 /users/wpcarro/emacs/pkgs/vector/vector.el | |
parent | cc411ec60a529fb32e1adaa9c250e30bea53a58b (diff) |
feat(wpcarro/emacs): Package vector.el r/5315
Paying-off more packaging debt... Change-Id: Ide641229d6c8efe70c0fd6c625d07aa1a3be98a0 Reviewed-on: https://cl.tvl.fyi/c/depot/+/7395 Tested-by: BuildkiteCI Reviewed-by: wpcarro <wpcarro@gmail.com>
Diffstat (limited to 'users/wpcarro/emacs/pkgs/vector/vector.el')
-rw-r--r-- | users/wpcarro/emacs/pkgs/vector/vector.el | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/users/wpcarro/emacs/pkgs/vector/vector.el b/users/wpcarro/emacs/pkgs/vector/vector.el new file mode 100644 index 000000000000..87f38d7d93e2 --- /dev/null +++ b/users/wpcarro/emacs/pkgs/vector/vector.el @@ -0,0 +1,58 @@ +;;; vector.el --- Working with Elisp's Vector data type -*- lexical-binding: t -*- + +;; Author: William Carroll <wpcarro@gmail.com> +;; Version: 0.0.1 +;; Package-Requires: ((emacs "25.1")) + +;;; Commentary: +;; It might be best to think of Elisp vectors as tuples in languages like +;; Haskell or Erlang. +;; +;; Not surprisingly, this API is modelled after Elixir's Tuple API. +;; +;; Some Elisp trivia: +;; - "Array": Usually means vector or string. +;; - "Sequence": Usually means list or "array" (see above). +;; +;; It might be a good idea to think of Array and Sequence as typeclasses in +;; Elisp. This is perhaps more similar to Elixir's notion of the Enum protocol. +;; +;; Intentionally not supporting a to-list function, because tuples can contain +;; heterogenous types whereas lists should contain homogenous types. + +;;; Code: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Library +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun vector-concat (&rest args) + "Return a new vector composed of all vectors in `ARGS'." + (apply #'vconcat args)) + +(defun vector-prepend (x xs) + "Add `X' to the beginning of `XS'." + (vector-concat `[,x] xs)) + +(defun vector-append (x xs) + "Add `X' to the end of `XS'." + (vector-concat xs `[,x])) + +(defun vector-get (i xs) + "Return the value in `XS' at index, `I'." + (aref xs i)) + +(defun vector-set (i v xs) + "Set index `I' to value `V' in `XS'. +Returns a copy of `XS' with the updates." + (let ((copy (vconcat [] xs))) + (aset copy i v) + copy)) + +(defun vector-set! (i v xs) + "Set index `I' to value `V' in `XS'. +This function mutates XS." + (aset xs i v)) + +(provide 'vector) +;;; vector.el ends here |