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
|