ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# hyphenrf's solution

## to Grade School in the OCaml Track

Published at May 02 2020 · 0 comments
Instructions
Test suite
Solution

Given students' names along with the grade that they are in, create a roster for the school.

In the end, you should be able to:

• "OK."
• Get a list of all students enrolled in a grade
• "Which students are in grade 2?"
• "We've only got Jim just now."
• Get a sorted list of all students in all grades. Grades should sort as 1, 2, 3, etc., and students within a grade should be sorted alphabetically by name.
• "Who all is enrolled in school right now?"

Note that all our students only have one name. (It's a small town, what do you want?)

## Getting Started

1. For library documentation, follow Useful OCaml resources.

## Running Tests

A `Makefile` is provided with a default target to compile your solution and run the tests. At the command line, type:

``````make
``````

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

## Feedback, Issues, Pull Requests

The exercism/ocaml repository on GitHub is the home for all of the Ocaml exercises.

If you have feedback about an exercise, or want to help implementing a new one, head over there and create an issue or submit a PR. We welcome new contributors!

## Source

A pairing session with Phil Battos at gSchool http://gschool.it

### test.ml

``````(* grade-school - 1.0.0 *)
open OUnit2

let assert_lists_equal exp got _ctx =
let printer = String.concat ";" in
assert_equal exp got ~printer

let tests = [
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
let school = empty_school |> add "Aimee" 2 in
assert_lists_equal ["Aimee"] (roster school)
);
let school = empty_school |> add "Blair" 2 |> add "James" 2 |> add "Paul" 2 in
assert_lists_equal ["Blair"; "James"; "Paul"] (roster school)
);
let school = empty_school |> add "Chelsea" 3 |> add "Logan" 7 in
assert_lists_equal ["Chelsea"; "Logan"] (roster school)
);
"Roster returns an empty list if there are no students enrolled" >:: (
let school = empty_school in
assert_lists_equal [] (roster school)
);
"Student names with grades are displayed in the same sorted roster" >:: (
let school = empty_school
assert_lists_equal ["Anna"; "Barb"; "Charlie"; "Alex"; "Peter"; "Zoe"; "Jim"] (roster school)
);
"Grade returns the students in that grade in alphabetical order" >:: (
);
"Grade returns an empty list if there are no students in that grade" >:: (
let school = empty_school in
);
(* "an empty school has no children in grade 1" >::
let s = add "Emma" 1 empty_school in
);
"an empty school does not have Emma in grade 1 after she's been added to grade 2" >::(
let s = add "Emma" 2 empty_school in
);
"an empty school has Emma, Timmy, Bob and Becky in grade 1 after they've been added to grade 1" >::(
assert_lists_equal ["Becky"; "Bob"; "Emma"; "Timmy"] (grade 1 s |> List.sort compare)
);
"a sorted school has Emma, Timmy, Bob and Becky in grade 1 in sorted order" >::(
let s = empty_school |> add "Emma" 1 |> add "Timmy" 1 |> add "Bob" 1 |> add "Becky" 1 |> sorted in
assert_lists_equal ["Becky"; "Bob"; "Emma"; "Timmy"] (grade 1 s)
); *)
]

let () =
``````open Base

module Int_map = Map.M(Int)
type school = string list Int_map.t
let empty_school = Map.empty (module Int)

match Map.find smap g with
| Some names -> names
| None -> []

let add name g smap =
Map.set smap ~key:g ~data:(name::(grade g smap))

let sorted smap =
Map.map smap ~f:(List.sort ~compare:(String.compare))

let roster smap =
sorted smap |> Map.data |> List.concat``````