met namen en studentnummers
[ap2015.git] / a5 / charlie / ap5.icl
1 module ap5
2 // Mart Lubbers s4109503
3 // Charlie Gerhardus s3050009
4
5 import StdList
6 import iTasks
7
8 ::Idea = { ideaTitle :: String, details :: Maybe Note }
9 ::TrackedIdea = { user :: String, number :: Int, idea :: Idea, likes :: [String] }
10 ::ShortIdea = { creator :: String, title :: String }
11
12 derive class iTask Idea
13 derive class iTask TrackedIdea
14 derive class iTask ShortIdea
15
16 theIdeas :: Shared [TrackedIdea]
17 theIdeas = sharedStore "theIdeas" []
18
19 userLogin :: Task String
20 userLogin = enterInformation "Username" []
21
22 newIdea :: String -> Task TrackedIdea
23 newIdea user = get theIdeas
24 >>= \ideas . (enterInformation "Got a new idea?" []
25 >>= \idea . return {user=user, number=length ideas, idea=idea, likes=[]})
26
27 addIdea :: TrackedIdea -> Task [TrackedIdea]
28 addIdea idea = get theIdeas >>= \ideas . set [idea:ideas] theIdeas
29
30 removeIdea :: String Int [TrackedIdea] [TrackedIdea] -> Task TrackedIdea
31 removeIdea user nr ideas [] = set ideas theIdeas >>= \value . viewIdeas user
32 removeIdea user nr out [idea:ideas] | idea.number == nr = removeIdea user nr out ideas
33 | otherwise = removeIdea user nr (out++[idea]) ideas
34
35 removeUserIdea :: String TrackedIdea -> Task TrackedIdea
36 removeUserIdea user idea | idea.user == user = get theIdeas >>= removeIdea user idea.number []
37 | otherwise = viewIdeas user
38
39 likeIdea :: String Int [TrackedIdea] [TrackedIdea] -> Task TrackedIdea
40 likeIdea user nr ideas [] = set ideas theIdeas >>= \value . viewIdeas user
41 likeIdea user nr out [idea:ideas] | idea.number == nr = likeIdea user nr (out++[{idea & likes=[user:idea.likes]}]) ideas
42 | otherwise = likeIdea user nr (out++[idea]) ideas
43
44 likeUserIdea :: String TrackedIdea -> Task TrackedIdea
45 likeUserIdea user idea = get theIdeas >>= likeIdea user idea.number []
46
47 notMyIdea :: String TrackedIdea -> Bool
48 notMyIdea user idea | idea.user == user = False
49 | otherwise = True
50
51 shortIdeas :: TrackedIdea -> ShortIdea
52 shortIdeas idea = {creator=idea.user, title=idea.idea.ideaTitle}
53
54 viewIdeas :: String -> Task TrackedIdea
55 viewIdeas user = (enterChoiceWithShared "All ideas" [ChooseWith (AutoChoice shortIdeas)] theIdeas
56 >&^ viewSharedInformation "Selected idea" [])
57 >>* [OnAction (Action "Clear selection" []) (\value . Just (viewIdeas user)),
58 OnAction (Action "Like" []) (ifValue (notMyIdea user) (likeUserIdea user)),
59 OnAction (Action "Delete Idea" []) (hasValue (removeUserIdea user))]
60
61 deleteAll :: String -> Task [TrackedIdea]
62 deleteAll user = set [] theIdeas >>= \value . ideaSession user
63
64 ideaSession :: String -> Task [TrackedIdea]
65 ideaSession user = (forever (newIdea user >>= addIdea)
66 -||
67 viewIdeas user) >>* [OnAction (Action "Delete All" []) (\value . Just (deleteAll user))]
68
69 mainTask = userLogin >>= ideaSession
70
71 Start :: *World -> *World
72 Start world = startEngine mainTask world