2020-10-24 18:59:50 +01:00
|
|
|
;;; Cube --- Cube library of FG42 -*- lexical-binding: t; -*-
|
|
|
|
;;
|
|
|
|
;; Copyright (c) 2010-2020 Sameer Rahmani & Contributors
|
|
|
|
;;
|
|
|
|
;; Author: Sameer Rahmani <lxsameer@gnu.org>
|
|
|
|
;; URL: https://gitlab.com/FG42/FG42
|
|
|
|
;; Version: 3.0.0
|
|
|
|
;;
|
|
|
|
;; 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:
|
|
|
|
;; Cubes are the building blocks of any `FG42' editor. Each `cube' is a
|
|
|
|
;; unit which defines different abilities in a deterministic and idempotent
|
|
|
|
;; way. Cubes are composable and a composition of cubes creates an editor.
|
|
|
|
;;
|
|
|
|
;;; Code:
|
2020-10-24 21:44:12 +01:00
|
|
|
|
|
|
|
(require 'seq)
|
2020-10-24 18:59:50 +01:00
|
|
|
(require 'fg42/utils)
|
|
|
|
(require 'fg42/state)
|
|
|
|
|
|
|
|
|
2021-01-27 22:49:20 +00:00
|
|
|
(defun fg42/cube-apply (state cube-value)
|
|
|
|
"Apply the given CUBE-VALUE to the given STATE.
|
2020-10-24 21:44:12 +01:00
|
|
|
It returns a new state."
|
2021-01-27 22:49:20 +00:00
|
|
|
(let ((name (assoc 'name cube-value)))
|
|
|
|
(fg42/state-run
|
|
|
|
(fg42/state-compose-states
|
|
|
|
;; insert the cube into the state
|
|
|
|
(fg42/system-register-cube name cube-value)
|
|
|
|
;; Add the dependencies of the cube to the state
|
|
|
|
(fg42/system-merge-dependencies name (assoc 'dependencies cube-value))
|
|
|
|
;; Add the keybindings of the cube to the state
|
|
|
|
(fg42/system-merge-keys name (assoc 'keys cube-value)))
|
|
|
|
state)))
|
2020-10-24 21:44:12 +01:00
|
|
|
|
|
|
|
|
|
|
|
(defun fg42/cube-bind (m1 m2)
|
|
|
|
"Bind the M1 to M2.
|
|
|
|
M1 and M2 are state monads. See `fg42/utils'"
|
|
|
|
(lambda (state)
|
2021-01-27 22:49:20 +00:00
|
|
|
(let* ((v (funcall m1 state)))
|
|
|
|
(funcall m2
|
2020-10-24 21:44:12 +01:00
|
|
|
(fg42/cube-apply
|
|
|
|
;; State
|
|
|
|
(car v)
|
|
|
|
;; Value of in the monad from M
|
|
|
|
(cdr v))))))
|
|
|
|
|
|
|
|
|
|
|
|
(defun fg42/cube-compose (cube1 cube2)
|
|
|
|
"Compose CUBE1 and CUBE2 to create a new cube.
|
|
|
|
For example `(fg42/cube-compose #\'some-cube #\'some-other-cube)'"
|
|
|
|
(lambda ()
|
|
|
|
(fg42/cube-bind
|
|
|
|
(funcall cube1)
|
|
|
|
(funcall cube2))))
|
|
|
|
|
|
|
|
|
2021-01-27 22:49:20 +00:00
|
|
|
(defun fg42/cube-empty ()
|
2020-10-24 21:44:12 +01:00
|
|
|
"Cube identity function."
|
|
|
|
(lambda (state)
|
2021-01-27 22:49:20 +00:00
|
|
|
(fg42/state-value state)))
|
2020-10-24 21:44:12 +01:00
|
|
|
|
2020-10-24 18:59:50 +01:00
|
|
|
|
2020-10-24 21:44:12 +01:00
|
|
|
(defun fg42/cubes (&rest cubes)
|
|
|
|
"Create a new cube out of the given list of CUBES."
|
|
|
|
(seq-reduce (lambda (cube1 cube2)
|
2020-10-26 19:28:34 +00:00
|
|
|
(fg42/cube-bind cube1 cube2))
|
2020-10-24 21:44:12 +01:00
|
|
|
cubes
|
2021-01-27 22:49:20 +00:00
|
|
|
(fg42/cube-empty)))
|
2020-10-24 18:59:50 +01:00
|
|
|
|
2021-01-27 22:49:20 +00:00
|
|
|
(comment
|
|
|
|
(fg42/system
|
|
|
|
(fg42/cubes
|
|
|
|
(python-cube 2 3)
|
|
|
|
(swag)
|
|
|
|
(asd))))
|
2020-10-24 18:59:50 +01:00
|
|
|
|
|
|
|
(provide 'fg42/cube)
|
|
|
|
;;; cube.el ends here
|