diff options
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | haunt/utils.scm | 58 |
2 files changed, 59 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index c9f0a3a..74419d0 100644 --- a/Makefile.am +++ b/Makefile.am @@ -41,6 +41,7 @@ godir=$(libdir)/guile/2.0/ccache SOURCES = \ haunt/config.scm \ + haunt/utils.scm \ haunt/post.scm \ haunt/reader.scm \ haunt/page.scm \ 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)))) + |