module date

 

import StdEnv, iTasks, iDataTrivial

 

// (c) MJP 2007

 

// findDate will settle a date and time between two persons that want to meet

// first a person is chosen by the person taken the initiative, person 0

// then a date is settled by the two persons by repeatedly asking each other for a convenient date

// if such a date is found both have to confirm the date and the task is finished

 

npersons = 5

 

Start world = doHtmlServer (multiUserTask npersons True (foreverTask findDate)) world

 

findDate :: Task (HtmlDate,HtmlTime)

findDate

=                       [Txt "Choose person you want to date:",Br]

                        ?>> editTask "Set" (PullDown (1,100) (0,[toString i \\ i <- [1..npersons]]))

=>> \whomPD ->    let whom = toInt(toString whomPD) in

                        [Txt "Determining date:",Br,Br]

                        ?>> findDate` whom (Date 1 1 2007,Time 9 0 0)

=>> \datetime ->  []

?>> confirm 0 whom datetime -&&- confirm whom 0 datetime

#>>               return_V datetime

where

      findDate` :: Int (HtmlDate,HtmlTime) -> Task (HtmlDate,HtmlTime)

      findDate` whom daytime

      =                             proposeDateTime daytime

=>> \daytime ->         ("Meeting Request",whom) @: determineDateTime daytime

=>> \(ok,daytime) ->    if ok (return_V daytime)

                                    (                 isOkDateTime daytime

=>> \ok ->  if ok (return_V daytime)

                                                            (newTask "findDate`" (findDate` whom daytime))

                                    )

      where

            proposeDateTime :: (HtmlDate,HtmlTime) -> Task (HtmlDate,HtmlTime)

            proposeDateTime (date,time)

            =                             [Txt "Propose a new date and time for meeting",Br,Br]

                                          ?>> editTask "Set" input

=>> \(_,date,_,time) -> return_V (date,time)

            where

                  input = (showHtml [Txt "date: "], date, showHtml [Txt "time: "], time)

 

            determineDateTime :: (HtmlDate,HtmlTime) -> Task (Bool,(HtmlDate,HtmlTime))

            determineDateTime daytime

            =                 isOkDateTime daytime

=>> \ok ->  if ok (return_V (ok,daytime))

                              (                       proposeDateTime daytime

=>> \daytime ->   return_V (ok,daytime)

                              )

 

            isOkDateTime :: (HtmlDate,HtmlTime) -> Task Bool

            isOkDateTime (date,time)

            =     [Txt ("Can we meet on the " <+++ date <+++ " at " <+++ time <+++ "?"),Br]

                  ?>>   chooseTask  [ ("Accept",return_V True)

                                    , ("Sorry", return_V False)

                                    ]

 

      confirm  :: Int Int (HtmlDate,HtmlTime) -> Task Void

      confirm me you (date,time)

      =     me @:: [Txt ("User " <+++ me <+++ " and " <+++ you <+++ " have a meeting on " <+++ date <+++ " at " <+++ time),Br,Br]

            ?>> editTask "OK" Void