Writing features for a FASTA index file. | (ns cljam.io.fasta-index.writer
(: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 | |
Makes indices data from the reader. | (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 (+ (long (: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))) | |
Makes indices from | (defn write-index!
[rdr ^FAIWriter wtr]
(let [indices (make-indices rdr)]
(write-index*! (.writer wtr) indices))) |