{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}

module Compat
  ( unsafeShrinkAndFreeze
  , unsafeShrinkAndFreeze#
  ) where

import Data.Primitive (SmallArray (..), SmallMutableArray (..))
import GHC.Exts (Int (I#), Int#, SmallArray#, SmallMutableArray#, State#)
import GHC.ST (ST (ST))

import qualified GHC.Exts as Exts

-- Shrink the mutable array in place and then freeze it.
-- The argument must not be reused after being passed to
-- this function.
unsafeShrinkAndFreeze ::
  SmallMutableArray s a ->
  Int ->
  ST s (SmallArray a)
{-# INLINE unsafeShrinkAndFreeze #-}
unsafeShrinkAndFreeze :: forall s a. SmallMutableArray s a -> Int -> ST s (SmallArray a)
unsafeShrinkAndFreeze (SmallMutableArray SmallMutableArray# s a
x) (I# Int#
n) =
  STRep s (SmallArray a) -> ST s (SmallArray a)
forall s a. STRep s a -> ST s a
ST
    ( \State# s
s0 -> case SmallMutableArray# s a -> Int# -> State# s -> State# s
forall d a. SmallMutableArray# d a -> Int# -> State# d -> State# d
Exts.shrinkSmallMutableArray# SmallMutableArray# s a
x Int#
n State# s
s0 of
        State# s
s1 -> case SmallMutableArray# s a -> State# s -> (# State# s, SmallArray# a #)
forall d a.
SmallMutableArray# d a -> State# d -> (# State# d, SmallArray# a #)
Exts.unsafeFreezeSmallArray# SmallMutableArray# s a
x State# s
s1 of
          (# State# s
s2, SmallArray# a
r #) -> (# State# s
s2, SmallArray# a -> SmallArray a
forall a. SmallArray# a -> SmallArray a
SmallArray SmallArray# a
r #)
    )

unsafeShrinkAndFreeze# ::
  SmallMutableArray# s a ->
  Int# ->
  State# s ->
  (# State# s, SmallArray# a #)
{-# INLINE unsafeShrinkAndFreeze# #-}
unsafeShrinkAndFreeze# :: forall s a.
SmallMutableArray# s a
-> Int# -> State# s -> (# State# s, SmallArray# a #)
unsafeShrinkAndFreeze# SmallMutableArray# s a
x Int#
n State# s
s0 =
  case SmallMutableArray# s a -> Int# -> State# s -> State# s
forall d a. SmallMutableArray# d a -> Int# -> State# d -> State# d
Exts.shrinkSmallMutableArray# SmallMutableArray# s a
x Int#
n State# s
s0 of
    State# s
s1 -> SmallMutableArray# s a -> State# s -> (# State# s, SmallArray# a #)
forall d a.
SmallMutableArray# d a -> State# d -> (# State# d, SmallArray# a #)
Exts.unsafeFreezeSmallArray# SmallMutableArray# s a
x State# s
s1