# MokuHazushi's solution

## to Grade School in the OCaml Track

Published at Nov 22 2019 · 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)

let student_list = Map.find my_school grade in
match student_list with
| Some l -> Map.set my_school ~key:grade ~data:(List.sort (student::l) String.compare)
;;

let student_list = Map.find my_school grade in
match student_list with
| None -> []
| Some l -> l
;;

let sorted (my_school: school) : school =
Map.map my_school (fun student_list -> List.sort student_list String.compare)
;;

let roster (my_school: school) : string list =
let key_list = List.sort (Map.keys my_school) Int.compare in
List.fold key_list ~init:[] ~f:(fun acc key -> List.append acc (grade key my_school))
;;``````