ushalow
[clean-tests.git] / old / afp / a4 / skeleton4.icl
1 module skeleton4
2
3 import iTasks
4
5 /*
6 Pieter Koopman, pieter@cs.ru.nl
7 Advanced Programming. Skeleton for assignment 4 in 2018
8 - use this a project with environment iTasks
9 - executable must be in Examples/iTasks or a subdirectory
10 You can also use the -sdk commandline flag to set the path
11 */
12
13 :: Student =
14 { name :: String
15 , snum :: Int
16 , bama :: BaMa
17 , year :: Int
18 }
19
20 :: BaMa = Bachelor | Master
21
22 students :: [Student]
23 students =
24 [{name = "Alice"
25 ,snum = 1000
26 ,bama = Master
27 ,year = 1
28 }
29 ,{name = "Bob"
30 ,snum = 1003
31 ,bama = Master
32 ,year = 1
33 }
34 ,{name = "Carol"
35 ,snum = 1024
36 ,bama = Master
37 ,year = 2
38 }
39 ,{name = "Dave"
40 ,snum = 2048
41 ,bama = Master
42 ,year = 1
43 }
44 ,{name = "Eve"
45 ,snum = 4096
46 ,bama = Master
47 ,year = 1
48 }
49 ,{name = "Frank"
50 ,snum = 1023
51 ,bama = Master
52 ,year = 1
53 }
54 ]
55
56 student :: Student
57 student = students !! 0
58
59 derive class iTask Student, BaMa
60 derive gToString Student, BaMa
61
62 generic gToString a :: a -> String
63 gToString{|Int|} i = toString i
64 gToString{|String|} s = s
65 gToString{|UNIT|} _ = ""
66 gToString{|RECORD|} fx (RECORD x) = "{" + fx x + "}"
67 gToString{|FIELD of {gfd_name}|} fx (FIELD x) = gfd_name + "=" + fx x + " "
68 gToString{|PAIR|} fx fy (PAIR x y) = fx x + fy y
69 gToString{|EITHER|} fx fy (LEFT x) = fx x
70 gToString{|EITHER|} fx fy (RIGHT y) = fy y
71 gToString{|CONS of {gcd_name}|} fx (CONS x) = gcd_name + fx x
72 gToString{|OBJECT|} fx (OBJECT x) = fx x
73
74 instance + String where + s t = s +++ t
75
76 Start w = doTasks (changeNameEdcomb student) w
77
78 enterStudent :: Task Student
79 enterStudent = enterInformation "Enter a student" []
80
81 enterStudentList :: Task [Student]
82 enterStudentList = enterInformation "Enter a student" []
83
84 updateStudent :: (Student -> Task Student)
85 updateStudent = updateInformation "Update a student" []
86
87 selectStudent :: ([Student] -> Task Student)
88 selectStudent = enterChoice "Pick a student" []
89
90 selectStudentOnlyName :: ([Student] -> Task Student)
91 selectStudentOnlyName = enterChoice "Pick a student" [ChooseFromDropdown \{Student|name}->name]
92
93 selectStudentFormat :: ([Student] -> Task Student)
94 selectStudentFormat = enterChoice "Pick a student" [ChooseFromDropdown gToString{|*|}]
95
96 selectPartner :: ([Student] -> Task [Student])
97 selectPartner = enterMultipleChoice "Pick a partner" [ChooseFromDropdown \{name,bama}->name + "(" + gToString{|*|} bama + ")"]
98
99 changeName :: Student -> Task Student
100 changeName s
101 = viewInformation "Student to change" [] s
102 ||- updateInformation "New name" [UpdateAs (\{Student|name}->name) (\s n->{Student | s & name=n})] s
103
104 changeNameEdcomb :: Student -> Task Student
105 changeNameEdcomb s
106 = updateInformation "New name" [UpdateUsing id (\_ v->v) nameEditor] s
107 where
108 nameEditor :: Editor Student
109 nameEditor = bijectEditorValue
110 (\{name=n,snum=s,bama=b,year=y}->(n, s, b, y))
111 (\(n,s,b,y)->{name=n,snum=s,bama=b,year=y})
112 (container4
113 (gEditor{|*|} <<@ labelAttr "name")
114 (withChangedEditMode toView gEditor{|*|} <<@ labelAttr "snum")
115 (withChangedEditMode toView gEditor{|*|} <<@ labelAttr "bama")
116 (withChangedEditMode toView gEditor{|*|} <<@ labelAttr "year")
117 )
118
119 toView (Update a) = View a
120 toView v = v