8||| A record of the file modes that can read from a file.
10data ValidModeRead : Mode -> Type where
11 VMRRead : ValidModeRead Read
12 VMRReadW : ValidModeRead ReadWrite
13 VMRReadWT : ValidModeRead ReadWriteTruncate
14 VMRReadA : ValidModeRead ReadAppend
16||| A record of the file modes that can write from a file.
18data ValidModeWrite : Mode -> Type where
19 VMWWrite : ValidModeWrite WriteTruncate
20 VMWAppend : ValidModeWrite Append
21 VMWReadW : ValidModeWrite ReadWrite
22 VMWReadWT : ValidModeWrite ReadWriteTruncate
24||| The file handle which will be used as a State Transition
25||| resource in the `IO` and `IOExcept` implementations of `File`.
27||| @mode The `Mode` that the handle was generated under.
30data FileHandle : (mode : Mode) -> Type where
31 FH : File -> FileHandle mode
33||| Description of state transition operations on a file.
35||| +------------+-------------+----------------+----------------+----------------+
36||| | Operation | State in | Mode in | State out | Mode out |
37||| +------------+-------------+----------------+----------------+----------------+
38||| | open | - | - | file handle | input paramater|
39||| | close | file handle | any | - | - |
40||| | eof | file handle | ValidModeRead | file handle | ValidModeRead |
41||| | flush | file handle | any | file handle | unchanged |
42||| | readLine | file handle | ValidModeRead | file handle | ValidModeRead |
43||| | readChar | file handle | ValidModeRead | file handle | ValidModeRead |
44||| | readFile | - | - | - | - |
45||| | writeString| file handle | ValidModeWrite | file handle | ValidModeWrite |
46||| | writeLine | file handle | ValidModeWrite | file handle | ValidModeWrite |
47||| | writeFile | - | - | - | - |
48||| +------------+-------------+----------------+----------------+----------------+
51interface File (m : Type -> Type) where
52 FileHandleI : Mode -> Type
56 ||| @fname the filename.
57 ||| @mode the mode; either Read, WriteTruncate, Append, ReadWrite,
58 ||| ReadWriteTruncate, or ReadAppend
60 open : (fname : String)
62 -> ST m (Either FileError Var) [ addIfRight (FileHandleI mode) ]
65 close : (fileHandle : Var)
66 -> ST m () [ remove fileHandle (FileHandleI mode) ]
68 ||| Have we reached the end of the file.
69 eof : (fileHandle : Var)
70 -> {auto prf : ValidModeRead mode}
71 -> ST m Bool [ fileHandle ::: (FileHandleI mode) ]
74 flush : (fileHandle : Var)
75 -> ST m () [ fileHandle ::: (FileHandleI mode) ]
77 ||| Read a complete line.
78 readLine : (fileHandle : Var)
79 -> {auto prf : ValidModeRead mode}
80 -> ST m (Either FileError String) [ fileHandle ::: (FileHandleI mode) ]
83 readChar : (fileHandle : Var)
84 -> {auto prf : ValidModeRead mode}
85 -> ST m (Either FileError Char) [ fileHandle ::: (FileHandleI mode) ]
87 ||| Read the contents of a file into a string.
89 ||| This checks the size of
90 ||| the file before beginning to read, and only reads that many bytes,
91 ||| to ensure that it remains a total function if the file is appended
92 ||| to while being read.
94 ||| Returns an error if fname is not a normal file.
96 readFile : (fileName : String)
97 -> ST m (Either FileError String) []
99 ||| Write a complete line to the file.
101 ||| @string The string to be written to file.
103 writeString : (fileHandle : Var)
105 -> {auto prf : ValidModeWrite mode}
106 -> ST m (Either FileError ()) [ fileHandle ::: (FileHandleI mode) ]
108 ||| Write a complete line to the file.
110 ||| @string The text to be written to file.
112 writeLine : (fileHandle : Var)
114 -> {auto prf : ValidModeWrite mode}
115 -> ST m (Either FileError ()) [ fileHandle ::: (FileHandleI mode) ]
117 ||| Create a file and write contents to the file.
119 ||| @fname The fileName of the file.
120 ||| @string The text to be written to file.
122 writeFile : (fname : String)
124 -> ST m (Either FileError ()) []
128 FileHandleI mode = State (FileHandle mode)
131 (Right file) <- lift ( openFile fname mode )
132 | (Left error ) => pure (Left error)
139 lift (closeFile file)
145 isEof <- lift (fEOF file)
155 (Right string) <- lift (fGetLine file)
156 | (Left error ) => pure (Left error)
161 (Right chr) <- lift (fgetc file)
162 | (Left error ) => pure (Left error)
166 (Right content) <- lift ( readFile fname )
167 | (Left error ) => pure (Left error)
170 writeString fh str = do
172 Right x <- lift (fPutStr file str)
173 | (Left error ) => pure (Left error)
176 writeLine fh str = do
178 Right x <- lift (fPutStrLn file str)
179 | (Left error ) => pure (Left error)
182 writeFile fname str = do
183 Right x <- lift (writeFile fname str)
184 | (Left error ) => pure (Left error)
188File (IOExcept a) where
189 FileHandleI mode = State (FileHandle mode)
192 (Right file) <- lift (ioe_lift (openFile fname mode))
193 | (Left error ) => pure (Left error)
200 lift (ioe_lift (closeFile file))
206 isEof <- lift (ioe_lift (fEOF file))
211 lift (ioe_lift (fEOF file))
216 (Right string) <- lift (ioe_lift (fGetLine file))
217 | (Left error ) => pure (Left error)
222 (Right chr) <- lift (ioe_lift (fgetc file))
223 | (Left error ) => pure (Left error)
227 (Right content) <- lift (ioe_lift (readFile fname))
228 | (Left error ) => pure (Left error)
231 writeString fh str = do
233 Right x <- lift (ioe_lift (fPutStr file str))
234 | (Left error ) => pure (Left error)
237 writeLine fh str = do
239 Right x <- lift (ioe_lift (fPutStrLn file str))
240 | (Left error ) => pure (Left error)
243 writeFile fname str = do
244 Right x <- lift (ioe_lift (writeFile fname str))
245 | (Left error ) => pure (Left error)
247--- EOF -------------------------------------------------------------------------
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list