added practicum files, updated gitignore
[fp1415.git] / files / practicum / FQL.icl
1 module FQL
2
3 import StdEnv
4 import StdT
5 import Group
6
7 :: Nummer = { groep :: String // De naam van de groep
8 , album :: String // De naam van het album
9 , jaar :: Int // Het jaar van uitgave
10 , track :: Int // Track nummer van het nummer (1 ..)
11 , titel :: String // Naam van het nummer
12 , tags :: [String] // Beschrijvende tags van het nummer / album
13 , lengte:: T // Lengte van het nummer
14 , land :: [String] // Land van oorsprong van groep
15 }
16
17 Start world
18 # (ok,dbs,world) = fopen "Nummers.dbs" FReadText world
19 | not ok = abort "Kon bestand 'Nummers.dbs' niet openen."
20 # (inhoud,dbs) = filelines dbs
21 # (ok,world) = fclose dbs world
22 | not ok = abort "Kon bestand 'Nummers.dbs' niet sluiten na lezen."
23 # nummersDB = [ { groep = group
24 , album = cd
25 , jaar = toInt year
26 , track = toInt track
27 , titel = title
28 , tags = sort (symbol_separated_list ',' tags)
29 , lengte= fromString length
30 , land = sort (symbol_separated_list ',' countries)
31 }
32 \\ [_,group,cd,year,track,title,tags,length,countries] <- collect (nr_of_fields+1) // verzamel alle elementen van een entry
33 (drop (nr_of_fields+1) // verwijder eerste elementen (headers)
34 (map initString inhoud)) // verwijder alle \n
35 ]
36 = (alle_groepen nummersDB,world)
37 where
38 nr_of_fields = 8
39
40 alle_groepen :: [Nummer] -> [String]
41 alle_groepen db = abort "alle_groepen nog niet geimplementeerd\n"
42
43 alle_jaarblokken :: [Nummer] -> [String]
44 alle_jaarblokken db = abort "alle_jaarblokken nog niet geimplementeerd\n"
45
46 alle_albums_van :: String [Nummer] -> [(Int,String)]
47 alle_albums_van band db = abort "alle_albums_van nog niet geimplementeerd\n"
48
49 alle_tracks :: String String [Nummer] -> [(Int,String,T)]
50 alle_tracks cd band db = abort "alle_tracks nog niet geimplementeerd\n"
51
52 speelduur_albums :: [Nummer] -> [(T,String,String)]
53 speelduur_albums db = abort "speelduur_albums nog niet geimplementeerd\n"
54
55 totale_speelduur :: [Nummer] -> T
56 totale_speelduur db = abort "totale_speelduur nog niet geimplementeerd\n"
57
58 nederlandse_metal :: [Nummer] -> [String]
59 nederlandse_metal db = abort "nederlandse_metal nog niet geimplementeerd\n"
60
61
62 /* De volgende functies zijn nodig in de Start functie om het bestand 'Nummers.dbs' in te lezen.
63 Je hoeft op dit moment nog niet te begrijpen wat hier staat.
64 */
65
66 // filelines leest alle regels in van file.
67 filelines :: !*File -> (![String],!*File)
68 filelines file
69 # (end,file) = fend file
70 | end = ([],file)
71 # (line,file) = freadline file
72 # (lines,file) = filelines file
73 = ([line:lines],file)
74
75 // initString verwijdert laatste teken aan het einde van een regel.
76 initString :: !String -> String
77 initString str = str%(0,size str-2)
78
79 /* collect n [x_1, ..., x_n, x_{n+1}, ... x_{2n}, ..., x_{mn+1} ... x_{mn+k}]
80 = [[x_1, ..., x_n], [x_{n+1}, ... x_{2n}], ..., [x_{(m-1)n+1} ... x_{mn}]]
81 waar:
82 n > 0 /\ m >= 0 /\ k <= n
83 */
84 collect :: !Int ![x] -> [[x]]
85 collect n list
86 | length groupN < n = []
87 | otherwise = [groupN:collect n list`]
88 where
89 (groupN,list`) = splitAt n list
90
91 symbol_separated_list :: !Char !String -> [String]
92 symbol_separated_list c str
93 = filter (\str -> str <> "" && str <> (toString c)) [toString cs \\ cs <- group ((==) c) (fromString str)]