diff options
Diffstat (limited to 'files/practicum/FQL.icl')
-rw-r--r-- | files/practicum/FQL.icl | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/files/practicum/FQL.icl b/files/practicum/FQL.icl new file mode 100644 index 0000000..7d7a029 --- /dev/null +++ b/files/practicum/FQL.icl @@ -0,0 +1,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)]
|