{-# language DataKinds #-}
{-# language MagicHash #-}
{-# language UnboxedTuples #-}

module Basics.ArrayArray
  ( -- Types
    A
  , M
  , R
  , A#
  , M#
    -- Lifting
  , lift
  , unlift
  , liftMutable
  , unliftMutable
    -- Array
  , unsafeFreeze#
  ) where

import GHC.Exts hiding (setByteArray#)
import Data.Bifunctor.Flip (Flip(Flip))
import Data.Primitive.Unlifted.Array (UnliftedArray(..),MutableUnliftedArray(..))

type A = UnliftedArray ()
type A# = ArrayArray#
type M = Flip MutableUnliftedArray ()
type M# = MutableArrayArray#
type R = 'BoxedRep 'Unlifted

lift :: A# -> A
{-# inline lift #-}
lift :: A# -> A
lift = forall a. A# -> UnliftedArray a
UnliftedArray

unlift :: A -> A#
{-# inline unlift #-}
unlift :: A -> A#
unlift (UnliftedArray A#
i) = A#
i

liftMutable :: M# s -> M s
{-# inline liftMutable #-}
liftMutable :: forall s. M# s -> M s
liftMutable M# s
x = forall {k} {k1} (p :: k -> k1 -> *) (a :: k1) (b :: k).
p b a -> Flip p a b
Flip (forall s a. MutableArrayArray# s -> MutableUnliftedArray s a
MutableUnliftedArray M# s
x)

unliftMutable :: M s -> M# s
{-# inline unliftMutable #-}
unliftMutable :: forall s. M s -> M# s
unliftMutable (Flip (MutableUnliftedArray MutableArrayArray# s
i)) = MutableArrayArray# s
i

unsafeFreeze# :: M# s -> State# s -> (# State# s, A# #)
{-# inline unsafeFreeze# #-}
unsafeFreeze# :: forall s. M# s -> State# s -> (# State# s, A# #)
unsafeFreeze# = forall s. M# s -> State# s -> (# State# s, A# #)
unsafeFreezeArrayArray#