From 8989dad5ed88d55e24d5f3047597053232068c11 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Fri, 29 Jul 2022 18:56:06 -0700 Subject: feat(wpcarro/emacs): Package string.el Mostly just a wrapper around s.el (for now?). Eventually I'd like to prune the dependency on dash.el (and maybe s.el). Change-Id: I5c2ba256524bedd93fcd13933fdbd95b1ddff6f8 Reviewed-on: https://cl.tvl.fyi/c/depot/+/6002 Reviewed-by: wpcarro Autosubmit: wpcarro Tested-by: BuildkiteCI --- users/wpcarro/emacs/.emacs.d/wpc/string.el | 110 ---------------------------- users/wpcarro/emacs/default.nix | 1 + users/wpcarro/emacs/pkgs/string/default.nix | 27 +++++++ users/wpcarro/emacs/pkgs/string/string.el | 98 +++++++++++++++++++++++++ users/wpcarro/emacs/pkgs/string/tests.el | 22 ++++++ 5 files changed, 148 insertions(+), 110 deletions(-) delete mode 100644 users/wpcarro/emacs/.emacs.d/wpc/string.el create mode 100644 users/wpcarro/emacs/pkgs/string/default.nix create mode 100644 users/wpcarro/emacs/pkgs/string/string.el create mode 100644 users/wpcarro/emacs/pkgs/string/tests.el diff --git a/users/wpcarro/emacs/.emacs.d/wpc/string.el b/users/wpcarro/emacs/.emacs.d/wpc/string.el deleted file mode 100644 index 7e3f10c75adf..000000000000 --- a/users/wpcarro/emacs/.emacs.d/wpc/string.el +++ /dev/null @@ -1,110 +0,0 @@ -;;; string.el --- Library for working with strings -*- lexical-binding: t -*- - -;; Author: William Carroll -;; Version: 0.0.1 -;; Package-Requires: ((emacs "24")) - -;;; Commentary: -;; Library for working with string. - -;;; Code: - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Dependencies -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(require 's) -(require 'dash) -;; TODO: Resolve the circular dependency that this introduces. -;; (require 'prelude) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Library -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun string-contains? (c x) - "Return t if X is in C." - (s-contains? c x)) - -(defun string-hookify (x) - "Append \"-hook\" to X." - (s-append "-hook" x)) - -(defun string-split (y x) - "Map string X into a list of strings that were separated by Y." - (s-split y x)) - -(defun string-ensure-hookified (x) - "Ensure that X has \"-hook\" appended to it." - (if (s-ends-with? "-hook" x) - x - (string-hookify x))) - -(defun string-format (x &rest args) - "Format template string X with ARGS." - (apply #'format (cons x args))) - -(defun string-concat (&rest strings) - "Joins `STRINGS' into onto string." - (apply #'s-concat strings)) - -(defun string-->symbol (string) - "Maps `STRING' to a symbol." - (intern string)) - -(defun string-<-symbol (symbol) - "Maps `SYMBOL' into a string." - (symbol-name symbol)) - -(defun string-prepend (prefix x) - "Prepend `PREFIX' onto `X'." - (s-concat prefix x)) - -(defun string-append (postfix x) - "Appen `POSTFIX' onto `X'." - (s-concat x postfix)) - -(defun string-surround (s x) - "Surrounds `X' one each side with `S'." - (->> x - (string-prepend s) - (string-append s))) - -;; TODO: Define a macro for defining a function and a test. - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Casing -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun string-caps->kebab (x) - "Change the casing of `X' from CAP_CASE to kebab-case." - (->> x - s-downcase - (s-replace "_" "-"))) - -(defun string-kebab->caps (x) - "Change the casing of X from CAP_CASE to kebab-case." - (->> x - s-upcase - (s-replace "-" "_"))) - -(defun string-lower->caps (x) - "Change the casing of X from lowercase to CAPS_CASE." - (->> x - s-upcase - (s-replace " " "_"))) - -(defun string-lower->kebab (x) - "Change the casing of `X' from lowercase to kebab-case." - (s-replace " " "-" x)) - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Predicates -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -(defun string-instance? (x) - "Return t if X is a string." - (stringp x)) - -(provide 'string) -;;; string.el ends here diff --git a/users/wpcarro/emacs/default.nix b/users/wpcarro/emacs/default.nix index af8198d51cba..78d3b1b371bb 100644 --- a/users/wpcarro/emacs/default.nix +++ b/users/wpcarro/emacs/default.nix @@ -29,6 +29,7 @@ let list maybe set + string struct zle ]) ++ diff --git a/users/wpcarro/emacs/pkgs/string/default.nix b/users/wpcarro/emacs/pkgs/string/default.nix new file mode 100644 index 000000000000..406cccdfcb58 --- /dev/null +++ b/users/wpcarro/emacs/pkgs/string/default.nix @@ -0,0 +1,27 @@ +{ pkgs, depot, ... }: + +let + string = pkgs.callPackage + ({ emacsPackages }: + emacsPackages.trivialBuild { + pname = "string"; + version = "1.0.0"; + src = ./string.el; + packageRequires = [ + emacsPackages.dash + emacsPackages.s + ]; + }) + { }; + + emacs = (pkgs.emacsPackagesFor pkgs.emacs28).emacsWithPackages (epkgs: [ + string + ]); +in +string.overrideAttrs (_old: { + doCheck = true; + checkPhase = '' + ${emacs}/bin/emacs -batch \ + -l ert -l ${./tests.el} -f ert-run-tests-batch-and-exit + ''; +}) diff --git a/users/wpcarro/emacs/pkgs/string/string.el b/users/wpcarro/emacs/pkgs/string/string.el new file mode 100644 index 000000000000..30da1805e83f --- /dev/null +++ b/users/wpcarro/emacs/pkgs/string/string.el @@ -0,0 +1,98 @@ +;;; string.el --- Library for working with strings -*- lexical-binding: t -*- + +;; Author: William Carroll +;; Version: 0.0.1 +;; Package-Requires: ((emacs "24")) + +;;; Commentary: +;; Library for working with strings. + +;;; Code: + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Dependencies +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require 's) +(require 'dash) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Library +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun string-split (y x) + "Map string X into a list of strings that were separated by Y." + (s-split y x)) + +(defun string-format (x &rest args) + "Format template string X with ARGS." + (apply #'format (cons x args))) + +(defun string-concat (&rest strings) + "Joins `STRINGS' into onto string." + (apply #'s-concat strings)) + +(defun string-to-symbol (string) + "Maps `STRING' to a symbol." + (intern string)) + +(defun string-from-symbol (symbol) + "Maps `SYMBOL' into a string." + (symbol-name symbol)) + +(defun string-prepend (prefix x) + "Prepend `PREFIX' onto `X'." + (s-concat prefix x)) + +(defun string-append (postfix x) + "Appen `POSTFIX' onto `X'." + (s-concat x postfix)) + +(defun string-surround (s x) + "Surrounds `X' one each side with `S'." + (->> x + (string-prepend s) + (string-append s))) + +;; TODO: Define a macro for defining a function and a test. + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Casing +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun string-caps->kebab (x) + "Change the casing of `X' from CAP_CASE to kebab-case." + (->> x + s-downcase + (s-replace "_" "-"))) + +(defun string-kebab->caps (x) + "Change the casing of X from CAP_CASE to kebab-case." + (->> x + s-upcase + (s-replace "-" "_"))) + +(defun string-lower->caps (x) + "Change the casing of X from lowercase to CAPS_CASE." + (->> x + s-upcase + (s-replace " " "_"))) + +(defun string-lower->kebab (x) + "Change the casing of `X' from lowercase to kebab-case." + (s-replace " " "-" x)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Predicates +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(defun string-instance? (x) + "Return t if X is a string." + (stringp x)) + +(defun string-contains? (c x) + "Return t if X is in C." + (s-contains? c x)) + +(provide 'string) +;;; string.el ends here diff --git a/users/wpcarro/emacs/pkgs/string/tests.el b/users/wpcarro/emacs/pkgs/string/tests.el new file mode 100644 index 000000000000..92290c6db803 --- /dev/null +++ b/users/wpcarro/emacs/pkgs/string/tests.el @@ -0,0 +1,22 @@ +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Dependencies +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(require 'ert) +(require 'string) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Tests +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +(ert-deftest string-caps->kebab () + (string= "foo-bar-baz" (string-caps->kebab "FOO_BAR_BAZ"))) + +(ert-deftest string-kebab->caps () + (string= "FOO_BAR_BAZ" (string-kebab->caps "foo-bar-baz"))) + +(ert-deftest string-lower->caps () + (string= "FOO_BAR_BAZ" (string-lower->caps "foo bar baz"))) + +(ert-deftest string-lower->kebab () + (string= "foo-bar-baz" (string-lower->kebab "foo bar baz"))) -- cgit 1.4.1