core hello world / workshop / count-lines-1 / main.ml

datkin 24b06ba 

































open Core.Std

let rec build_counts counts =
  match In_channel.input_line stdin with
  | None -> counts (* EOF *)
  | Some line ->
    let count =
      match List.Assoc.find counts line with
      | None -> 0
      | Some x -> x
    in
    build_counts (List.Assoc.add counts line (count + 1))

let count_lines () =
  let counts = build_counts [] in
  let sorted_counts = List.sort ~cmp:(fun (_, x) (_, y) -> Int.descending x y) counts in
  List.iter (List.take sorted_counts 10) ~f:(fun (line, count) ->
    printf "%3d: %s\n" count line)

let count_lines_cmd =
  Command.basic
    ~summary:"Count top 10 unique lines in a file"
    Command.Spec.(
      empty
    )
    count_lines
;;

let command =
  Command.group
    ~summary:"A bunch of counting tools"
    [ "count-lines", count_lines_cmd
    ]

let () = Command.run command
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.