Moving all of my Emacs-related files into their own directory at the root of this repository.
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			EmacsLisp
		
	
	
	
	
	
| ;;; 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
 |