    {-# LANGUAGE CPP #-}
    module Database.PostgreSQL.LibPQ.Marshal where

    import Foreign (Ptr, Storable, allocaArray, nullPtr, pokeArray)

    unsafeWithArray :: Storable a => Int -> [a] -> (Ptr a -> IO b) -> IO b
    unsafeWithArray :: forall a b. Storable a => Int -> [a] -> (Ptr a -> IO b) -> IO b
    unsafeWithArray Int
    len [a]
    vals Ptr a -> IO b
    f =
    #if 0
      if len /= length vals then error "unsafeWithArray: len mismatch" else
    #endif
      Int -> (Ptr a -> IO b) -> IO b
    forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
    allocaArray Int
    len ((Ptr a -> IO b) -> IO b) -> (Ptr a -> IO b) -> IO b
    forall a b. (a -> b) -> a -> b
    $ \Ptr a
    ptr -> do
          Ptr a -> [a] -> IO ()
    forall a. Storable a => Ptr a -> [a] -> IO ()
    pokeArray Ptr a
    ptr [a]
    vals
          Ptr a -> IO b
    f Ptr a
    ptr

    -- | Like maybe with but takes an int. Usable with 'withArrayLen'.
    -- In 'Nothing' case uses 0 and 'nullPtr'.
    maybeWithInt :: (     a -> (Int -> Ptr b -> IO c) -> IO c)
              -> (Maybe a -> (Int -> Ptr b -> IO c) -> IO c)
    maybeWithInt :: forall a b c.
    (a -> (Int -> Ptr b -> IO c) -> IO c)
    -> Maybe a -> (Int -> Ptr b -> IO c) -> IO c
    maybeWithInt = ((Int -> Ptr b -> IO c) -> IO c)
    -> (a -> (Int -> Ptr b -> IO c) -> IO c)
    -> Maybe a
    -> (Int -> Ptr b -> IO c)
    -> IO c
    forall b a. b -> (a -> b) -> Maybe a -> b
    maybe (\Int -> Ptr b -> IO c
    f -> Int -> Ptr b -> IO c
    f Int
    0 Ptr b
    forall a. Ptr a
    nullPtr)