signature SET = sig type set type element val empty : set val add : set * element -> set val delete : set * element -> set val is_member : set * element -> bool val union : set * set -> set val intersection : set * set -> set (* etc. etc. *) val fold : ('a * element -> 'a) -> 'a * set -> 'a end; signature SERVER = sig type connection type server_address val open_connection : server_address -> connection val close_connection : connection -> unit end; signature DEFECT_TRACKER = sig include SERVER type issue type fix type filespec type marker type changelist type field type value structure IssueSet : SET sharing type IssueSet.element = issue structure ValueSet : SET sharing type ValueSet.element = value val changed_issues : connection -> issueSet.set * marker val mark_changed_issues_done : connection * marker -> connection val issue_human_name : connection * issue -> string (* "ENH00034" / "job000034" *) val issue_to_id : connection * issue -> string (* "33" / "job000034" *) val id_to_issue : connection * string -> issue val issue_field : connection * issue * field -> value val set_issue_field : connection * issue * field * value -> issue * connection val commit_issue : connection * issue -> connection end; signature PERFORCE = sig include DEFECT_TRACKER end; signature TEAMTRACK = sig include DEFECT_TRACKER end; functor TeamTrack ( structure TeamShareAPI : TEAMSHAREAPI ) : TEAMTRACK = struct type connection = TeamShareAPI.server type server_address = string * string * string * int (* user, password, hostname, port *) fun open_connection (user, password, hostname, port) = TeamShareAPI.connect (user, password, hostname ^ ":" ^ int_to_string(port)) fun close_connection ... val cases_table = TeamShareAPI.table("CASES") fun changed_issues connection = TeamShareAPI.query (connection, cases_table, "TS_P4DTI_RID = end; signature FIELD_MAPPING =