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 | ||| Buffer size as a pure function ignoring the side effect
16 | export
17 | bufferSize : Buffer -> Int
18 | bufferSize = unsafePerformIO . rawSize
19 |
20 | ||| Read a file a place its content in a buffer
21 | export
22 | readFileToBuffer : HasIO io => File -> io (Either FileError Buffer)
23 | readFileToBuffer file = do
24 |   Right size <- fileSize file
25 |       | Left err => pure (Left err)
26 |   Just buf <- newBuffer size
27 |       | Nothing => pure (Left FileReadError)
28 |   Right ok <- readBufferData file buf 0 size
29 |       | Left err => pure (Left err)
30 |   pure (Right buf)
31 |
32 | ||| Read a file a place its content in a buffer
33 | export
34 | readFileToBuffer' : HasIO io => File -> io Buffer
35 | readFileToBuffer' file = case !(readFileToBuffer file) of
36 |   Left err => die "could not read file"
37 |   Right val => pure val
38 |
39 | ||| Convert a buffer to a string interpreting its bytes as ascii
40 | export
41 | bufferToString : HasIO io => Buffer -> io String
42 | bufferToString buf = do
43 |   size <- rawSize buf
44 |   getString buf 0 size
45 |
46 | ||| Convert a buffer to a string interpreting its bytes as ascii
47 | export
48 | bufferToStringUnsafe : Buffer -> String
49 | bufferToStringUnsafe = unsafePerformIO . bufferToString
50 |
51 | export
52 | readFileToString : HasIO io => File -> io (Either FileError String)
53 | readFileToString file = do
54 |   Right buf <- readFileToBuffer file
55 |       | Left err => pure (Left err)
56 |   map Right (bufferToString buf)
57 |
58 | export
59 | readFileToString' : HasIO io => File -> io String
60 | readFileToString' file = case !(readFileToString file) of
61 |   Left err => die "could not read file"
62 |   Right val => pure val
63 |
64 | export
65 | readSTDINBuffer : HasIO io => io (Either FileError Buffer)
66 | readSTDINBuffer = readFileToBuffer stdin
67 |
68 | export
69 | readSTDINBuffer' : HasIO io => io Buffer
70 | readSTDINBuffer' = readFileToBuffer stdin >>= \case
71 |   Left err => die "could not read STDIN"
72 |   Right val => pure val
73 |
74 | export
75 | readSTDIN : HasIO io => io  (Either FileError String)
76 | readSTDIN = readFileToString stdin
77 |
78 | export
79 | readSTDIN' : HasIO io => io String
80 | readSTDIN' = readSTDIN >>= \case
81 |   Left err => die "could not read STDIN"
82 |   Right val => pure val
83 |
84 |
85 |