1 | module System.File.Meta
7 | import System.File.Handle
8 | import System.File.Support
9 | import public System.File.Types
15 | FileTimePtr = AnyPtr
17 | %foreign supportC "idris2_fileSize"
18 | "node:lambda:fp=>require('fs').fstatSync(fp.fd).size"
19 | prim__fileSize : FilePtr -> PrimIO Int
21 | %foreign supportC "idris2_fileSize"
22 | prim__fPoll : FilePtr -> PrimIO Int
24 | %foreign supportC "idris2_fileTime"
25 | "node:support:filetime,support_system_file"
26 | prim__fileTime : FilePtr -> PrimIO FileTimePtr
28 | %foreign supportC "idris2_filetimeAccessTimeSec"
29 | "node:lambda:ft=>ft.atime_sec"
30 | prim__filetimeAccessTimeSec : FileTimePtr -> PrimIO Int
32 | %foreign supportC "idris2_filetimeAccessTimeNsec"
33 | "node:lambda:ft=>ft.atime_nsec"
34 | prim__filetimeAccessTimeNsec : FileTimePtr -> PrimIO Int
36 | %foreign supportC "idris2_filetimeModifiedTimeSec"
37 | "node:lambda:ft=>ft.mtime_sec"
38 | prim__filetimeModifiedTimeSec : FileTimePtr -> PrimIO Int
40 | %foreign supportC "idris2_filetimeModifiedTimeNsec"
41 | "node:lambda:ft=>ft.mtime_nsec"
42 | prim__filetimeModifiedTimeNsec : FileTimePtr -> PrimIO Int
44 | %foreign supportC "idris2_filetimeStatusTimeSec"
45 | "node:lambda:ft=>ft.ctime_sec"
46 | prim__filetimeStatusTimeSec : FileTimePtr -> PrimIO Int
48 | %foreign supportC "idris2_filetimeStatusTimeNsec"
49 | "node:lambda:ft=>ft.ctime_nsec"
50 | prim__filetimeStatusTimeNsec : FileTimePtr -> PrimIO Int
52 | %foreign supportC "idris2_fileIsTTY"
53 | "node:lambda:fp=>Number(require('tty').isatty(fp.fd))"
54 | prim__fileIsTTY : FilePtr -> PrimIO Int
58 | exists : HasIO io => String -> io Bool
60 | = do Right ok <- openFile f Read
61 | | Left err => pure False
67 | firstExists : HasIO io => List String -> io (Maybe String)
68 | firstExists [] = pure Nothing
69 | firstExists (x :: xs) = if !(exists x) then pure (Just x) else firstExists xs
73 | record Timestamp where
74 | constructor MkTimestamp
80 | t == t' = (t.sec == t'.sec) && (t.nsec == t'.nsec)
84 | t < t' = (t.sec < t'.sec) || (t.sec == t'.sec && t.nsec < t'.nsec)
87 | Show Timestamp where
88 | show t = "\{show t.sec}.\{padLeft 9 '0' $ show t.nsec}"
92 | record FileTime where
93 | constructor MkFileTime
100 | fileTime : HasIO io => (h : File) -> io (Either FileError FileTime)
101 | fileTime (FHandle f)
102 | = do res <- primIO (prim__fileTime f)
103 | ft <- parseFileTime res
105 | if ft.atime.sec > 0
109 | parseFileTime : FileTimePtr -> io FileTime
110 | parseFileTime ft = pure $
MkFileTime { atime = MkTimestamp { sec = !(primIO (prim__filetimeAccessTimeSec ft))
111 | , nsec = !(primIO (prim__filetimeAccessTimeNsec ft))
113 | , mtime = MkTimestamp { sec = !(primIO (prim__filetimeModifiedTimeSec ft))
114 | , nsec = !(primIO (prim__filetimeModifiedTimeNsec ft))
116 | , ctime = MkTimestamp { sec = !(primIO (prim__filetimeStatusTimeSec ft))
117 | , nsec = !(primIO (prim__filetimeStatusTimeNsec ft))
123 | fileAccessTime : HasIO io => (h : File) -> io (Either FileError Int)
124 | fileAccessTime h = (fileTime h <&> (.atime.sec)) @{Compose}
128 | fileModifiedTime : HasIO io => (h : File) -> io (Either FileError Int)
129 | fileModifiedTime h = (fileTime h <&> (.mtime.sec)) @{Compose}
133 | fileStatusTime : HasIO io => (h : File) -> io (Either FileError Int)
134 | fileStatusTime h = (fileTime h <&> (.ctime.sec)) @{Compose}
138 | fileSize : HasIO io => (h : File) -> io (Either FileError Int)
139 | fileSize (FHandle f)
140 | = do res <- primIO (prim__fileSize f)
147 | fPoll : HasIO io => File -> io Bool
149 | = do p <- primIO (prim__fPoll f)
154 | isTTY : HasIO io => (h : File) -> io Bool
155 | isTTY (FHandle f) = (/= 0) <$> primIO (prim__fileIsTTY f)