@@ -7,16 +7,19 @@ data OpenFile : Mode -> Type where
77 FH : File -> OpenFile m
88
99data FileIO : Effect where
10− Open : String -> (m : Mode) -> FileIO () (OpenFile m) ()
10+ Open : String -> (m : Mode) -> FileIO () (Either () (OpenFile m)) Bool
1111 Close : FileIO (OpenFile m) () ()
12−
12+
1313 ReadLine : FileIO (OpenFile Read) (OpenFile Read) String
1414 WriteLine : String -> FileIO (OpenFile Write) (OpenFile Write) ()
1515 EOF : FileIO (OpenFile Read) (OpenFile Read) Bool
16+
1617
1718instance Handler FileIO IO where
1819 handle () (Open fname m) k = do h <- openFile fname m
19− k (FH h) ()
20+ valid <- validFile h
21+ if valid then k (Right (FH h)) True
22+ else k (Left ()) False
2023 handle (FH h) Close k = do closeFile h
2124 k () ()
2225 handle (FH h) ReadLine k = do str <- fread h
@@ -30,8 +33,8 @@ instance Handler FileIO (IOExcept String) where
3033 handle () (Open fname m) k
3134 = do h <- ioe_lift (openFile fname m)
3235 valid <- ioe_lift (validFile h)
33− if valid then k (FH h) ()
34− else ioe_fail "File open failed"
36+ if valid then k (Right (FH h)) True
37+ else k (Left ()) False
3538 handle (FH h) Close k = do ioe_lift (closeFile h); k () ()
3639 handle (FH h) ReadLine k = do str <- ioe_lift (fread h)
3740 k (FH h) str
@@ -44,7 +47,8 @@ FILE_IO : Type -> EFFECT
4447FILE_IO t = MkEff t FileIO
4548
4649open : Handler FileIO e =>
47− String -> (m : Mode) -> EffM e [FILE_IO ()] [FILE_IO (OpenFile m)] ()
50+ String -> (m : Mode) -> EffM e [FILE_IO ()]
51+ [FILE_IO (Either () (OpenFile m))] Bool
4852open f m = Open f m
4953
5054close : Handler FileIO e =>