summaryrefslogtreecommitdiff
path: root/assignment-7/DateExtensions.icl
diff options
context:
space:
mode:
authorCamil Staps2017-10-29 17:03:54 +0100
committerCamil Staps2017-10-29 17:04:00 +0100
commitecb18466abbab1aab1b3b2b8a22258003dc99d58 (patch)
treef64a083321dd3e58a8a208ba7a6e7dcbe13aa29b /assignment-7/DateExtensions.icl
parentStart with assignment 7 (diff)
Add showAppointments tryouts with SVG, nicer makeAppointment, proposeAppointment stub
Diffstat (limited to 'assignment-7/DateExtensions.icl')
-rw-r--r--assignment-7/DateExtensions.icl62
1 files changed, 62 insertions, 0 deletions
diff --git a/assignment-7/DateExtensions.icl b/assignment-7/DateExtensions.icl
new file mode 100644
index 0000000..fa9ebb0
--- /dev/null
+++ b/assignment-7/DateExtensions.icl
@@ -0,0 +1,62 @@
+implementation module DateExtensions
+
+import _SystemArray
+from StdFunc import flip
+
+from Data.Func import $
+import System.Time
+
+import iTasks
+import iTasks.Extensions.DateTime
+
+derive class iTask Day
+
+instance toString Day
+where
+ toString Sunday = "Sunday"
+ toString Monday = "Monday"
+ toString Tuesday = "Tuesday"
+ toString Wednesday = "Wednesday"
+ toString Thursday = "Thursday"
+ toString Friday = "Friday"
+ toString Saturday = "Saturday"
+
+(+~) infixl 6 :: Timestamp Int -> Timestamp
+(+~) (Timestamp t) i = Timestamp (t+i)
+
+(-~) infixl 6 :: Timestamp Int -> Timestamp
+(-~) (Timestamp t) i = Timestamp (t-i)
+
+timestampToGmDate :: (Timestamp -> Date)
+timestampToGmDate = toDate o timestampToGmDateTime
+
+nextHour :: DateTime -> DateTime
+nextHour t = timestampToGmDateTime (Timestamp ts`)
+where
+ (Timestamp ts) = utcDateTimeToTimestamp t
+ ts` = ts + 3600 - (ts rem 3600)
+
+nextDay :: (Date -> Date)
+nextDay = timestampToGmDate o (flip (+~) 86400) o utcDateToTimestamp
+
+// https://en.wikipedia.org/wiki/Determination_of_the_day_of_the_week#Schwerdtfeger.27s_method
+dayOfWeek :: Date -> Day
+dayOfWeek date = days.[(d + e + f + g + g / 4) rem 7]
+where
+ days :: {Day}
+ days = {Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}
+ d = date.Date.day
+ e = {#0,3,2,5,0,3,5,1,4,6,2,4}.[date.Date.mon-1]
+ f = {#0,5,3,1}.[c rem 4]
+ (c,g) = if (date.Date.mon >= 3)
+ (y / 100, y - 100 * c)
+ ((y-1) / 100, y - 100 * c - 1)
+ y = date.Date.year
+
+previous :: Day Date -> Date
+previous day date
+| dayOfWeek date === day = date
+| otherwise = previous day $ timestampToGmDate $ minus 86400 $ utcDateToTimestamp date
+where
+ minus :: Int Timestamp -> Timestamp
+ minus i (Timestamp t) = Timestamp (t-i)