/
writer.clj
63 lines (57 loc) · 1.96 KB
/
writer.clj
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
(ns cljam.io.fasta-index.writer
"Writing features for a FASTA index file."
(:require [clojure.string :as cstr]
[cljam.io.fasta.util :refer [header-line? parse-header-line]])
(:import [java.io BufferedWriter]))
;;;; FAIWriter
(deftype FAIWriter [writer url]
java.io.Closeable
(close [this]
(.close ^java.io.Closeable (.writer this))))
;;;; Writing
(defn make-indices
[^java.io.BufferedReader r]
(let [indices (atom [])
current-index (atom nil)]
(loop [l (.readLine r)
pos 0]
(when-not (nil? l)
(let [llen (count l)]
(if (header-line? l)
(let [h (parse-header-line l)
i {:name (:name h)
:len 0
:offset (+ pos (inc llen))
:line-blen nil
:line-len nil}]
(when-not (nil? @current-index)
(swap! indices conj @current-index))
(reset! current-index i))
(do (swap! current-index
assoc
:len (+ (:len @current-index) llen))
(when (or (nil? (:line-blen @current-index))
(nil? (:line-len @current-index)))
(swap! current-index
assoc
:line-blen llen
:line-len (inc llen)))))
(recur (.readLine r)
(+ pos (inc llen))))))
(when-not (nil? @current-index)
(swap! indices conj @current-index))
@indices))
(defn- write-index*!
[^BufferedWriter wtr indices]
(doseq [i indices]
(.write wtr (cstr/join "\t"
[(:name i)
(:len i)
(:offset i)
(:line-blen i)
(:line-len i)]))
(.newLine wtr)))
(defn write-index!
[rdr ^FAIWriter wtr]
(let [indices (make-indices rdr)]
(write-index*! (.writer wtr) indices)))