[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/HcxcWfxH)
:sectnums:
:nofooter:
:toc: left
:icons: font
:data-uri:
:source-highlighter: highlightjs
:stem: latexmath

= Col.04 -- Training

It is paramount that you are totally comfortable implementing collections based on linked nodes -- with different requirements, on your own and quickly.
This assignment consists of two more exercises for training exactly that.

NOTE: Generics are not required for these exercises, we'll come back to that topic soon

== Exam Calendar Management

You are going to implement an application which manages the exam of a school class.

* Exam information can be read from a CSV file
* Exams are stored in a list
** This list stores them _sorted_ by date
** It allows for:
*** Adding exams
*** Removing exams
*** Finding exams in a specific date range
*** Being converted into an array
* Exams have a subject, a date and a teacher
* At each day there can only be a single exam

[plantuml]
----
@startuml
hide empty methods

class Exam {
    +string? Subject [readonly]
    +DateTime Date [readonly]
    +string Teacher [readonly]
}
class Node {
    +Exam Data [readonly]
    +Node? Next

    +Node(Exam)
}
class ExamList {
    -Node? _head
    +int Count [private set]

    +bool Insert(Exam?)
    +Exam? GetAt(int)
    +Exam[] ToArray()
    +Exam[] GetExamsInInterval(DateTime, DateTime)
    +bool Remove(DateTime, out Exam?)
}

Exam "1" -u- "0..1" Node: contains
ExamList "1" -r- "0..1" Node: contains
Node -- "0..1" Node: next

@enduml
----

TIP: Extensive unit tests have been provided -- those together with the XMLDoc should guide you to the correct implementation

=== Sample Run

You have been provided with the real exam schedule from a past year.
Processing it with your application should yield the following result.

image::pics/exam_cal_sample_run.png[Exam List Sample Run,width=300]

== Doctor's Waiting Room

In this exercise you are going to implement the waiting room of a doctor's office.

* Patients arrive at different times
* They are treated in order of their arrival
* However, some patients are emergency cases, these are treated first
** Arrival order _within_ the group of emergency patients still applies
* A patient can be declared an emergency while already waiting as a 'normal' patient

[plantuml]
----
@startuml
hide empty methods

class Node {
    +Patient Data [readonly]
    +Node? Next

    +Node(Patient)
}
class Patient {
    +string Name [readonly]
    +DateTime Arrival [readonly]
    +bool IsEmergency

    +Patient(string, DateTime)
    +Patient(string, DateTime, bool)
}
class PatientQueue {
    -Node? _head
    +int Size [readonly]

    +void Enqueue(Patient)
    +Patient? Dequeue()
    +bool Remove(Patient)
}
class WaitingRoom {
    -PatientQueue _emergencyQueue [readonly]
    -PatientQueue _normalQueue [readonly]
    +int CountEmergency [readonly]
    +int CountNormal [readonly]
    +int CountAll [readonly]

    +string ToString() [override]
    +void AddPatient(Patient)
    +Patient? Next()
    +void SetPatientToEmergency(Patient)
}

Node "0..1" -u- "1" Patient: contains
Node "0..1" -l- "1" PatientQueue: contains
WaitingRoom "1" -- "2" PatientQueue: has
Node -- "0..1" Node: next

@enduml
----

* The starter code initially does not compile -- add the missing pieces in `Node` and `Patient` first
* Some unit tests have been provided