d22f995321809afd6ca37c80b65eb8d417945f88
[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 idea = {creator=idea.user, title=idea.idea.ideaTitle}
51
52 viewIdeas :: String -> Task TrackedIdea
53 viewIdeas user = (enterChoiceWithShared "All ideas" [ChooseWith (AutoChoice shortIdeas)] theIdeas
54 >&^ viewSharedInformation "Selected idea" [])
55 >>* [OnAction (Action "Clear selection" []) (\value . Just (viewIdeas user)),
56 OnAction (Action "Like" []) (ifValue (notMyIdea user) (likeUserIdea user)),
57 OnAction (Action "Delete Idea" []) (hasValue (removeUserIdea user))]
58
59 deleteAll :: String -> Task [TrackedIdea]
60 deleteAll user = set [] theIdeas >>= \value . ideaSession user
61
62 ideaSession :: String -> Task [TrackedIdea]
63 ideaSession user = (forever (newIdea user >>= addIdea)
64 -||
65 viewIdeas user) >>* [OnAction (Action "Delete All" []) (\value . Just (deleteAll user))]
66
67 mainTask = userLogin >>= ideaSession
68
69 Start :: *World -> *World
70 Start world = startEngine mainTask world