select-0.4: src/System/Posix/IO/Select/FdSet/Unsafe.hs
-- | Pure interface to @fd_set@.
--
-- As far as I can tell, the data structure and functions in
-- "System.Posix.IO.Select.FdSet" are referentially transparent, and
-- it should be OK to escape the 'IO' monad. However, POSIX requires
-- that all operations on @fd_set@s are done with /valid/ file
-- descriptors. This can potentially be hard to ensure with lazy
-- evaluation in a pure setting, so for now this module bears the
-- unsafe label. On Linux, invalid file descriptors /seem/ to be just
-- fine.
--
-- See "System.Posix.IO.Select.FdSet" for documentation in
-- general. All functions here essentially just add
-- 'UNSAFE.unsafePerformIO'.
module System.Posix.IO.Select.FdSet.Unsafe (F.FdSet(), fromList, insert, insertList,
elem, remove, removeList, inList,
empty, unsafeToList) where
import Prelude hiding (elem)
import System.Posix.Types
import qualified System.Posix.IO.Select.FdSet as F
import qualified System.IO.Unsafe as UNSAFE
fromList :: [Fd] -> F.FdSet
fromList = UNSAFE.unsafePerformIO . F.fromList
empty :: F.FdSet
empty = UNSAFE.unsafePerformIO F.empty
insert :: Fd -> F.FdSet -> F.FdSet
insert fd fdset = UNSAFE.unsafePerformIO (F.insert fd fdset)
insertList :: [Fd] -> F.FdSet -> F.FdSet
insertList fds fdset = UNSAFE.unsafePerformIO (F.insertList fds fdset)
elem :: Fd -> F.FdSet -> Bool
elem fd fdset = UNSAFE.unsafePerformIO (F.elem fd fdset)
remove :: Fd -> F.FdSet -> F.FdSet
remove fd fdset = UNSAFE.unsafePerformIO (F.remove fd fdset)
removeList :: [Fd] -> F.FdSet -> F.FdSet
removeList fds fdset = UNSAFE.unsafePerformIO (F.removeList fds fdset)
inList :: [Fd] -> F.FdSet -> [Fd]
inList fds fdset = UNSAFE.unsafePerformIO (F.inList fds fdset)
-- toList :: F.FdSet -> [Fd]
-- toList = UNSAFE.unsafePerformIO . F.toList
-- | This converts an 'FdSet' to a list by testing every file
-- descriptor in range for membership, which tends to involve invalid
-- file descriptors, giving undefined behavior according to POSIX. Use
-- 'inList' if possible.
unsafeToList :: F.FdSet -> [Fd]
unsafeToList fdset = inList [(fromIntegral 0)..(F.bound fdset)] fdset