1 module cif.utils;
2 
3 import std.algorithm : filter, map;
4 import std.array : array;
5 import std.conv : to;
6 import std.datetime.date : DayOfWeek, TimeOfDay;
7 import std.range : enumerate;
8 
9 package int twoToFourYear(int year)
10 {
11     return year >= 60 ? 1900 + year : 2000 + year;
12 }
13 
14 unittest
15 {
16     assert(twoToFourYear(80) == 1980);
17     assert(twoToFourYear(12) == 2012);
18 }
19 
20 private DayOfWeek[] weekDays = [
21     DayOfWeek.mon, DayOfWeek.tue, DayOfWeek.wed, DayOfWeek.thu, DayOfWeek.fri,
22     DayOfWeek.sat, DayOfWeek.sun
23 ];
24 
25 package DayOfWeek[] daysRunning(string days)
26 {
27     return days.enumerate.filter!(a => a.value == '1').map!(a => weekDays[a.index]).array();
28 }
29 
30 unittest
31 {
32     assert(daysRunning("1111100") == [DayOfWeek.mon, DayOfWeek.tue,
33             DayOfWeek.wed, DayOfWeek.thu, DayOfWeek.fri]);
34 
35     assert(daysRunning("0000011") == [DayOfWeek.sat, DayOfWeek.sun]);
36 }
37 
38 package TimeOfDay parseTime(string time)
39 {
40     int hour = to!int(time[0 .. 2]);
41     int minute = to!int(time[2 .. 4]);
42 
43     if (time.length == 4)
44     {
45         return TimeOfDay(hour, minute, 0);
46     }
47 
48     return TimeOfDay(hour, minute, time[4] == 'H' ? 30 : 0);
49 }
50 
51 unittest
52 {
53     assert(parseTime("1536H") == TimeOfDay(15, 36, 30));
54     assert(parseTime("1215 ") == TimeOfDay(12, 15, 0));
55     assert(parseTime("1340") == TimeOfDay(13, 40, 0));
56 }