@@ -0,0 +1,141 @@
1+-- | Lifted version of "System.IO".
2+module Effectful.FileSystem.IO
3+ ( FileSystem
4+ , runFileSystem
5+ , IOMode (..)
6+ , Handle
7+ , IO.stdin
8+ , IO.stdout
9+ , IO.stderr
10+ , withFile
11+ , withBinaryFile
12+ , openFile
13+ , hClose
14+ , hFlush
15+ , hFileSize
16+ , hSetFileSize
17+ , hIsEOF
18+ , IO.BufferMode (..)
19+ , hSetBuffering
20+ , hGetBuffering
21+ , hSeek
22+ , IO.SeekMode (..)
23+ , hTell
24+ , hIsOpen
25+ , hIsClosed
26+ , hIsReadable
27+ , hIsWritable
28+ , hIsSeekable
29+ , hIsTerminalDevice
30+ , hSetEcho
31+ , hGetEcho
32+ , hWaitForInput
33+ , hReady
34+ ) where
35+
36+import qualified System.IO as IO
37+import System.IO (Handle, IOMode (..))
38+
39+import Effectful.Dispatch.Static
40+import Effectful.FileSystem.Effect
41+import Effectful.Monad
42+
43+-- | Lifted version of 'IO.withFile'.
44+withFile
45+ :: FileSystem :> es
46+ => FilePath
47+ -> IOMode
48+ -> (Handle -> Eff es a)
49+ -> Eff es a
50+withFile fp mode inner = unsafeUnliftIO $ \unlift -> do
51+ IO.withFile fp mode $ unlift . inner
52+
53+-- | Lifted version of 'IO.withBinaryFile'.
54+withBinaryFile
55+ :: FileSystem :> es
56+ => FilePath
57+ -> IOMode
58+ -> (Handle -> Eff es a)
59+ -> Eff es a
60+withBinaryFile fp mode inner = unsafeUnliftIO $ \unlift -> do
61+ IO.withBinaryFile fp mode $ unlift . inner
62+
63+-- | Lifted version of 'IO.openFile'
64+openFile :: FileSystem :> es => FilePath -> IOMode -> Eff es Handle
65+openFile fp = unsafeEff_ . IO.openFile fp
66+
67+-- | Lifted version of 'IO.hClose'
68+hClose :: FileSystem :> es => Handle -> Eff es ()
69+hClose = unsafeEff_ . IO.hClose
70+
71+-- | Lifted version of 'IO.hFlush'
72+hFlush :: FileSystem :> es => Handle -> Eff es ()
73+hFlush = unsafeEff_ . IO.hFlush
74+
75+-- | Lifted version of 'IO.hFileSize'
76+hFileSize :: FileSystem :> es => Handle -> Eff es Integer
77+hFileSize = unsafeEff_ . IO.hFileSize
78+
79+-- | Lifted version of 'IO.hSetFileSize'
80+hSetFileSize :: FileSystem :> es => Handle -> Integer -> Eff es ()
81+hSetFileSize h = unsafeEff_ . IO.hSetFileSize h
82+
83+-- | Lifted version of 'IO.hIsEOF'
84+hIsEOF :: FileSystem :> es => Handle -> Eff es Bool
85+hIsEOF = unsafeEff_ . IO.hIsEOF
86+
87+-- | Lifted version of 'IO.hSetBuffering'
88+hSetBuffering :: FileSystem :> es => Handle -> IO.BufferMode -> Eff es ()
89+hSetBuffering h = unsafeEff_ . IO.hSetBuffering h
90+
91+-- | Lifted version of 'IO.hGetBuffering'
92+hGetBuffering :: FileSystem :> es => Handle -> Eff es IO.BufferMode
93+hGetBuffering = unsafeEff_ . IO.hGetBuffering
94+
95+-- | Lifted version of 'IO.hSeek'
96+hSeek :: FileSystem :> es => Handle -> IO.SeekMode -> Integer -> Eff es ()
97+hSeek h s = unsafeEff_ . IO.hSeek h s
98+
99+-- | Lifted version of 'IO.hTell'
100+hTell :: FileSystem :> es => Handle -> Eff es Integer
101+hTell = unsafeEff_ . IO.hTell
102+
103+-- | Lifted version of 'IO.hIsOpen'
104+hIsOpen :: FileSystem :> es => Handle -> Eff es Bool
105+hIsOpen = unsafeEff_ . IO.hIsOpen
106+
107+-- | Lifted version of 'IO.hIsClosed'
108+hIsClosed :: FileSystem :> es => Handle -> Eff es Bool
109+hIsClosed = unsafeEff_ . IO.hIsClosed
110+
111+-- | Lifted version of 'IO.hIsReadable'
112+hIsReadable :: FileSystem :> es => Handle -> Eff es Bool
113+hIsReadable = unsafeEff_ . IO.hIsReadable
114+
115+-- | Lifted version of 'IO.hIsWritable'
116+hIsWritable :: FileSystem :> es => Handle -> Eff es Bool
117+hIsWritable = unsafeEff_ . IO.hIsWritable
118+
119+-- | Lifted version of 'IO.hIsSeekable'
120+hIsSeekable :: FileSystem :> es => Handle -> Eff es Bool
121+hIsSeekable = unsafeEff_ . IO.hIsSeekable
122+
123+-- | Lifted version of 'IO.hIsTerminalDevice'
124+hIsTerminalDevice :: FileSystem :> es => Handle -> Eff es Bool
125+hIsTerminalDevice = unsafeEff_ . IO.hIsTerminalDevice
126+
127+-- | Lifted version of 'IO.hSetEcho'
128+hSetEcho :: FileSystem :> es => Handle -> Bool -> Eff es ()
129+hSetEcho h = unsafeEff_ . IO.hSetEcho h
130+
131+-- | Lifted version of 'IO.hGetEcho'
132+hGetEcho :: FileSystem :> es => Handle -> Eff es Bool
133+hGetEcho = unsafeEff_ . IO.hGetEcho
134+
135+-- | Lifted version of 'IO.hWaitForInput'
136+hWaitForInput :: FileSystem :> es => Handle -> Int -> Eff es Bool
137+hWaitForInput h = unsafeEff_ . IO.hWaitForInput h
138+
139+-- | Lifted version of 'IO.hReady'
140+hReady :: FileSystem :> es => Handle -> Eff es Bool
141+hReady = unsafeEff_ . IO.hReady