{-# LANGUAGE
    MagicHash, ForeignFunctionInterface,
    GHCForeignImportPrim, UnliftedFFITypes #-}

module GHC.Prim.Array (
    consArray#
  , snocArray#
  , snocArrayWithPadding#
  , insertArray#
  , deleteArray#
  ) where

import GHC.Prim
import GHC.Types



foreign import prim "snocArray" snocArray_
  :: Array# a -> Any -> Array# a

foreign import prim "snocArrayWithPadding" snocArrayWithPadding_
  :: Int# -> Any -> Array# a -> Any -> Array# a

foreign import prim "insertArray" insertArray_
  :: Int# -> Any -> Array# a -> Array# a

-- | Delete element at position.
foreign import prim "deleteArray" deleteArray#
  :: Int# -> Array# a -> Array# a

foreign import prim "consArray" consArray_
  :: Any -> Array# a -> Array# a

-- | Prepend an element to an array.
consArray# :: a -> Array# a -> Array# a
consArray# a arr = consArray_ (unsafeCoerce# a) arr
{-# inline consArray# #-}

-- | Append an element to the end of an array.
snocArray# :: Array# a -> a -> Array# a
snocArray# arr a = snocArray_ arr (unsafeCoerce# a)
{-# inline snocArray# #-}

-- | Append an element to the array and pad the end with another element.
--   The first argument is the size of the padding, the second is the pad element.
snocArrayWithPadding# :: Int# -> a -> Array# a -> a -> Array# a
snocArrayWithPadding# pad padElem arr a =
  snocArrayWithPadding_ pad (unsafeCoerce# padElem) arr (unsafeCoerce# a)
{-# inline snocArrayWithPadding# #-}

-- | Insert new element at position.
insertArray# :: Int# -> a -> Array# a -> Array# a
insertArray# i a arr = insertArray_ i (unsafeCoerce# a) arr
{-# inline insertArray# #-}