0 | module Data.Swirl.File
 1 |
 2 | import public Data.Swirl
 3 |
 4 | import public Language.Implicits.IfUnsolved
 5 |
 6 | import System.File
 7 | import public System.File.Error
 8 | import public System.File.Mode
 9 |
10 | %default covering
11 |
12 | emitUntilEOF : HasIO io =>
13 |                Monoid r =>
14 |                (0 _ : IfUnsolved io IO) =>
15 |                (0 _ : IfUnsolved r ()) =>
16 |                (File -> io (Either e a)) ->
17 |                File ->
18 |                Swirl io e r a
19 | emitUntilEOF act file = tickUntil (fEOF @{ByResult} file) >> emitOrFail.by (act file)
20 |
21 | export
22 | readAsChars : HasIO io =>
23 |               Monoid r =>
24 |               (0 _ : IfUnsolved io IO) =>
25 |               (0 _ : IfUnsolved r ()) =>
26 |               File ->
27 |               Swirl io FileError r Char
28 | readAsChars = emitUntilEOF fGetChar
29 |
30 | export
31 | readAsLines : HasIO io =>
32 |               Monoid r =>
33 |               (0 _ : IfUnsolved io IO) =>
34 |               (0 _ : IfUnsolved r ()) =>
35 |               File ->
36 |               Swirl io FileError r String
37 | readAsLines = emitUntilEOF fGetLine
38 |
39 | export
40 | readAsChunks : HasIO io =>
41 |                Monoid r =>
42 |                (0 _ : IfUnsolved io IO) =>
43 |                (0 _ : IfUnsolved r ()) =>
44 |                (chunkMaxSize : Nat) ->
45 |                File ->
46 |                Swirl io FileError r String
47 | readAsChunks sz = emitUntilEOF $ \file => fGetChars file $ cast sz
48 |
49 | export
50 | writeStr : HasIO io =>
51 |            Monoid r =>
52 |            (0 _ : IfUnsolved io IO) =>
53 |            (0 _ : IfUnsolved r ()) =>
54 |            (0 _ : IfUnsolved o Void) =>
55 |            File ->
56 |            String ->
57 |            Swirl io FileError r o
58 | writeStr file str = mapFst (const neutral) $ succeedOrFail.by $ fPutStr file str
59 |
60 | export
61 | withFile : HasIO io =>
62 |            (mode : Mode) ->
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)
67 |
68 | export
69 | withFile' : HasIO io =>
70 |             (mode : Mode) ->
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)
75 |