You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
62 lines
1.8 KiB
62 lines
1.8 KiB
(define-module (bible-tools) |
|
#:use-module (srfi srfi-1) |
|
#:use-module (srfi srfi-26) |
|
#:use-module (srfi srfi-98) |
|
#:use-module (rnrs io ports) |
|
#:use-module (rnrs bytevectors) |
|
#:export (mapcan |
|
get-bible |
|
string->bible |
|
clean-strings |
|
book |
|
chapter |
|
verse |
|
text |
|
get-book |
|
get-chapter |
|
get-verse |
|
let-bible |
|
call-with-book |
|
call-with-chapter |
|
with-bible |
|
with-book |
|
with-chapter)) |
|
|
|
(define (mapcan f l) (apply append (map f l))) |
|
(define make-bible-path |
|
(cut string-append (get-environment-variable "HOME") |
|
"/.bible/" <> ".tsv")) |
|
(define (get-bible name) |
|
(call-with-input-file (make-bible-path name) |
|
(compose utf8->string get-bytevector-all))) |
|
|
|
(define string->verse (cut string-split <> #\tab)) |
|
(define clean-strings |
|
(cut filter (compose not (cut string=? <> "")) <>)) |
|
|
|
(define string->bible |
|
(compose (cut map string->verse <>) |
|
clean-strings |
|
(cut string-split <> #\newline))) |
|
|
|
(define book first) |
|
(define chapter fourth) |
|
(define verse fifth) |
|
(define text sixth) |
|
|
|
(define (get-num query bible part) |
|
(filter (compose (cut = query <>) string->number part) bible)) |
|
(define (get-book book-name bible) |
|
(filter (compose (cut string=? book-name <>) book) bible)) |
|
(define get-chapter (cut get-num <> <> chapter)) |
|
(define get-verse (cut get-num <> <> verse)) |
|
|
|
(define (with-bible b f) |
|
(when (procedure? f) (f (string->bible (get-bible b))))) |
|
|
|
(define (call-with-book book thunk) |
|
(compose thunk (cut get-book book <>))) |
|
(define (call-with-chapter book chapter thunk) |
|
(lambda (bible) (thunk (get-chapter (string->number chapter) |
|
(get-book book bible))))) |
|
|
|
|