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
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
28 , tags = sort (symbol_separated_list ',' tags)
29 , lengte= fromString length
30 , land = sort (symbol_separated_list ',' countries)
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
36 = (alle_groepen nummersDB,world)
40 alle_groepen :: [Nummer] -> [String]
41 alle_groepen db = abort "alle_groepen nog niet geimplementeerd\n"
43 alle_jaarblokken :: [Nummer] -> [String]
44 alle_jaarblokken db = abort "alle_jaarblokken nog niet geimplementeerd\n"
46 alle_albums_van :: String [Nummer] -> [(Int,String)]
47 alle_albums_van band db = abort "alle_albums_van nog niet geimplementeerd\n"
49 alle_tracks :: String String [Nummer] -> [(Int,String,T)]
50 alle_tracks cd band db = abort "alle_tracks nog niet geimplementeerd\n"
52 speelduur_albums :: [Nummer] -> [(T,String,String)]
53 speelduur_albums db = abort "speelduur_albums nog niet geimplementeerd\n"
55 totale_speelduur :: [Nummer] -> T
56 totale_speelduur db = abort "totale_speelduur nog niet geimplementeerd\n"
58 nederlandse_metal :: [Nummer] -> [String]
59 nederlandse_metal db = abort "nederlandse_metal nog niet geimplementeerd\n"
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.
66 // filelines leest alle regels in van file.
67 filelines :: !*File -> (![String],!*File)
69 # (end,file) = fend file
71 # (line,file) = freadline file
72 # (lines,file) = filelines file
75 // initString verwijdert laatste teken aan het einde van een regel.
76 initString :: !String -> String
77 initString str = str%(0,size str-2)
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}]]
82 n > 0 /\ m >= 0 /\ k <= n
84 collect :: !Int ![x] -> [[x]]
86 | length groupN < n = []
87 | otherwise = [groupN:collect n list`]
89 (groupN,list`) = splitAt n list
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)]