(*
Class: DateRange
Package: com.waysysweb.util
Author: W. Shaffer
Date: 13-Nov-2006
Description:
This structure extends the set class to provide certain funtions specific
to date sets.
Maintenance:
Date Author Description
----------- ------ -----------------------------------------------------------
13-Nov-2006 Shaffer File created
*)
structure DATERANGE = struct
(*============ Exceptions ==============================================*)
exception DateSetException of string;
(*============ Imports =============================================*)
(* Set imports *)
type ''a Set = ''a SET.Set;
fun add(set : ''a Set, item : ''a) : ''a Set = SET.add(set, item);
fun fetch(set : ''a Set) : ''a = SET.fetch(set);
fun remove(set : ''a Set, item : ''a) : ''a Set = SET.remove(set, item);
fun isEmpty(set : ''a Set) : bool = SET.isEmpty(set);
val empty = SET.empty;
(* Date imports *)
type WayDate = WAYDATE.WayDate;
fun increment(date1 : WayDate) : WayDate = WAYDATE.increment(date1);
fun compare(date1 : WayDate, date2 : WayDate) : order =
WAYDATE.compare(date1, date2);
(*============ Types =============================================*)
type DateSet = WayDate Set;
(*============ Constants ==============================================*)
(*============ Properties ==============================================*)
(*============ Attributes =============================================*)
(*============ Invariant =============================================*)
(*============ Initialization ==========================================*)
(*============ Operations =============================================*)
(* return a set of dates with every date starting at the from date to *)
(* the through date *)
(* Precondition: true *)
(* Postcondition: if compare(fromDate, date) != LESS andalso *)
(* compare(thruDate, date) != GREATER *)
(* then date inset range(fromDate, thruDate) *)
(* else date notinset range(fromDate, thruDate) *)
fun range(fromDate : WayDate, thruDate : WayDate) : DateSet =
if compare(fromDate, thruDate) = GREATER
then empty
else add(range(increment(fromDate), thruDate), fromDate);
(* return the maximum date in a date set that satifies a predicate *)
fun maxInSet([] : DateSet, pred : WayDate -> bool, current : WayDate) :
WayDate = current
| maxInSet(set : DateSet, pred : WayDate -> bool, current : WayDate) :
WayDate =
let
val nextDate = fetch(set);
val rest = remove(set, nextDate);
in
if pred(nextDate) andalso (compare(nextDate, current) = GREATER)
then maxInSet(rest, pred, nextDate)
else maxInSet(rest, pred, current)
end;
(* return the maximum date in a date set that satifies a predicate *)
fun max(set : DateSet, pred : WayDate -> bool) : WayDate =
if isEmpty(set) then raise DateSetException("max: set is empty")
else
let
val date = fetch(set);
val rest = remove(set, date)
in
maxInSet(rest, pred, date)
end;
end (* DATERANGE *)