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