{-# OPTIONS_GHC -optc-D_GNU_SOURCE #-}
{-# LINE 1 "src/Posix/Poll/Types.hsc" #-}
{-# language BangPatterns #-}
{-# language BinaryLiterals #-}
{-# language DataKinds #-}
{-# language DerivingStrategies #-}
{-# language DuplicateRecordFields #-}
{-# language GADTSyntax #-}
{-# language GeneralizedNewtypeDeriving #-}
{-# language KindSignatures #-}
{-# language NamedFieldPuns #-}
{-# language TypeApplications #-}
{-# language MagicHash #-}
{-# language UnboxedTuples #-}
{-# language PolyKinds #-}
{-# language TypeInType #-}

-- This is needed because hsc2hs does not currently handle ticked
-- promoted data constructors correctly.
{-# OPTIONS_GHC -fno-warn-unticked-promoted-constructors #-}





-- | All of the data constructors provided by this module are unsafe.
--   Only use them if you really know what you are doing.
module Posix.Poll.Types
  ( PollFd(..)
  , Exchange(..)
  , input
  , output
  , error
  , hangup
  , invalid
  , isSubeventOf
  ) where

import Prelude hiding (truncate,error)

import Data.Bits ((.|.),(.&.))
import Data.Word (Word8,Word16,Word32,Word64)
import Data.Primitive (Prim(..))
import Foreign.C.Types (CInt(..),CShort)
import Foreign.Storable (Storable(..))
import GHC.Ptr (Ptr(..))
import GHC.Exts (RealWorld,Int(I#),Int#,(+#),(*#))
import System.Posix.Types (Fd(..))

import qualified Data.Kind
import qualified Data.Primitive as PM

data PollFd = PollFd
  { descriptor :: !Fd
    -- ^ The @fd@ field of @struct pollfd@
  , request :: !(Event Request)
    -- ^ The @events@ field of @struct pollfd@
  , response :: !(Event Response)
    -- ^ The @revents@ field of @struct pollfd@
  }

newtype Event :: Exchange -> Data.Kind.Type where
  Event :: CShort -> Event e
  deriving newtype (Eq,Storable,Prim)

instance Semigroup (Event e) where
  Event a <> Event b = Event (a .|. b)

instance Monoid (Event e) where
  mempty = Event 0

data Exchange = Request | Response

instance Storable PollFd where
  sizeOf _ = (8)
{-# LINE 74 "src/Posix/Poll/Types.hsc" #-}
  alignment _ = alignment (undefined :: CInt)
  peek ptr = do
    descriptor <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 77 "src/Posix/Poll/Types.hsc" #-}
    request <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 78 "src/Posix/Poll/Types.hsc" #-}
    response <- (\hsc_ptr -> peekByteOff hsc_ptr 6) ptr
{-# LINE 79 "src/Posix/Poll/Types.hsc" #-}
    let !pollfd = PollFd{descriptor,request,response}
    pure pollfd
  poke ptr PollFd{descriptor,request,response} = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr descriptor
{-# LINE 83 "src/Posix/Poll/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr request
{-# LINE 84 "src/Posix/Poll/Types.hsc" #-}
    (\hsc_ptr -> pokeByteOff hsc_ptr 6) ptr response
{-# LINE 85 "src/Posix/Poll/Types.hsc" #-}

unI :: Int -> Int#
unI (I# i) = i

instance Prim PollFd where
  sizeOf# _ = unI (8)
{-# LINE 91 "src/Posix/Poll/Types.hsc" #-}
  alignment# _ = alignment# (undefined :: CInt)
  indexByteArray# arr i = PollFd
    { descriptor = (\hsc_arr hsc_ix -> indexByteArray# hsc_arr (0# +# (hsc_ix *# 2#))) arr i
{-# LINE 94 "src/Posix/Poll/Types.hsc" #-}
    , request = (\hsc_arr hsc_ix -> indexByteArray# hsc_arr (2# +# (hsc_ix *# 4#))) arr i
{-# LINE 95 "src/Posix/Poll/Types.hsc" #-}
    , response = (\hsc_arr hsc_ix -> indexByteArray# hsc_arr (3# +# (hsc_ix *# 4#))) arr i
{-# LINE 96 "src/Posix/Poll/Types.hsc" #-}
    }
  writeByteArray# arr i PollFd{descriptor,request,response} s0 = case (\hsc_arr hsc_ix -> writeByteArray# hsc_arr (0# +# (hsc_ix *# 2#))) arr i descriptor s0 of
{-# LINE 98 "src/Posix/Poll/Types.hsc" #-}
    s1 -> case (\hsc_arr hsc_ix -> writeByteArray# hsc_arr (2# +# (hsc_ix *# 4#))) arr i request s1 of
{-# LINE 99 "src/Posix/Poll/Types.hsc" #-}
      s2 -> (\hsc_arr hsc_ix -> writeByteArray# hsc_arr (3# +# (hsc_ix *# 4#))) arr i response s2
{-# LINE 100 "src/Posix/Poll/Types.hsc" #-}
  readByteArray# arr i s0 = case (\hsc_arr hsc_ix -> readByteArray# hsc_arr (0# +# (hsc_ix *# 2#))) arr i s0 of
{-# LINE 101 "src/Posix/Poll/Types.hsc" #-}
    (# s1, descriptor #) -> case (\hsc_arr hsc_ix -> readByteArray# hsc_arr (2# +# (hsc_ix *# 4#))) arr i s1 of
{-# LINE 102 "src/Posix/Poll/Types.hsc" #-}
      (# s2, request #) -> case (\hsc_arr hsc_ix -> readByteArray# hsc_arr (3# +# (hsc_ix *# 4#))) arr i s2 of
{-# LINE 103 "src/Posix/Poll/Types.hsc" #-}
        (# s3, response #) -> (# s3, PollFd{descriptor,request,response} #)
  setByteArray# = PM.defaultSetByteArray#
  indexOffAddr# arr i = PollFd
    { descriptor = (\hsc_arr hsc_ix -> indexOffAddr# hsc_arr (0# +# (hsc_ix *# 2#))) arr i
{-# LINE 107 "src/Posix/Poll/Types.hsc" #-}
    , request = (\hsc_arr hsc_ix -> indexOffAddr# hsc_arr (2# +# (hsc_ix *# 4#))) arr i
{-# LINE 108 "src/Posix/Poll/Types.hsc" #-}
    , response = (\hsc_arr hsc_ix -> indexOffAddr# hsc_arr (3# +# (hsc_ix *# 4#))) arr i
{-# LINE 109 "src/Posix/Poll/Types.hsc" #-}
    }
  writeOffAddr# arr i PollFd{descriptor,request,response} s0 = case (\hsc_arr hsc_ix -> writeOffAddr# hsc_arr (0# +# (hsc_ix *# 2#))) arr i descriptor s0 of
{-# LINE 111 "src/Posix/Poll/Types.hsc" #-}
    s1 -> case (\hsc_arr hsc_ix -> writeOffAddr# hsc_arr (2# +# (hsc_ix *# 4#))) arr i request s1 of
{-# LINE 112 "src/Posix/Poll/Types.hsc" #-}
      s2 -> (\hsc_arr hsc_ix -> writeOffAddr# hsc_arr (3# +# (hsc_ix *# 4#))) arr i response s2
{-# LINE 113 "src/Posix/Poll/Types.hsc" #-}
  readOffAddr# arr i s0 = case (\hsc_arr hsc_ix -> readOffAddr# hsc_arr (0# +# (hsc_ix *# 2#))) arr i s0 of
{-# LINE 114 "src/Posix/Poll/Types.hsc" #-}
    (# s1, fdVal #) -> case (\hsc_arr hsc_ix -> readOffAddr# hsc_arr (2# +# (hsc_ix *# 4#))) arr i s1 of
{-# LINE 115 "src/Posix/Poll/Types.hsc" #-}
      (# s2, eventsVal #) -> case (\hsc_arr hsc_ix -> readOffAddr# hsc_arr (3# +# (hsc_ix *# 4#))) arr i s2 of
{-# LINE 116 "src/Posix/Poll/Types.hsc" #-}
        (# s3, reventsVal #) -> (# s3, PollFd fdVal eventsVal reventsVal #)
  setOffAddr# = PM.defaultSetOffAddr#

-- | The @POLLIN@ event.
input :: Event e
input = Event 1
{-# LINE 122 "src/Posix/Poll/Types.hsc" #-}

-- | The @POLLOUT@ event.
output :: Event e
output = Event 4
{-# LINE 126 "src/Posix/Poll/Types.hsc" #-}

-- | The @POLLERR@ event.
error :: Event Response
error = Event 8
{-# LINE 130 "src/Posix/Poll/Types.hsc" #-}

-- | The @POLLHUP@ event.
hangup :: Event Response
hangup = Event 16
{-# LINE 134 "src/Posix/Poll/Types.hsc" #-}

-- | The @POLLNVAL@ event.
invalid :: Event Response
invalid = Event 32
{-# LINE 138 "src/Posix/Poll/Types.hsc" #-}

-- | Is the first argument a subset of the second argument?
isSubeventOf :: Event e -> Event e -> Bool
isSubeventOf (Event a) (Event b) = a .&. b == a