forked from prozion/odysseus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
io.rkt
83 lines (69 loc) · 3.02 KB
/
io.rkt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#lang racket
(require compatibility/defmacro)
(require "hash.rkt")
(require "base.rkt")
(require "seqs.rkt")
(require "debug.rkt")
(require "regexp.rkt")
(require racket/serialize)
(provide (all-defined-out))
; (define (write-data-to-file filename v)
; (write-to-file v filename #:exists 'replace))
;
; (define var->file write-data-to-file)
(define (write-file filename v)
(display-to-file v filename #:exists 'replace))
(define (append-file filename v)
(display-to-file v filename #:exists 'append))
(define (read-file filename)
(file->string filename #:mode 'text))
(define (read-lines filename)
(file->lines filename #:mode 'text #:line-mode 'linefeed))
(define (read-file-by-lines filename)
(let ((ff (open-input-file filename #:mode 'text)))
(local ((define (read-line-iter res line)
; (sleep 0.003)
; (--- line)
(if (eof-object? line)
res
(read-line-iter (pushr res line) (read-line ff 'any)))))
(read-line-iter (list) (read-line ff 'any)))))
(define (write-file-by-lines filename alist)
(write-file filename (implode alist "\n")))
(define (write-file-to-dir #:file file #:dir dir v)
; first try thinking that dir is relative, then absolute path, if both are not directories then write to current-directory
(let* (
[dir-parts (split dir "/")]
; find and create non-existing directories
(_ (let loop ((existed empty) (nonexisted dir-parts))
(cond ((empty? nonexisted) 'end)
(else
(let ((next-directory (build-path (current-directory) (implode (pushr existed (car nonexisted)) "/"))))
(if (directory-exists? next-directory)
(loop (pushr existed (car nonexisted)) (cdr nonexisted))
(begin
(make-directory next-directory)
(loop (pushr existed (car nonexisted)) (cdr nonexisted)))))))))
[path (build-path (current-directory) dir)])
(write-file
(build-path path file)
v)))
; read data from file into the s-expression and evaluate it
(define (load-data-from-file filepath namespace)
(if (file-exists? filepath)
(parameterize ([current-namespace namespace])
(load filepath))
#f))
; read data from file into the s-expression (not used? uncomment once you meet a use of it!)
; (define (read-data-from-file filepath namespace)
; (if (file-exists? filepath)
; (read (open-input-string (read-file filepath)))
; #f))
; serializes data and save it into the file
(define (write-data-to-file data filepath)
(write-to-file (serialize data) filepath #:exists 'replace))
; read serialized data and converts it to a normal value
(define (read-serialized-data-from-file filepath)
(if (file-exists? filepath)
(deserialize (file->value filepath))
#f))