module ap5 // Mart Lubbers s4109503 // Charlie Gerhardus s3050009 import StdList import iTasks ::Idea = { ideaTitle :: String, details :: Maybe Note } ::TrackedIdea = { user :: String, number :: Int, idea :: Idea, likes :: [String] } ::ShortIdea = { creator :: String, title :: String } derive class iTask Idea derive class iTask TrackedIdea derive class iTask ShortIdea theIdeas :: Shared [TrackedIdea] theIdeas = sharedStore "theIdeas" [] userLogin :: Task String userLogin = enterInformation "Username" [] newIdea :: String -> Task TrackedIdea newIdea user = get theIdeas >>= \ideas . (enterInformation "Got a new idea?" [] >>= \idea . return {user=user, number=length ideas, idea=idea, likes=[]}) addIdea :: TrackedIdea -> Task [TrackedIdea] addIdea idea = get theIdeas >>= \ideas . set [idea:ideas] theIdeas removeIdea :: String Int [TrackedIdea] [TrackedIdea] -> Task TrackedIdea removeIdea user nr ideas [] = set ideas theIdeas >>= \value . viewIdeas user removeIdea user nr out [idea:ideas] | idea.number == nr = removeIdea user nr out ideas | otherwise = removeIdea user nr (out++[idea]) ideas removeUserIdea :: String TrackedIdea -> Task TrackedIdea removeUserIdea user idea | idea.user == user = get theIdeas >>= removeIdea user idea.number [] | otherwise = viewIdeas user likeIdea :: String Int [TrackedIdea] [TrackedIdea] -> Task TrackedIdea likeIdea user nr ideas [] = set ideas theIdeas >>= \value . viewIdeas user likeIdea user nr out [idea:ideas] | idea.number == nr = likeIdea user nr (out++[{idea & likes=[user:idea.likes]}]) ideas | otherwise = likeIdea user nr (out++[idea]) ideas likeUserIdea :: String TrackedIdea -> Task TrackedIdea likeUserIdea user idea = get theIdeas >>= likeIdea user idea.number [] notMyIdea :: String TrackedIdea -> Bool notMyIdea user idea | idea.user == user = False | otherwise = True shortIdeas :: TrackedIdea -> ShortIdea shortIdeas idea = {creator=idea.user, title=idea.idea.ideaTitle} viewIdeas :: String -> Task TrackedIdea viewIdeas user = (enterChoiceWithShared "All ideas" [ChooseWith (AutoChoice shortIdeas)] theIdeas >&^ viewSharedInformation "Selected idea" []) >>* [OnAction (Action "Clear selection" []) (\value . Just (viewIdeas user)), OnAction (Action "Like" []) (ifValue (notMyIdea user) (likeUserIdea user)), OnAction (Action "Delete Idea" []) (hasValue (removeUserIdea user))] deleteAll :: String -> Task [TrackedIdea] deleteAll user = set [] theIdeas >>= \value . ideaSession user ideaSession :: String -> Task [TrackedIdea] ideaSession user = (forever (newIdea user >>= addIdea) -|| viewIdeas user) >>* [OnAction (Action "Delete All" []) (\value . Just (deleteAll user))] mainTask = userLogin >>= ideaSession Start :: *World -> *World Start world = startEngine mainTask world