In bioinformatics, long character strings are often encoded in a format called FASTA.

A FASTA file can contain several strings, each identified by a name marked by a > (greater than) character at the beginning of the line.



Task

Write a program that reads a FASTA file such as:

>Rosetta_Example_1
THERECANBENOSPACE
>Rosetta_Example_2
THERECANBESEVERAL
LINESBUTTHEYALLMUST
BECONCATENATED


Output:
Rosetta_Example_1: THERECANBENOSPACE
Rosetta_Example_2: THERECANBESEVERALLINESBUTTHEYALLMUSTBECONCATENATED

Note that a high-quality implementation will not hold the entire file in memory at once; real FASTA files can be multiple gigabytes in size.




import "io" for File
 
var checkNoSpaces = Fn.new { |s| !s.contains(" ") && !s.contains("\t") }
 
var first = true
 
var process = Fn.new { |line|
    if (line[0] == ">") {
        if (!first) System.print()
        System.write("%(line[1..-1]): ")
        if (first) first = false
    } else if (first) {
        Fiber.abort("File does not begin with '>'.")
    } else if (checkNoSpaces.call(line)) {
        System.write(line)
    } else {
        Fiber.abort("Sequence contains space(s).")
    }
}
 
var fileName = "input.fasta"
File.open(fileName) { |file|
    var offset = 0
    var line = ""
    while(true) {
        var b = file.readBytes(1, offset)
        offset = offset + 1
        if (b == "\n") {
            process.call(line)
            line = "" // reset line variable
        } else if (b == "\r") { // Windows
            // wait for following "\n"
        } else if (b == "") { // end of stream
            System.print()
            return
        } else {
            line = line + b
        }
    }
}