about summary refs log tree commit diff
path: root/emacs/.emacs.d/wpc/monoid.el
blob: 401d63c4172826d580aae94db68f6f0bd349a461 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
;;; 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