afp
[clean-tests.git] / afp / a4 / skeleton4.icl
diff --git a/afp/a4/skeleton4.icl b/afp/a4/skeleton4.icl
new file mode 100644 (file)
index 0000000..af496b7
--- /dev/null
@@ -0,0 +1,119 @@
+module skeleton4\r
+\r
+import iTasks\r
+\r
+/*\r
+       Pieter Koopman, pieter@cs.ru.nl\r
+       Advanced Programming. Skeleton for assignment 4 in 2018\r
+ -     use this a project with environment iTasks\r
+ -     executable must be in Examples/iTasks or a subdirectory\r
+       You can also use the -sdk commandline flag to set the path\r
+*/\r
+\r
+:: Student =\r
+       { name :: String\r
+       , snum :: Int\r
+       , bama :: BaMa\r
+       , year :: Int\r
+       }\r
+\r
+:: BaMa = Bachelor | Master\r
+\r
+students :: [Student]\r
+students =\r
+       [{name = "Alice"\r
+        ,snum = 1000\r
+        ,bama = Master\r
+        ,year = 1\r
+        }\r
+       ,{name = "Bob"\r
+        ,snum = 1003\r
+        ,bama = Master\r
+        ,year = 1\r
+        }\r
+       ,{name = "Carol"\r
+        ,snum = 1024\r
+        ,bama = Master\r
+        ,year = 2\r
+        }\r
+       ,{name = "Dave"\r
+        ,snum = 2048\r
+        ,bama = Master\r
+        ,year = 1\r
+        }\r
+       ,{name = "Eve"\r
+        ,snum = 4096\r
+        ,bama = Master\r
+        ,year = 1\r
+        }\r
+       ,{name = "Frank"\r
+        ,snum = 1023\r
+        ,bama = Master\r
+        ,year = 1\r
+        }\r
+       ]\r
+\r
+student :: Student\r
+student = students !! 0\r
+\r
+derive class iTask Student, BaMa\r
+derive gToString Student, BaMa\r
+\r
+generic gToString a :: a -> String\r
+gToString{|Int|} i = toString i\r
+gToString{|String|} s = s\r
+gToString{|UNIT|} _ = ""\r
+gToString{|RECORD|} fx (RECORD x) = "{" + fx x + "}"\r
+gToString{|FIELD of {gfd_name}|} fx (FIELD x) = gfd_name + "=" + fx x + " "\r
+gToString{|PAIR|} fx fy (PAIR x y) = fx x + fy y\r
+gToString{|EITHER|} fx fy (LEFT x) = fx x\r
+gToString{|EITHER|} fx fy (RIGHT y) = fy y\r
+gToString{|CONS of {gcd_name}|} fx (CONS x) = gcd_name + fx x\r
+gToString{|OBJECT|} fx (OBJECT x) = fx x\r
+\r
+instance + String where + s t = s +++ t\r
+\r
+Start w = doTasks (changeName student) w\r
+\r
+enterStudent :: Task Student\r
+enterStudent = enterInformation "Enter a student" []\r
+\r
+enterStudentList :: Task [Student]\r
+enterStudentList = enterInformation "Enter a student" []\r
+\r
+updateStudent :: (Student -> Task Student)\r
+updateStudent = updateInformation "Update a student" []\r
+\r
+selectStudent :: ([Student] -> Task Student)\r
+selectStudent = enterChoice "Pick a student" []\r
+\r
+selectStudentOnlyName :: ([Student] -> Task Student)\r
+selectStudentOnlyName = enterChoice "Pick a student" [ChooseFromDropdown \s->s.Student.name]\r
+\r
+selectStudentFormat :: ([Student] -> Task Student)\r
+selectStudentFormat = enterChoice "Pick a student" [ChooseFromDropdown gToString{|*|}]\r
+\r
+selectPartner :: ([Student] -> Task [Student])\r
+selectPartner = enterMultipleChoice "Pick a partner" [ChooseFromDropdown \s->s.Student.name + "(" + gToString{|*|} s.Student.bama + ")"]\r
+\r
+changeName :: Student -> Task Student\r
+changeName s\r
+       =   viewInformation "Student to change" [] s\r
+       ||- updateInformation "New name" [UpdateAs (\s->s.Student.name) (\s n->{Student | s & name=n})] s\r
+\r
+changeNameEdcomb :: Student -> Task Student\r
+changeNameEdcomb s\r
+       =   updateInformation "New name" [UpdateUsing id (\_ v->v) studed] s\r
+where\r
+       studed :: Editor Student\r
+       studed = bijectEditorValue\r
+               (\s->(s.Student.name, s.snum, s.bama, s.year))\r
+               (\(n,s,b,y)->{name=n,snum=s,bama=b,year=y})\r
+               (container4\r
+                       gEditor{|*|}\r
+                       (withChangedEditMode toView gEditor{|*|})\r
+                       (withChangedEditMode toView gEditor{|*|})\r
+                       (withChangedEditMode toView gEditor{|*|})\r
+               )\r
+       toView (Update a) = View a\r
+       toView v = v\r