0 | module Data.Swirl.File
2 | import public Data.Swirl
4 | import public Language.Implicits.IfUnsolved
7 | import public System.File.Error
8 | import public System.File.Mode
12 | emitUntilEOF : HasIO io =>
14 | (0 _ : IfUnsolved io IO) =>
15 | (0 _ : IfUnsolved r ()) =>
16 | (File -> io (Either e a)) ->
19 | emitUntilEOF act file = tickUntil (fEOF @{ByResult} file) >> emitOrFail.by (act file)
22 | readAsChars : HasIO io =>
24 | (0 _ : IfUnsolved io IO) =>
25 | (0 _ : IfUnsolved r ()) =>
27 | Swirl io FileError r Char
28 | readAsChars = emitUntilEOF fGetChar
31 | readAsLines : HasIO io =>
33 | (0 _ : IfUnsolved io IO) =>
34 | (0 _ : IfUnsolved r ()) =>
36 | Swirl io FileError r String
37 | readAsLines = emitUntilEOF fGetLine
40 | readAsChunks : HasIO io =>
42 | (0 _ : IfUnsolved io IO) =>
43 | (0 _ : IfUnsolved r ()) =>
44 | (chunkMaxSize : Nat) ->
46 | Swirl io FileError r String
47 | readAsChunks sz = emitUntilEOF $
\file => fGetChars file $
cast sz
50 | writeStr : HasIO io =>
52 | (0 _ : IfUnsolved io IO) =>
53 | (0 _ : IfUnsolved r ()) =>
54 | (0 _ : IfUnsolved o Void) =>
57 | Swirl io FileError r o
58 | writeStr file str = mapFst (const neutral) $
succeedOrFail.by $
fPutStr file str
61 | withFile : HasIO io =>
63 | (filename : String) ->
64 | (File -> Swirl io FileError r o) ->
65 | Swirl io FileError r o
66 | withFile mode filename = bracket (succeedOrFail.by $
openFile filename mode) (succeed.by . closeFile)
69 | withFile' : HasIO io =>
71 | (filename : String) ->
72 | (File -> Swirl io (Either FileError e) r o) ->
73 | Swirl io (Either FileError e) r o
74 | withFile' mode filename = bracket (mapError Left $
succeedOrFail.by $
openFile filename mode) (succeed.by . closeFile)