summaryrefslogtreecommitdiff
path: root/files/practicum/FQL.icl
blob: 7d7a0295bfaca6d8bc53b2b4316bfb68d9410350 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
module FQL

import StdEnv
import StdT
import Group

::  Nummer          =   { groep :: String         // De naam van de groep
                        , album :: String         // De naam van het album
                        , jaar  :: Int            // Het jaar van uitgave
                        , track :: Int            // Track nummer van het nummer (1 ..)
                        , titel :: String         // Naam van het nummer
                        , tags  :: [String]       // Beschrijvende tags van het nummer / album
                        , lengte:: T              // Lengte van het nummer
                        , land  :: [String]       // Land van oorsprong van groep
                        }

Start world
# (ok,dbs,world)	    = fopen "Nummers.dbs" FReadText world
| not ok	        	= abort "Kon bestand 'Nummers.dbs' niet openen."
# (inhoud,dbs)			= filelines dbs
# (ok,world)			= fclose dbs world
| not ok				= abort "Kon bestand 'Nummers.dbs' niet sluiten na lezen."
# nummersDB				= [  { groep = group
	                         , album = cd
	                         , jaar  = toInt year
	                         , track = toInt track
	                         , titel = title
	                         , tags  = sort (symbol_separated_list ',' tags)
	                         , lengte= fromString length
	                         , land  = sort (symbol_separated_list ',' countries)
	                         }
	                      \\ [_,group,cd,year,track,title,tags,length,countries] <- collect (nr_of_fields+1)		// verzamel alle elementen van een entry
	                                                                                (drop (nr_of_fields+1) 			// verwijder eerste elementen (headers)
	                                                                                (map initString inhoud))		// verwijder alle \n
	                      ]
= (alle_groepen nummersDB,world)
where
	nr_of_fields		= 8

alle_groepen			:: [Nummer] -> [String]
alle_groepen db			= abort "alle_groepen nog niet geimplementeerd\n"

alle_jaarblokken		:: [Nummer] -> [String]
alle_jaarblokken db		= abort "alle_jaarblokken nog niet geimplementeerd\n"

alle_albums_van			:: String [Nummer] -> [(Int,String)]
alle_albums_van band db	= abort "alle_albums_van nog niet geimplementeerd\n"

alle_tracks				:: String String [Nummer] -> [(Int,String,T)]
alle_tracks  cd band db	= abort "alle_tracks nog niet geimplementeerd\n"

speelduur_albums		:: [Nummer] -> [(T,String,String)]
speelduur_albums     db	= abort "speelduur_albums nog niet geimplementeerd\n"

totale_speelduur		:: [Nummer] -> T
totale_speelduur     db = abort "totale_speelduur nog niet geimplementeerd\n"

nederlandse_metal		:: [Nummer] -> [String]
nederlandse_metal    db = abort "nederlandse_metal nog niet geimplementeerd\n"


/*  De volgende functies zijn nodig in de Start functie om het bestand 'Nummers.dbs' in te lezen. 
    Je hoeft op dit moment nog niet te begrijpen wat hier staat.
*/

//  filelines leest alle regels in van file.
filelines				:: !*File -> (![String],!*File)
filelines file
# (end,file)			= fend file
| end                   = ([],file)
# (line,file)           = freadline file
# (lines,file)          = filelines file
= ([line:lines],file)

//  initString verwijdert laatste teken aan het einde van een regel.
initString			    :: !String -> String
initString str		    = str%(0,size str-2)

/*  collect n [x_1, ..., x_n, x_{n+1}, ... x_{2n}, ..., x_{mn+1} ... x_{mn+k}]
        = [[x_1, ..., x_n], [x_{n+1}, ... x_{2n}], ..., [x_{(m-1)n+1} ... x_{mn}]]
    waar:
        n > 0 /\ m >= 0 /\ k <= n
*/
collect					:: !Int ![x] -> [[x]]
collect n list
| length groupN < n	    = []
| otherwise			    = [groupN:collect n list`]
where
    (groupN,list`)		= splitAt n list

symbol_separated_list	:: !Char !String -> [String]
symbol_separated_list c str
						= filter (\str -> str <> "" && str <> (toString c)) [toString cs \\ cs <- group ((==) c) (fromString str)]