packages feed

posix-api-0.3.3.0: src/Posix/MessageQueue/Types.hsc

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
module Posix.MessageQueue.Types
  ( OpenMode(..)
  , OpenFlags(..)
  , applyOpenFlags
    -- * Open Access Mode
  , readOnly
  , writeOnly
  , readWrite
    -- * Open Flags
  , nonblocking
  ) where

import Data.Bits ((.|.))
import Foreign.C.Types (CInt(..))

newtype OpenMode = OpenMode CInt

newtype OpenFlags = OpenFlags CInt

instance Semigroup OpenFlags where
  OpenFlags x <> OpenFlags y = OpenFlags (x .|. y)
instance Monoid OpenFlags where mempty = OpenFlags 0

-- | The @O_RDONLY@ access mode.
readOnly :: OpenMode
readOnly = OpenMode #{const O_RDONLY}

-- | The @O_WRONLY@ access mode.
writeOnly :: OpenMode
writeOnly = OpenMode #{const O_WRONLY}

-- | The @O_RDWR@ access mode.
readWrite :: OpenMode
readWrite = OpenMode #{const O_RDWR}

-- | The @O_NONBLOCK@ open flag.
nonblocking :: OpenFlags
nonblocking = OpenFlags #{const O_NONBLOCK}

applyOpenFlags :: OpenFlags -> OpenMode -> OpenMode
applyOpenFlags (OpenFlags s) (OpenMode t) = OpenMode (s .|. t)