Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/examples/line-frequency/frequency.nct

frequency.nct

use std/io.{File, Reader, print}

use std/num.usize_to_string

use std/path.Utf8Path

use std/process.arg

use std/string.String

see ./index.nct

func run(): i32! {
    let requested: &str = arg(1)? otherwise {
        print("usage: line-frequency PATH NEEDLE\n")?
        return 2
    }
    let requested_needle: &str = arg(2)? otherwise {
        print("usage: line-frequency PATH NEEDLE\n")?
        return 2
    }
    let path = Utf8Path.new(requested)?
    var file = File.open(&path)?
    let text = file.read_to_string()?

    var frequencies: Map<String, usize> = Map.empty()
    var unique: Set<String> = Set.empty()
    var line_count: usize = 0
    for line in text.lines() {
        line_count += 1
        let key = String.copy(line)
        if frequencies.contains_key(&key) {
            frequencies[&key] += 1
        } else {
            let _ = frequencies.insert(move key, 1)
        }
        let _ = unique.insert(String.copy(line))
    }

    let needle = String.copy(requested_needle)
    let matching = if frequencies.contains_key(&needle) {
        frequencies[&needle]
    } else {
        0
    }
    let lines_text = usize_to_string(line_count)
    let unique_text = usize_to_string(unique.len())
    let matching_text = usize_to_string(matching)
    let output = String.concat(
        "lines: ",
        &lines_text,
        "\nunique: ",
        &unique_text,
        "\nmatching: ",
        &matching_text,
        "\n",
    )
    print(&output)?
    return 0
}