From a7d5aa431c2e02652ca15dacce4b7f81268eeb85 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Thu, 5 Dec 2013 11:36:06 -0500 Subject: Add basic year/month/day/hour/minute/second <-> time functions. --- lib/ur/basis.urs | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'lib/ur') diff --git a/lib/ur/basis.urs b/lib/ur/basis.urs index 4931c97a..804f15b9 100644 --- a/lib/ur/basis.urs +++ b/lib/ur/basis.urs @@ -167,6 +167,15 @@ val diffInMilliseconds : time -> time -> int val timef : string -> time -> string (* Uses strftime() format string *) val readUtc : string -> option time +(* Takes a year, month, day, hour, minute, second. *) +val fromDatetime : int -> int -> int -> int -> int -> int -> time +val datetimeYear : time -> int +val datetimeMonth : time -> int +val datetimeDay : time -> int +val datetimeHour : time -> int +val datetimeMinute: time -> int +val datetimeSecond : time -> int + (** * Encryption *) -- cgit v1.2.3 From 3e814081cc04b2048a8f882a832890cc39332d79 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Thu, 5 Dec 2013 11:36:46 -0500 Subject: Basic datetime library. --- Makefile.am | 13 ++++++------- lib/ur/datetime.ur | 26 ++++++++++++++++++++++++++ lib/ur/datetime.urs | 12 ++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) create mode 100644 lib/ur/datetime.ur create mode 100644 lib/ur/datetime.urs (limited to 'lib/ur') diff --git a/Makefile.am b/Makefile.am index d626c267..652296ea 100644 --- a/Makefile.am +++ b/Makefile.am @@ -95,13 +95,12 @@ if USE_EMACS endif uninstall-local-main: - rm -f $(DESTDIR)$(BIN)/urweb \ - $(DESTDIR)$(LIB_UR)/basis.urs $(DESTDIR)$(LIB_UR)/char.urs $(DESTDIR)$(LIB_UR)/listPair.urs $(DESTDIR)$(LIB_UR)/list.urs \ - $(DESTDIR)$(LIB_UR)/monad.urs $(DESTDIR)$(LIB_UR)/option.urs $(DESTDIR)$(LIB_UR)/string.urs $(DESTDIR)$(LIB_UR)/top.urs \ - $(DESTDIR)$(LIB_UR)/char.ur $(DESTDIR)$(LIB_UR)/listPair.ur $(DESTDIR)$(LIB_UR)/list.ur \ - $(DESTDIR)$(LIB_UR)/monad.ur $(DESTDIR)$(LIB_UR)/option.ur $(DESTDIR)$(LIB_UR)/string.ur $(DESTDIR)$(LIB_UR)/top.ur \ - $(DESTDIR)$(LIB_JS)/urweb.js \ - $(DESTDIR)$(INCLUDE)/config.h $(DESTDIR)$(INCLUDE)/queue.h $(DESTDIR)$(INCLUDE)/request.h $(DESTDIR)$(INCLUDE)/types.h \ + rm -f $(DESTDIR)$(BIN)/urweb $(DESTDIR)$(LIB_UR)/basis.urs $(DESTDIR)$(LIB_UR)/char.urs $(DESTDIR)$(LIB_UR)/datetime.urs \ + $(DESTDIR)$(LIB_UR)/listPair.urs \ $(DESTDIR)$(LIB_UR)/list.urs $(DESTDIR)$(LIB_UR)/monad.urs \ + $(DESTDIR)$(LIB_UR)/option.urs $(DESTDIR)$(LIB_UR)/string.urs $(DESTDIR)$(LIB_UR)/top.urs $(DESTDIR)$(LIB_UR)/char.ur \ + $(DESTDIR)$(LIB_UR)/datetime.ur $(DESTDIR)$(LIB_UR)/listPair.ur $(DESTDIR)$(LIB_UR)/list.ur $(DESTDIR)$(LIB_UR)/monad.ur \ + $(DESTDIR)$(LIB_UR)/option.ur $(DESTDIR)$(LIB_UR)/string.ur $(DESTDIR)$(LIB_UR)/top.ur $(DESTDIR)$(LIB_JS)/urweb.js \ + $(DESTDIR)$(INCLUDE)/config.h $(DESTDIR)$(INCLUDE)/queue.h $(DESTDIR)$(INCLUDE)/request.h $(DESTDIR)$(INCLUDE)/types.h \ $(DESTDIR)$(INCLUDE)/urweb.h $(DESTDIR)$(INCLUDE)/types_cpp.h $(DESTDIR)$(INCLUDE)/urweb_cpp.h uninstall-local: uninstall-local-main uninstall-emacs diff --git a/lib/ur/datetime.ur b/lib/ur/datetime.ur new file mode 100644 index 00000000..56c29724 --- /dev/null +++ b/lib/ur/datetime.ur @@ -0,0 +1,26 @@ +type datetime = { + Year : int, + Month : int, + Day : int, + Hour : int, + Minute : int, + Second : int +} + +fun toTime dt : time = fromDatetime dt.Year dt.Month dt.Day + dt.Hour dt.Minute dt.Second + +fun fromTime t : datetime = { + Year = datetimeYear t, + Month = datetimeMonth t, + Day = datetimeDay t, + Hour = datetimeHour t, + Minute = datetimeMinute t, + Second = datetimeSecond t +} + +fun datetimef fmt dt : string = timef fmt (toTime dt) + +val now : transaction datetime = + n <- now; + return (fromTime n) diff --git a/lib/ur/datetime.urs b/lib/ur/datetime.urs new file mode 100644 index 00000000..9d99b9e3 --- /dev/null +++ b/lib/ur/datetime.urs @@ -0,0 +1,12 @@ +type datetime = { Year : int, + Month : int, + Day : int, + Hour : int, + Minute : int, + Second : int + } + +val toTime : datetime -> time +val fromTime : time -> datetime +val datetimef : string -> datetime -> string +val now : transaction datetime -- cgit v1.2.3 From 80481a810d22d3354caca3c354e4bebd22dbbc80 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Thu, 5 Dec 2013 11:36:54 -0500 Subject: Day of week functions. --- lib/ur/basis.urs | 1 + lib/ur/datetime.ur | 12 ++++++++++++ lib/ur/datetime.urs | 5 +++++ src/c/urweb.c | 5 +++++ 4 files changed, 23 insertions(+) (limited to 'lib/ur') diff --git a/lib/ur/basis.urs b/lib/ur/basis.urs index 804f15b9..36d2effa 100644 --- a/lib/ur/basis.urs +++ b/lib/ur/basis.urs @@ -175,6 +175,7 @@ val datetimeDay : time -> int val datetimeHour : time -> int val datetimeMinute: time -> int val datetimeSecond : time -> int +val datetimeDayOfWeek : time -> int (** * Encryption *) diff --git a/lib/ur/datetime.ur b/lib/ur/datetime.ur index 56c29724..a633dc83 100644 --- a/lib/ur/datetime.ur +++ b/lib/ur/datetime.ur @@ -7,6 +7,18 @@ type datetime = { Second : int } +datatype day_of_week = Sunday | Monday | Tuesday | Wednesday | Thursday | + Friday | Saturday + +val show = mkShow (fn dow => case dow of + Sunday => "Sunday" + | Monday => "Monday" + | Tuesday => "Tuesday" + | Wednesday => "Wednesday" + | Thursday => "Thursday" + | Friday => "Friday" + | Saturday => "Saturday") + fun toTime dt : time = fromDatetime dt.Year dt.Month dt.Day dt.Hour dt.Minute dt.Second diff --git a/lib/ur/datetime.urs b/lib/ur/datetime.urs index 9d99b9e3..0d8e8c28 100644 --- a/lib/ur/datetime.urs +++ b/lib/ur/datetime.urs @@ -6,6 +6,11 @@ type datetime = { Year : int, Second : int } +datatype day_of_week = Sunday | Monday | Tuesday | Wednesday | Thursday | + Friday | Saturday + +val show : show day_of_week + val toTime : datetime -> time val fromTime : time -> datetime val datetimef : string -> datetime -> string diff --git a/src/c/urweb.c b/src/c/urweb.c index cb71aa15..fb6d28c6 100644 --- a/src/c/urweb.c +++ b/src/c/urweb.c @@ -3894,6 +3894,11 @@ uw_Basis_int uw_Basis_datetimeSecond(uw_context ctx, uw_Basis_time time) { return tm.tm_sec; } +uw_Basis_int uw_Basis_datetimeDayOfWeek(uw_context ctx, uw_Basis_time time) { + struct tm tm; + gmtime_r(&time.seconds, &tm); + return tm.tm_wday; +} void *uw_get_global(uw_context ctx, char *name) { -- cgit v1.2.3 From d9b57cd6aa45c541b00e4cf7c1f710ac412bc243 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Sat, 7 Dec 2013 21:31:51 -0500 Subject: Add day-of-week/month <-> int conversion functions. --- lib/ur/datetime.ur | 113 +++++++++++++++++++++++++++++++++++++++++++++------- lib/ur/datetime.urs | 33 ++++++++++----- 2 files changed, 121 insertions(+), 25 deletions(-) (limited to 'lib/ur') diff --git a/lib/ur/datetime.ur b/lib/ur/datetime.ur index a633dc83..6d995d89 100644 --- a/lib/ur/datetime.ur +++ b/lib/ur/datetime.ur @@ -1,37 +1,120 @@ -type datetime = { +datatype day_of_week = Sunday | Monday | Tuesday | Wednesday | Thursday | + Friday | Saturday + +val show_day_of_week = mkShow (fn dow => case dow of + Sunday => "Sunday" + | Monday => "Monday" + | Tuesday => "Tuesday" + | Wednesday => "Wednesday" + | Thursday => "Thursday" + | Friday => "Friday" + | Saturday => "Saturday") + +fun dayOfWeekToInt dow = case dow of + Sunday => 0 + | Monday => 1 + | Tuesday => 2 + | Wednesday => 3 + | Thursday => 4 + | Friday => 5 + | Saturday => 6 + +fun intToDayOfWeek i = case i of + 0 => Sunday + | 1 => Monday + | 2 => Tuesday + | 3 => Wednesday + | 4 => Thursday + | 5 => Friday + | 6 => Saturday + | n => error Invalid day of week {[n]} + +val eq_day_of_week = mkEq (fn a b => dayOfWeekToInt a = dayOfWeekToInt b) + + +datatype month = January | February | March | April | May | June | July | + August | September | October | November | December + +val show_month = mkShow (fn m => case m of + January => "January" + | February => "February" + | March => "March" + | April => "April" + | May => "May" + | June => "June" + | July => "July" + | August => "August" + | September => "September" + | October => "October" + | November => "November" + | December => "December") + +type t = { Year : int, - Month : int, + Month : month, Day : int, Hour : int, Minute : int, Second : int } -datatype day_of_week = Sunday | Monday | Tuesday | Wednesday | Thursday | - Friday | Saturday +fun monthToInt m = case m of + January => 0 + | February => 1 + | March => 2 + | April => 3 + | May => 4 + | June => 5 + | July => 6 + | August => 7 + | September => 8 + | October => 9 + | November => 10 + | December => 11 -val show = mkShow (fn dow => case dow of - Sunday => "Sunday" - | Monday => "Monday" - | Tuesday => "Tuesday" - | Wednesday => "Wednesday" - | Thursday => "Thursday" - | Friday => "Friday" - | Saturday => "Saturday") +fun intToMonth i = case i of + 0 => January + | 1 => February + | 2 => March + | 3 => April + | 4 => May + | 5 => June + | 6 => July + | 7 => August + | 8 => September + | 9 => October + | 10 => November + | 11 => December + | n => error Invalid month number {[n]} -fun toTime dt : time = fromDatetime dt.Year dt.Month dt.Day +val eq_month = mkEq (fn a b => monthToInt a = monthToInt b) + + +fun toTime dt : time = fromDatetime dt.Year (monthToInt dt.Month) dt.Day dt.Hour dt.Minute dt.Second fun fromTime t : datetime = { Year = datetimeYear t, - Month = datetimeMonth t, + Month = intToMonth (datetimeMonth t), Day = datetimeDay t, Hour = datetimeHour t, Minute = datetimeMinute t, Second = datetimeSecond t } -fun datetimef fmt dt : string = timef fmt (toTime dt) +fun format fmt dt : string = timef fmt (toTime dt) + +fun dayOfWeek dt : day_of_week = + case datetimeDayOfWeek (toTime dt) of + 0 => Sunday + | 1 => Monday + | 2 => Tuesday + | 3 => Wednesday + | 4 => Thursday + | 5 => Friday + | 6 => Saturday + | n => error Illegal day of week {[n]} + val now : transaction datetime = n <- now; diff --git a/lib/ur/datetime.urs b/lib/ur/datetime.urs index 0d8e8c28..2fc2998b 100644 --- a/lib/ur/datetime.urs +++ b/lib/ur/datetime.urs @@ -1,17 +1,30 @@ -type datetime = { Year : int, - Month : int, - Day : int, - Hour : int, - Minute : int, - Second : int - } - datatype day_of_week = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday -val show : show day_of_week +datatype month = January | February | March | April | May | June | July | + August | September | October | November | December + + +type datetime = { + Year : int, + Month : month, + Day : int, + Hour : int, + Minute : int, + Second : int +} + +val show_day_of_week : show day_of_week +val show_month : show month +val eq_day_of_week : eq day_of_week +val eq_month : eq month +val dayOfWeekToInt : day_of_week -> int +val intToDayOfWeek : int -> day_of_week +val monthToInt : month -> int +val intToMonth : int -> month val toTime : datetime -> time val fromTime : time -> datetime -val datetimef : string -> datetime -> string +val format : string -> datetime -> string +val dayOfWeek : datetime -> day_of_week val now : transaction datetime -- cgit v1.2.3 From 862c1768fa9eca1bf2afdaf0c8cf0b3cfd74f0c5 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Sun, 8 Dec 2013 03:25:31 -0500 Subject: Rename datetime type to t in the .urs file. --- lib/ur/datetime.urs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'lib/ur') diff --git a/lib/ur/datetime.urs b/lib/ur/datetime.urs index 2fc2998b..26ee795a 100644 --- a/lib/ur/datetime.urs +++ b/lib/ur/datetime.urs @@ -5,7 +5,7 @@ datatype month = January | February | March | April | May | June | July | August | September | October | November | December -type datetime = { +type t = { Year : int, Month : month, Day : int, @@ -23,8 +23,8 @@ val intToDayOfWeek : int -> day_of_week val monthToInt : month -> int val intToMonth : int -> month -val toTime : datetime -> time -val fromTime : time -> datetime -val format : string -> datetime -> string -val dayOfWeek : datetime -> day_of_week -val now : transaction datetime +val toTime : t -> time +val fromTime : time -> t +val format : string -> t -> string +val dayOfWeek : t -> day_of_week +val now : transaction t -- cgit v1.2.3 From e77a9942be6069301a0786f20646afa8a7dcd4f5 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Sun, 8 Dec 2013 13:14:58 -0500 Subject: Finish datetime -> t rename --- lib/ur/datetime.ur | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib/ur') diff --git a/lib/ur/datetime.ur b/lib/ur/datetime.ur index 6d995d89..dbc68da1 100644 --- a/lib/ur/datetime.ur +++ b/lib/ur/datetime.ur @@ -93,7 +93,7 @@ val eq_month = mkEq (fn a b => monthToInt a = monthToInt b) fun toTime dt : time = fromDatetime dt.Year (monthToInt dt.Month) dt.Day dt.Hour dt.Minute dt.Second -fun fromTime t : datetime = { +fun fromTime t : t = { Year = datetimeYear t, Month = intToMonth (datetimeMonth t), Day = datetimeDay t, @@ -116,6 +116,6 @@ fun dayOfWeek dt : day_of_week = | n => error Illegal day of week {[n]} -val now : transaction datetime = +val now : transaction t = n <- now; return (fromTime n) -- cgit v1.2.3 From 9dd4f9479ae62645b9150b37d3ae42512d1efff1 Mon Sep 17 00:00:00 2001 From: Patrick Hurst Date: Mon, 9 Dec 2013 19:19:12 -0500 Subject: Add datetime functions for adding time intervals. --- lib/ur/datetime.ur | 25 ++++++++++++++++++++++++- lib/ur/datetime.urs | 8 ++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) (limited to 'lib/ur') diff --git a/lib/ur/datetime.ur b/lib/ur/datetime.ur index dbc68da1..676f141f 100644 --- a/lib/ur/datetime.ur +++ b/lib/ur/datetime.ur @@ -102,6 +102,9 @@ fun fromTime t : t = { Second = datetimeSecond t } +val ord_datetime = mkOrd { Lt = fn a b => toTime a < toTime b, + Le = fn a b => toTime a <= toTime b } + fun format fmt dt : string = timef fmt (toTime dt) fun dayOfWeek dt : day_of_week = @@ -115,7 +118,27 @@ fun dayOfWeek dt : day_of_week = | 6 => Saturday | n => error Illegal day of week {[n]} - val now : transaction t = n <- now; return (fromTime n) + +(* Normalize a datetime. This will convert, e.g., January 32nd into February + 1st. *) + +fun normalize dt = fromTime (toTime dt) +fun addToField [nm :: Name] [rest ::: {Type}] [[nm] ~ rest] + (delta : int) (r : $([nm = int] ++ rest)) + : $([nm = int] ++ rest) = + (r -- nm) ++ {nm = r.nm + delta} + + +(* Functions for adding to a datetime. There is no addMonths or addYears since + it's not clear what should be done; what's 1 month after January 31, or 1 + year after February 29th? + + These can't all be defined in terms of addSeconds because of leap seconds. *) + +fun addSeconds n dt = normalize (addToField [#Second] n dt) +fun addMinutes n dt = normalize (addToField [#Minute] n dt) +fun addHours n dt = normalize (addToField [#Hour] n dt) +fun addDays n dt = normalize (addToField [#Day] n dt) diff --git a/lib/ur/datetime.urs b/lib/ur/datetime.urs index 26ee795a..972f86bf 100644 --- a/lib/ur/datetime.urs +++ b/lib/ur/datetime.urs @@ -14,6 +14,8 @@ type t = { Second : int } +val ord_datetime : ord t + val show_day_of_week : show day_of_week val show_month : show month val eq_day_of_week : eq day_of_week @@ -28,3 +30,9 @@ val fromTime : time -> t val format : string -> t -> string val dayOfWeek : t -> day_of_week val now : transaction t +val normalize : t -> t + +val addSeconds : int -> t -> t +val addMinutes : int -> t -> t +val addHours : int -> t -> t +val addDays : int -> t -> t -- cgit v1.2.3