diff options
author | David Thompson <dthompson2@worcester.edu> | 2015-04-11 10:52:41 -0400 |
---|---|---|
committer | David Thompson <dthompson2@worcester.edu> | 2015-04-11 15:10:45 -0400 |
commit | 0b5bdd9f01705c4de45d375a3573670a88826aff (patch) | |
tree | 2f3b15d6bec91afbfef5bd7d2481432da5485f5a /haunt | |
parent | 65c6ca5f0bba24e592aace1283d2ce0375c92df9 (diff) |
Add utils module.
* haunt/utils.scm: New file.
* Makefile.am (SOURCES): Add it.
Diffstat (limited to 'haunt')
-rw-r--r-- | haunt/utils.scm | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/haunt/utils.scm b/haunt/utils.scm new file mode 100644 index 0000000..504d6e2 --- /dev/null +++ b/haunt/utils.scm @@ -0,0 +1,58 @@ +;;; Haunt --- Static site generator for GNU Guile +;;; Copyright © 2015 David Thompson <davet@gnu.org> +;;; +;;; This file is part of Haunt. +;;; +;;; Haunt 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. +;;; +;;; Haunt 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 Haunt. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Miscellaneous utility procedures. +;; +;;; Code: + +(define-module (haunt utils) + #:use-module (ice-9 ftw) + #:use-module (ice-9 match) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-26) + #:export (flatten + flat-map + string-split-at)) + +(define* (flatten lst #:optional depth) + "Return a list that recursively concatenates the sub-lists of LST, +up to DEPTH levels deep. When DEPTH is #f, the entire tree is +flattened." + (if (and (number? depth) (zero? depth)) + lst + (fold-right (match-lambda* + (((sub-list ...) memo) + (append (flatten sub-list (and depth (1- depth))) + memo)) + ((elem memo) + (cons elem memo))) + '() + lst))) + +(define (flat-map proc . lsts) + (flatten (apply map proc lsts) 1)) + +(define (string-split-at str char-pred) + (let ((i (string-index str char-pred))) + (if i + (list (string-take str i) + (string-drop str (1+ i))) + (list str)))) + |