From 7286ec83c3e6e9781a5e8eea3298a807764a80c5 Mon Sep 17 00:00:00 2001 From: Ben Sima Date: Sat, 9 May 2020 15:03:37 -0700 Subject: Init z --- z.scm | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 z.scm diff --git a/z.scm b/z.scm new file mode 100644 index 0000000..e897f86 --- /dev/null +++ b/z.scm @@ -0,0 +1,76 @@ +(import (Alpha Core)) +(import (Alpha String)) +(import (only (Alpha String) replace)) +(import (only (ice-9 ftw) scandir)) +(import (only (srfi srfi-1) remove)) + +;; general functions + +(define (os.listdir path) + (scandir path)) + +(define (os.path.expanduser path) + (let ([home (getenv "HOME")]) + (replace path "~" home))) + +(define (rm ls item) + (remove (/. x (eq? x item)) ls)) + +(define (set.difference s1 s2) + (cond [(null? s1) '()] + [(not (member? (first s1) s2)) + (cons (first s1) (set.difference (rest s1) s2))] + [else + (set.difference (rest s1) s2)])) + +;; z program + +(define *zdir* (os.path.expanduser "~/test-z-wiki")) + +;; A node 'id' is a monotonically increasing number. + +;; It can be represented as a string, in which case it is encoded in +;; base 36. + +(define (id->string id) + (number->string id 36)) + +(define (string->id s) + (string->number s 36)) + +;; It can be represented as a path, in which case it is +;; `<*zdir*>/.md' + +(define (path->id fname) + "Given a path, parse out the node id." + (-> fname + (replace ".md" "") + (replace *zdir* "") + (string->id))) + +(define (id->path id) + "Given an id, return the absolute path to the file." + (fmt "~a/~a.md" + *zdir* + (id->string id))) + +;; Manipulating nodes + +(define (list-nodes dir) + (->> dir + (os.listdir) + ;; remove '.' and '..' + ((/. s (set.difference s '("." "..")))) + (map path->id))) + +(define (latest-node ls) + (if (eq? ls '()) + 0 + (apply max ls))) + +(define (make-node title) + (let ([id (inc (-> *zdir* list-nodes latest-node))]) + (call-with-output-file (id->path id) + (fn [file] + (format file "title: ~a" title) + (newline file))))) -- cgit v1.2.3