Source file file_mapper.ml
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
open CFStream
module B = Biocaml_base
type 'a t = string -> string -> f:('a -> 'a list) -> unit
exception Parse_error of string
let lines inbed outbed ~f =
In_channel.with_file inbed ~f:(fun ic ->
Out_channel.with_file outbed ~f:(fun oc ->
Lines.read ic
|> Stream.concat_map ~f:(fun x -> Stream.of_list (f x))
|> Lines.write oc
)
)
let line_mapper item_parser item_unparser infile outfile ~f =
lines infile outfile ~f:(fun line ->
match item_parser line with
| Ok item ->
List.map (f item) ~f:item_unparser
| Error msg -> raise (Parse_error msg)
)
let bed5 = B.Bed.Bed5.(line_mapper item_of_line line_of_item)
let bed5_raw = B.Bed.Bed5_raw.(line_mapper item_of_line line_of_item)