--- /dev/null
+module GuessWhat\r
+\r
+/* Instructions:\r
+\r
+(1) copy this main file (GuessWhat.icl), QA_shapes.(d/i)cl, and QA.(d/i)cl in the folder:\r
+ {iTasks-SDK}\Experiments\SVG_tests\\r
+ \r
+(2) create a new project and set de environment to 'iTasks'\r
+\r
+(3) Bring-Up-To-Date and start generated application\r
+\r
+(4) Open a browser and navigate to localhost.\r
+ The application creates a task that randomly selects a number of image-name pairs and asks the user to \r
+ give the right name to the right image. Once this is done correctly, the task terminates, otherwise the\r
+ user can try again.\r
+\r
+(5) Create a new set of QA-shapes. You can choose one of the following:\r
+ (i) Dutch traffic signs. See attached document:\r
+ Reglement-verkeersregels-en-verkeersteke.pdf, appendix 1, hoofdstuk A upto L.\r
+ \r
+ Implement **at least 15** traffic signs. In your solution, clearly indicate at each traffic sign \r
+ which one you have implemented (use the numbers in the right-most column in the above document).\r
+ \r
+ \r
+ (ii) European flags. See the following wikipedia page:\r
+ http://nl.wikipedia.org/wiki/Lijst_van_vlaggen_van_Europa\r
+ \r
+ Implement **at least 15** flags. In your solution, clearly indicate at each flag which one you\r
+ have implemented by the name of the nation or organization.\r
+*/\r
+\r
+import iTasks // de algemene iTask API\r
+import iTasks.API.Extensions.SVG.SVGlet // specialiseer task editors\r
+from Data.List import zipWith\r
+\r
+import QA_shapes // the QA elements that have to be guessed\r
+\r
+nr_of_qas :== 10\r
+\r
+Start :: *World -> *World\r
+Start world = startEngine [publish "/" (WebApp []) (\_ -> play queries)] world\r
+\r
+play :: [QA] -> Task String\r
+play []\r
+ = viewInformation "missing queries" [] "No queries are available"\r
+play qas\r
+ = sequence "throw dice" (repeatn (nr_of_qas + length qas) (get randomInt))\r
+ >>= \nrs -> let (nrs1,nrs2) = splitAt nr_of_qas nrs\r
+ shuffled_qas = shuffle nrs2 qas\r
+ (qs,as) = unzip (take nr_of_qas shuffled_qas)\r
+ sas = shuffle nrs1 as\r
+ in keep_guessing qs as sas\r
+\r
+keep_guessing :: [Image ()] [String] [String] -> Task String\r
+keep_guessing qs as sas\r
+ = allTasks [guess i q sas \\ q <- qs & i <- [1 ..]]\r
+ >>* [ OnAction (Action "Check" []) (hasValue (check_answers qs as sas))\r
+ , OnAction ActionQuit (always (return "Goodbye"))\r
+ ] \r
+\r
+check_answers :: [Image ()] [String] [String] [String] -> Task String\r
+check_answers qs as sas nas\r
+| ok == nr_of_qas\r
+ = viewInformation "Tada!" [] "Congratulations! All correct!"\r
+| otherwise\r
+ = (viewInformation "Ouch!" [] ("Too bad: there are " <+++ nr_of_qas - ok <+++ " mistakes.")\r
+ ||-\r
+ allTasks [ ((show_image i q <<@ ArrangeHorizontal)\r
+ ||-\r
+ (viewInformation "isn't" [] a <<@ ArrangeHorizontal)\r
+ ) <<@ ArrangeHorizontal\r
+ \\ wrong <- zipWith (<>) as nas\r
+ & q <- qs\r
+ & a <- nas\r
+ & i <- [1 ..]\r
+ | wrong\r
+ ]\r
+ ) >>* [ OnAction (Action "Try again" []) (always (keep_guessing qs as sas))\r
+ , OnAction ActionQuit (always (return "Goodbye"))\r
+ ]\r
+where\r
+ ok = length [() \\ a <- as & b <- nas | a == b]\r
+\r
+show_image :: Int (Image ()) -> Task ()\r
+show_image i q = viewInformation ("image " <+++ i) [imageView (\_ _ -> q) (\_ _ -> Nothing)] ()\r
+\r
+guess :: Int (Image ()) [String] -> Task String\r
+guess i q sas\r
+ = ( (show_image i q <<@ ArrangeHorizontal)\r
+ ||-\r
+ (enterChoice "is:" [ChooseWith (ChooseFromComboBox id)] sas <<@ ArrangeHorizontal)\r
+ ) <<@ ArrangeHorizontal\r
+\r
+shuffle :: [Int] [a] -> [a]\r
+shuffle rnrs as\r
+ = fst (unzip (sortBy (\(_,r1) (_,r2) -> r1 < r2) (zip2 as rnrs)))\r