0 | module System.Utils
 1 |
 2 | import Data.Buffer
 3 | import System
 4 | import System.File
 5 | import Data.Either
 6 |
 7 | ||| Allocate an empty buffer
 8 | export
 9 | emptyBuffer : Buffer
10 | emptyBuffer = unsafePerformIO $ do
11 |   Just buf <- newBuffer 0
12 |     | Nothing => die "could not allocate empty buffer"
13 |   pure buf
14 |
15 | ||| Read a file a place its content in a buffer
16 | export
17 | readFileToBuffer : HasIO io => File -> io (Either FileError Buffer)
18 | readFileToBuffer file = do
19 |   Right size <- fileSize file
20 |       | Left err => pure (Left err)
21 |   Just buf <- newBuffer size
22 |       | Nothing => pure (Left FileReadError)
23 |   Right ok <- readBufferData file buf 0 size
24 |       | Left err => pure (Left err)
25 |   pure (Right buf)
26 |
27 | ||| Read a file a place its content in a buffer
28 | export
29 | readFileToBuffer' : HasIO io => File -> io Buffer
30 | readFileToBuffer' file = case !(readFileToBuffer file) of
31 |   Left err => die "could not read file"
32 |   Right val => pure val
33 |
34 | ||| Convert a buffer to a string interpreting its bytes as ascii
35 | export
36 | bufferToString : HasIO io => Buffer -> io String
37 | bufferToString buf = do
38 |   size <- rawSize buf
39 |   getString buf 0 size
40 |
41 | ||| Convert a buffer to a string interpreting its bytes as ascii
42 | export
43 | bufferToStringUnsafe : Buffer -> String
44 | bufferToStringUnsafe = unsafePerformIO . bufferToString
45 |
46 | export
47 | readFileToString : HasIO io => File -> io (Either FileError String)
48 | readFileToString file = do
49 |   Right buf <- readFileToBuffer file
50 |       | Left err => pure (Left err)
51 |   map Right (bufferToString buf)
52 |
53 | export
54 | readFileToString' : HasIO io => File -> io String
55 | readFileToString' file = case !(readFileToString file) of
56 |   Left err => die "could not read file"
57 |   Right val => pure val
58 |
59 | export
60 | readSTDINBuffer : HasIO io => io (Either FileError Buffer)
61 | readSTDINBuffer = readFileToBuffer stdin
62 |
63 | export
64 | readSTDINBuffer' : HasIO io => io Buffer
65 | readSTDINBuffer' = readFileToBuffer stdin >>= \case
66 |   Left err => die "could not read STDIN"
67 |   Right val => pure val
68 |
69 | export
70 | readSTDIN : HasIO io => io  (Either FileError String)
71 | readSTDIN = readFileToString stdin
72 |
73 | export
74 | readSTDIN' : HasIO io => io String
75 | readSTDIN' = readSTDIN >>= \case
76 |   Left err => die "could not read STDIN"
77 |   Right val => pure val
78 |
79 |
80 |