summaryrefslogtreecommitdiffstats
path: root/sample_files/elisp_2.el
diff options
context:
space:
mode:
Diffstat (limited to 'sample_files/elisp_2.el')
-rw-r--r--sample_files/elisp_2.el132
1 files changed, 132 insertions, 0 deletions
diff --git a/sample_files/elisp_2.el b/sample_files/elisp_2.el
new file mode 100644
index 000000000..bdf912749
--- /dev/null
+++ b/sample_files/elisp_2.el
@@ -0,0 +1,132 @@
+;;; ht.el --- The missing hash table library for Emacs
+
+;; Copyright (C) 2013 Wilfred Hughes
+
+;; Author: Wilfred Hughes <me@wilfred.me.uk>
+;; Version: 0.6
+;; Keywords: hash table, hash map, hash
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; The missing hash table utility library for Emacs.
+;;
+;; See documentation on https://github.com/Wilfred/ht.el
+
+;;; Todo:
+
+;; * Full unit tests
+
+;;; Code:
+
+(eval-when-compile (require 'cl))
+
+(defun ht-create ()
+ "Create an empty hash table."
+ (make-hash-table :test 'equal))
+
+(defun ht-from-alist (alist)
+ "Create a hash table with initial values according to ALIST."
+ (let ((h (ht-create)))
+ ;; the first key-value pair in an alist gets precedence, so we
+ ;; start from the end of the list:
+ (dolist (pair (reverse alist) h)
+ (let ((key (car pair))
+ (value (cdr pair)))
+ (ht-set h key value)))))
+
+;; based on the excellent -partition from dash.el, but we aim to be self-contained
+(defun ht/group-pairs (list)
+ "Returns a new list with the items in LIST grouped into pairs.
+Errors if LIST doesn't contain an even number of elements."
+ (let ((result)
+ (sublist)
+ (len 0))
+
+ (while list
+ ;; take the head of LIST and push onto SUBLIST
+ (setq sublist (cons (car list) sublist))
+ (setq list (cdr list))
+
+ (setq len (1+ len))
+
+ (when (= len 2)
+ ;; push this two-item list onto RESULT
+ (setq result (cons (nreverse sublist) result))
+ (setq sublist nil)
+ (setq len 0)))
+
+ (when sublist (error "Expected an even number of elements"))
+ (nreverse result)))
+
+(defun ht-from-plist (plist)
+ "Create a hash table with initial values according to PLIST."
+ (let ((h (ht-create)))
+ (dolist (pair (ht/group-pairs plist) h)
+ (let ((key (first pair))
+ (value (second pair)))
+ (ht-set h key value)))))
+
+(defun ht-from-alist (alist)
+ "Create a hash table with initial values according to ALIST."
+ (let ((h (ht-create)))
+ (dolist (pair alist h)
+ (let ((key (car pair))
+ (value (cdr pair)))
+ (ht-set h key value)))))
+
+(defun ht-get (table key &optional default)
+ "Look up KEY in TABLE, and return the matching value.
+If KEY isn't present, return DEFAULT (nil if not specified)."
+ (gethash key table default))
+
+(defun ht-set (table key value)
+ "Associate KEY in TABLE with VALUE."
+ (puthash key value table)
+ nil)
+
+(defun ht-remove (table key)
+ "Remove KEY from TABLE."
+ (remhash key table))
+
+(defun ht-clear (table)
+ "Remove all keys from TABLE."
+ (clrhash table)
+ nil)
+
+(defun ht-keys (table)
+ "Return a list of all the keys in TABLE."
+ (let ((keys))
+ (maphash (lambda (key value) (setq keys (cons key keys))) table)
+ keys))
+
+(defun ht-values (table)
+ "Return a list of all the values in TABLE."
+ (let ((values))
+ (maphash (lambda (key value) (setq values (cons value values))) table)
+ values))
+
+(defun ht-items (table)
+ "Return a list of two-element lists '(key value) from TABLE."
+ (let ((items))
+ (maphash (lambda (key value) (setq items (cons (list key value) items))) table)
+ items))
+
+(defun ht-copy (table)
+ "Return a shallow copy of TABLE (keys and values are shared)."
+ (copy-hash-table table))
+
+(provide 'ht)
+;;; ht.el ends here