SimpleFileIO: readFile, readLines, writeFile, writeLines
authorCamil Staps <info@camilstaps.nl>
Sat, 18 Apr 2015 20:32:29 +0000 (22:32 +0200)
committerCamil Staps <info@camilstaps.nl>
Sat, 18 Apr 2015 20:32:29 +0000 (22:32 +0200)
fp2/week1/camil/SimpleFileIO.dcl [new file with mode: 0644]
fp2/week1/camil/SimpleFileIO.icl [new file with mode: 0644]

diff --git a/fp2/week1/camil/SimpleFileIO.dcl b/fp2/week1/camil/SimpleFileIO.dcl
new file mode 100644 (file)
index 0000000..5e38af3
--- /dev/null
@@ -0,0 +1,14 @@
+definition module SimpleFileIO\r
+\r
+import StdFile, StdOverloaded, StdMaybe\r
+\r
+// 1.\r
+//readFile     :: String                 *env -> (Maybe String,  *env) | FileSystem env\r
+//writeFile    :: String String          *env -> (Bool,          *env) | FileSystem env\r
+\r
+// 2.\r
+readLines      :: String                 *env -> (Maybe [String],*env) | FileSystem env\r
+//writeLines   :: String [String]        *env -> (Bool,          *env) | FileSystem env\r
+\r
+// 3.\r
+//mapFile              :: String String (a -> b) *env -> (Bool,          *env) | FileSystem env & ... a & ... b\r
diff --git a/fp2/week1/camil/SimpleFileIO.icl b/fp2/week1/camil/SimpleFileIO.icl
new file mode 100644 (file)
index 0000000..b2a483a
--- /dev/null
@@ -0,0 +1,39 @@
+implementation module SimpleFileIO\r
+\r
+import StdEnv, StdFile, StdOverloaded, StdMaybe\r
+\r
+// 1.\r
+readFile       :: String                 *env -> (Maybe String,  *env) | FileSystem env\r
+readFile s env\r
+# (ss, env) = readLines s env\r
+| ss == Nothing = (Nothing, env)\r
+| otherwise = (Just (foldl (+++) "" (fromJust ss)), env)\r
+\r
+writeFile      :: String String          *env -> (Bool,          *env) | FileSystem env\r
+writeFile fn s env\r
+# (ok, outfile, env) = fopen fn FWriteText env\r
+| not ok = (False, env)\r
+# outfile = fwrites s outfile\r
+# (ok, env) = fclose outfile env\r
+| otherwise = (ok, env)\r
+\r
+// 2.\r
+readLines      :: String                 *env -> (Maybe [String],*env) | FileSystem env\r
+readLines s env\r
+# (ok, infile, env) = sfopen s FReadText env\r
+| not ok = (Nothing, env)\r
+| otherwise = (Just (fst (readLines` infile)), env)\r
+where\r
+       readLines` :: File -> ([String], File)\r
+       readLines` file \r
+       | sfend file = ([], file)\r
+       # (line, file) = sfreadline file\r
+       # (ss, file) = readLines` file\r
+       | otherwise = ([line : ss], file)\r
+\r
+writeLines     :: String [String]        *env -> (Bool,          *env) | FileSystem env\r
+writeLines fn ss env = writeFile fn (foldl (+++) "" [s +++ "\n" \\ s <- ss]) env\r
+\r
+// 3.\r
+//mapFile              :: String String (a -> b) *env -> (Bool,          *env) | FileSystem env & ... a & ... b\r
+\r