summaryrefslogtreecommitdiff
path: root/fp2/week1/mart/SimpleFileIO.icl
blob: b2a483a8978430d42e1da215c337a71ad43de389 (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
implementation module SimpleFileIO

import StdEnv, StdFile, StdOverloaded, StdMaybe

// 1.
readFile	:: String                 *env -> (Maybe String,  *env) | FileSystem env
readFile s env
# (ss, env) = readLines s env
| ss == Nothing = (Nothing, env)
| otherwise = (Just (foldl (+++) "" (fromJust ss)), env)

writeFile	:: String String          *env -> (Bool,          *env) | FileSystem env
writeFile fn s env
# (ok, outfile, env) = fopen fn FWriteText env
| not ok = (False, env)
# outfile = fwrites s outfile
# (ok, env) = fclose outfile env
| otherwise = (ok, env)

// 2.
readLines	:: String                 *env -> (Maybe [String],*env) | FileSystem env
readLines s env
# (ok, infile, env) = sfopen s FReadText env
| not ok = (Nothing, env)
| otherwise = (Just (fst (readLines` infile)), env)
where
	readLines` :: File -> ([String], File)
	readLines` file 
	| sfend file = ([], file)
	# (line, file) = sfreadline file
	# (ss, file) = readLines` file
	| otherwise = ([line : ss], file)

writeLines	:: String [String]        *env -> (Bool,          *env) | FileSystem env
writeLines fn ss env = writeFile fn (foldl (+++) "" [s +++ "\n" \\ s <- ss]) env

// 3.
//mapFile		:: String String (a -> b) *env -> (Bool,          *env) | FileSystem env & ... a & ... b