0 | module System.File.Handle
2 | import public System.File.Error
3 | import public System.File.Mode
4 | import System.File.Support
5 | import public System.File.Types
9 | %foreign supportC "idris2_openFile"
10 | supportNode "openFile"
11 | prim__open : String -> String -> PrimIO FilePtr
13 | %foreign supportC "idris2_closeFile"
14 | "node:lambda:(fp) => require('fs').closeSync(fp.fd)"
15 | prim__close : FilePtr -> PrimIO ()
22 | openFile : HasIO io => (f : String) -> (m : Mode) -> io (Either FileError File)
24 | = do res <- primIO (prim__open f (modeStr m))
25 | if prim__nullAnyPtr res /= 0
27 | else ok (FHandle res)
33 | closeFile : HasIO io => (fh : File) -> io ()
34 | closeFile (FHandle f) = primIO (prim__close f)
40 | withFile : HasIO io => (filename : String) ->
42 | (onError : FileError -> io a) ->
43 | (onOpen : File -> io (Either a b)) ->
45 | withFile filename mode onError onOpen =
46 | do Right h <- openFile filename mode
47 | | Left err => Left <$> onError err