assignment 12 WIP
[ap2015.git] / a4 / charlie / skeleton4.icl
1 module skeleton4
2
3 /*
4 Advanced Programming.
5 Skeleton for assignment 4.
6 To be used in a project with the environment iTasks.
7 Pieter Koopman, pieter@cs.ru.nl
8 */
9
10 import StdArray
11 import iTasks
12
13 :: Idea = { title :: String, desc :: Maybe Note }
14 :: Name :== String
15
16 :: FullIdea = { user :: Name, number :: Int, idea :: Idea}
17 :: RawIdea = {data :: FullIdea}
18
19 :: NamedIdea = { name :: Name, ideas :: [Idea]}
20 derive class iTask NamedIdea // generic magic
21 derive class iTask Idea
22 derive class iTask FullIdea
23 derive class iTask RawIdea
24
25 doIdentified :: (Name -> Task x) -> Task x | iTask x
26 doIdentified task
27 = enterInformation "Enter your name" []
28 >>= task
29
30 editIdea :: Name -> Task (Name, [Idea])
31 editIdea name
32 = enterInformation (name +++ " add your idea") []
33 >>= \val . return (name, val)
34
35 buildOutput :: (Name, [Idea]) -> Task [RawIdea]
36 buildOutput (name, ideas) = return (buildIdeas name 1 ideas)
37
38 mainTask = doIdentified editIdea
39 >>= buildOutput
40 >>= viewInformation "The result" [ViewWith filterIdeas]
41
42 buildIdeas :: Name Int [Idea] -> [RawIdea]
43 buildIdeas _ _ [] = []
44 buildIdeas usr nr [i:xs] = [{data = {user = usr, number = nr, idea = i}} : buildIdeas usr (nr+1) xs]
45
46 filterIdeas :: [RawIdea] -> [FullIdea]
47 filterIdeas [{data = idea=:{idea = {desc = Nothing}}}:xs] = filterIdeas xs
48 filterIdeas [{data = idea=:{idea = {desc = Just d}}}:xs] | size (toString d) > 10 = [idea:filterIdeas xs]
49 | otherwise = filterIdeas xs
50 filterIdeas [] = []
51
52 Start :: *World -> *World
53 Start world = startEngine mainTask world