src/FilesCompat.bend
mylsm-lsm-store@0.6.0.0 · 64 lines · 0 definitions
1import Base
2
3# Classifies the filesystem object reported by a metadata lookup.
4type FileType is Data:
5 Regular{}
6 Directory{}
7 Other{}
8
9# Stores the kind, size, and modification time returned by stat.
10type Info is Data:
11 Info{kind: FileType, size: U32, mtime: U32}
12
13def stat.raw(path: String) -> IO(Result<&1, &1, U32 & String, U32 & U32 & U32>):
14 import "./effs/files_compat.c"
15 import "./effs/files_compat.js"
16
17# Maps the operating-system kind code into the public file classification.
18def kind_from_nat(kind: Nat) -> FileType:
19 match kind:
20 case 0n: Regular{}
21 case 1n+rest:
22 match rest:
23 case 0n: Directory{}
24 case 1n+rest: Other{}
25
26def stat.kind(kind: U32) -> FileType:
27 kind_from_nat(U32.to_nat(kind))
28
29def stat.result(
30 result: Result<&1, &1, U32 & String, U32 & U32 & U32>
31) -> Result<&1, &1, U32 & String, Info>:
32 match result:
33 case Fail{error}: Fail{error}
34 case Done{(kind, (size, mtime))}:
35 Done{Info{stat.kind(kind), size, mtime}}
36
37# Reads filesystem metadata for a path.
38def stat(path: String) -> IO(Result<&1, &1, U32 & String, Info>):
39 do IO<Result<&1, &1, U32 & String, Info>>:
40 result : Result<&1, &1, U32 & String, U32 & U32 & U32> <- stat.raw(path)
41 return stat.result(result)
42
43# Removes a file or an empty directory at a path.
44def remove(path: String) -> IO(Result<&1, &1, U32 & String, Unit>):
45 import "./effs/files_compat.c"
46 import "./effs/files_compat.js"
47
48# Renames a path using the filesystem's atomic rename operation.
49def rename(from: String, to: String) -> IO(Result<&1, &1, U32 & String, Unit>):
50 import "./effs/files_compat.c"
51 import "./effs/files_compat.js"
52
53def read.words(file: File, max: U32) -> IO(File & Result<&1, &1, U32 & String, U32 & Array<U32>>):
54 import "./effs/files_compat.c"
55 import "./effs/files_compat.js"
56
57def write.words.once(
58 file: File,
59 offset: U32,
60 len: U32,
61 words: Array<U32>
62) -> IO(File & Result<&1, &1, U32 & String, U32 & Array<U32>>):
63 import "./effs/files_compat.c"
64 import "./effs/files_compat.js"