{-# LANGUAGE BangPatterns          #-}
{-# LANGUAGE EmptyCase             #-}
{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE LambdaCase            #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE StandaloneDeriving    #-}
{-# LANGUAGE TypeFamilies          #-}
{-# LANGUAGE TypeInType            #-}
{-# LANGUAGE TypeOperators         #-}
{-# LANGUAGE UndecidableInstances  #-}
{-# OPTIONS_GHC -fno-warn-orphans  #-}

-- |
-- Module      : Data.Mutable.Instances
-- Copyright   : (c) Justin Le 2020
-- License     : BSD3
--
-- Maintainer  : justin@jle.im
-- Stability   : experimental
-- Portability : non-portable
--
-- Provides 'Ref' instances for various data types, as well as automatic
-- derivation of instances.  See "Data.Mutable" for more information.
module Data.Mutable.Instances (
    RecRef(..)
  , HListRef(..)
  -- * Generic
  , GRef(..)
  , gThawRef, gFreezeRef
  , gCopyRef, gMoveRef, gCloneRef
  , gUnsafeThawRef, gUnsafeFreezeRef
  , GMutable (GRef_)
  -- * Higher-Kinded Data Pattern
  , thawHKD, freezeHKD
  , copyHKD, moveHKD, cloneHKD
  , unsafeThawHKD, unsafeFreezeHKD
  -- * Coercible
  , CoerceRef(..)
  , thawCoerce, freezeCoerce
  , copyCoerce, moveCoerce, cloneCoerce
  , unsafeThawCoerce, unsafeFreezeCoerce
  -- * Traversable
  , TraverseRef(..)
  , thawTraverse, freezeTraverse
  , copyTraverse, moveTraverse, cloneTraverse
  , unsafeThawTraverse, unsafeFreezeTraverse
  -- * Immutable
  , ImmutableRef(..), thawImmutable, freezeImmutable, copyImmutable
  -- * Instances for Generics combinators themselves
  , GMutableRef(..)
  , MutSumF(..)
  -- * Utility
  , MapRef
  ) where

import           Control.Applicative
import           Control.Monad.Primitive
import           Data.Complex
import           Data.Functor.Compose
import           Data.Functor.Identity
import           Data.Functor.Product
import           Data.Functor.Sum
import           Data.Generics.Product.Internal.HList      (HList(..))
import           Data.Kind
import           Data.Mutable.Internal
import           Data.Ord
import           Data.Primitive.Array
import           Data.Primitive.ByteArray
import           Data.Primitive.PrimArray
import           Data.Primitive.SmallArray
import           Data.Primitive.Types
import           Data.Ratio
import           Data.Vinyl                    as V hiding (HList)
import           Data.Void
import           Data.Word
import           Foreign.C.Types
import           Foreign.Storable
import           Numeric.Natural
import qualified Data.Monoid                               as M
import qualified Data.Vector                               as V
import qualified Data.Vector.Generic                       as VG
import qualified Data.Vector.Generic.Mutable               as MVG
import qualified Data.Vector.Mutable                       as MV
import qualified Data.Vector.Primitive                     as VP
import qualified Data.Vector.Primitive.Mutable             as MVP
import qualified Data.Vector.Storable                      as VS
import qualified Data.Vector.Storable.Mutable              as MVS
import qualified Data.Vector.Unboxed                       as VU
import qualified Data.Vector.Unboxed.Mutable               as MVU
import qualified Data.Vinyl.ARec                           as V
import qualified Data.Vinyl.Functor                        as V
import qualified Data.Vinyl.TypeLevel                      as V

instance PrimMonad m => Mutable m Int
instance PrimMonad m => Mutable m Integer
instance PrimMonad m => Mutable m Natural
instance PrimMonad m => Mutable m (Ratio a)
instance PrimMonad m => Mutable m Float
instance PrimMonad m => Mutable m Double
instance PrimMonad m => Mutable m (Complex a)
instance PrimMonad m => Mutable m Bool
instance PrimMonad m => Mutable m Char

instance PrimMonad m => Mutable m Word
instance PrimMonad m => Mutable m Word8
instance PrimMonad m => Mutable m Word16
instance PrimMonad m => Mutable m Word64

instance PrimMonad m => Mutable m CChar
instance PrimMonad m => Mutable m CSChar
instance PrimMonad m => Mutable m CUChar
instance PrimMonad m => Mutable m CShort
instance PrimMonad m => Mutable m CUShort
instance PrimMonad m => Mutable m CInt
instance PrimMonad m => Mutable m CUInt
instance PrimMonad m => Mutable m CLong
instance PrimMonad m => Mutable m CULong
instance PrimMonad m => Mutable m CPtrdiff
instance PrimMonad m => Mutable m CSize
instance PrimMonad m => Mutable m CWchar
instance PrimMonad m => Mutable m CSigAtomic
instance PrimMonad m => Mutable m CLLong
instance PrimMonad m => Mutable m CULLong
instance PrimMonad m => Mutable m CBool
instance PrimMonad m => Mutable m CIntPtr
instance PrimMonad m => Mutable m CUIntPtr
instance PrimMonad m => Mutable m CIntMax
instance PrimMonad m => Mutable m CUIntMax
instance PrimMonad m => Mutable m CClock
instance PrimMonad m => Mutable m CTime
instance PrimMonad m => Mutable m CUSeconds
instance PrimMonad m => Mutable m CSUSeconds
instance PrimMonad m => Mutable m CFloat
instance PrimMonad m => Mutable m CDouble

instance Mutable m a => Mutable m (Identity a) where
    type Ref m (Identity a) = CoerceRef m (Identity a) a

instance Mutable m a => Mutable m (Const a b) where
    type Ref m (Const a b) = CoerceRef m (Const a b) a

instance Mutable m a => Mutable m (V.Const a b) where
    type Ref m (V.Const a b) = CoerceRef m (V.Const a b) a

instance Mutable m a => Mutable m (M.Product a) where
    type Ref m (M.Product a) = CoerceRef m (M.Product a) a

instance Mutable m a => Mutable m (M.Sum a) where
    type Ref m (M.Sum a) = CoerceRef m (M.Sum a) a

instance Mutable m a => Mutable m (Down a) where
    type Ref m (Down a) = CoerceRef m (Down a) a

instance Mutable m a => Mutable m (M.Dual a) where
    type Ref m (M.Dual a) = CoerceRef m (M.Dual a) a

instance (Mutable m a, PrimMonad m) => Mutable m (Maybe a) where
    type Ref m (Maybe a) = GRef m (Maybe a)

instance (Mutable m a, Mutable m b, PrimMonad m) => Mutable m (Either a b) where
    type Ref m (Either a b) = GRef m (Either a b)

instance (Mutable m (f a), Mutable m (g a)) => Mutable m (Product f g a) where
    type Ref m (Product f g a) = GRef m (Product f g a)

instance (Mutable m (f a), Mutable m (g a), PrimMonad m) => Mutable m (Sum f g a) where
    type Ref m (Sum f g a) = GRef m (Sum f g a)

instance (Mutable m (f (g a))) => Mutable m (Compose f g a) where
    type Ref m (Compose f g a) = CoerceRef m (Compose f g a) (f (g a))

-- | Mutable linked list with mutable references in each cell.  See
-- 'Data.Mutable.MutBranch' documentation for an example of using this as
-- a mutable linked list.l
instance (PrimMonad m, Mutable m a) => Mutable m [a] where
    type Ref m [a] = GRef m [a]

-- | Meant for usage with higher-kinded data pattern (See 'X.HKD')
instance Mutable m a => Mutable m (V.Identity a) where
    type Ref m (V.Identity a) = RefFor m a
    thawRef :: Identity a -> m (Ref m (Identity a))
thawRef (V.Identity x :: a
x) = Ref m a -> RefFor m a
forall (m :: * -> *) a. Ref m a -> RefFor m a
RefFor (Ref m a -> RefFor m a) -> m (Ref m a) -> m (RefFor m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x
    freezeRef :: Ref m (Identity a) -> m (Identity a)
freezeRef (RefFor r) = a -> Identity a
forall a. a -> Identity a
V.Identity (a -> Identity a) -> m a -> m (Identity a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
r
    copyRef :: Ref m (Identity a) -> Identity a -> m ()
copyRef (RefFor r) (V.Identity x :: a
x) = Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
r a
x
    moveRef :: Ref m (Identity a) -> Ref m (Identity a) -> m ()
moveRef (RefFor r) (RefFor v) = Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
r Ref m a
v
    cloneRef :: Ref m (Identity a) -> m (Ref m (Identity a))
cloneRef = (Ref m a -> RefFor m a) -> m (Ref m a) -> m (RefFor m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Ref m a -> RefFor m a
forall (m :: * -> *) a. Ref m a -> RefFor m a
RefFor (m (Ref m a) -> m (RefFor m a))
-> (RefFor m a -> m (Ref m a)) -> RefFor m a -> m (RefFor m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef (Ref m a -> m (Ref m a))
-> (RefFor m a -> Ref m a) -> RefFor m a -> m (Ref m a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RefFor m a -> Ref m a
forall (m :: * -> *) a. RefFor m a -> Ref m a
getRefFor
    unsafeThawRef :: Identity a -> m (Ref m (Identity a))
unsafeThawRef (V.Identity x :: a
x) = Ref m a -> RefFor m a
forall (m :: * -> *) a. Ref m a -> RefFor m a
RefFor (Ref m a -> RefFor m a) -> m (Ref m a) -> m (RefFor m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x
    unsafeFreezeRef :: Ref m (Identity a) -> m (Identity a)
unsafeFreezeRef (RefFor r) = a -> Identity a
forall a. a -> Identity a
V.Identity (a -> Identity a) -> m a -> m (Identity a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
r

-- | Mutable reference is 'MV.MVector'.
instance PrimMonad m => Mutable m (V.Vector a) where
    type Ref m (V.Vector a) = MV.MVector (PrimState m) a
    thawRef :: Vector a -> m (Ref m (Vector a))
thawRef         = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw
    freezeRef :: Ref m (Vector a) -> m (Vector a)
freezeRef       = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze
    copyRef :: Ref m (Vector a) -> Vector a -> m ()
copyRef         = Ref m (Vector a) -> Vector a -> m ()
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> v a -> m ()
VG.copy
    moveRef :: Ref m (Vector a) -> Ref m (Vector a) -> m ()
moveRef         = Ref m (Vector a) -> Ref m (Vector a) -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
MVG.move
    cloneRef :: Ref m (Vector a) -> m (Ref m (Vector a))
cloneRef        = Ref m (Vector a) -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m (v (PrimState m) a)
MVG.clone
    unsafeThawRef :: Vector a -> m (Ref m (Vector a))
unsafeThawRef   = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw
    unsafeFreezeRef :: Ref m (Vector a) -> m (Vector a)
unsafeFreezeRef = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze

-- | Mutable reference is 'MVS.MVector'.
instance (PrimMonad m, Storable a) => Mutable m (VS.Vector a) where
    type Ref m (VS.Vector a) = MVS.MVector (PrimState m) a
    thawRef :: Vector a -> m (Ref m (Vector a))
thawRef         = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw
    freezeRef :: Ref m (Vector a) -> m (Vector a)
freezeRef       = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze
    copyRef :: Ref m (Vector a) -> Vector a -> m ()
copyRef         = Ref m (Vector a) -> Vector a -> m ()
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> v a -> m ()
VG.copy
    moveRef :: Ref m (Vector a) -> Ref m (Vector a) -> m ()
moveRef         = Ref m (Vector a) -> Ref m (Vector a) -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
MVG.move
    cloneRef :: Ref m (Vector a) -> m (Ref m (Vector a))
cloneRef        = Ref m (Vector a) -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m (v (PrimState m) a)
MVG.clone
    unsafeThawRef :: Vector a -> m (Ref m (Vector a))
unsafeThawRef   = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw
    unsafeFreezeRef :: Ref m (Vector a) -> m (Vector a)
unsafeFreezeRef = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze

-- | Mutable reference is 'MVU.MVector'.
instance (PrimMonad m, VU.Unbox a) => Mutable m (VU.Vector a) where
    type Ref m (VU.Vector a) = MVU.MVector (PrimState m) a
    thawRef :: Vector a -> m (Ref m (Vector a))
thawRef         = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw
    freezeRef :: Ref m (Vector a) -> m (Vector a)
freezeRef       = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze
    copyRef :: Ref m (Vector a) -> Vector a -> m ()
copyRef         = Ref m (Vector a) -> Vector a -> m ()
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> v a -> m ()
VG.copy
    moveRef :: Ref m (Vector a) -> Ref m (Vector a) -> m ()
moveRef         = Ref m (Vector a) -> Ref m (Vector a) -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
MVG.move
    cloneRef :: Ref m (Vector a) -> m (Ref m (Vector a))
cloneRef        = Ref m (Vector a) -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m (v (PrimState m) a)
MVG.clone
    unsafeThawRef :: Vector a -> m (Ref m (Vector a))
unsafeThawRef   = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw
    unsafeFreezeRef :: Ref m (Vector a) -> m (Vector a)
unsafeFreezeRef = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze

-- | Mutable reference is 'MVP.MVector'.
instance (PrimMonad m, Prim a) => Mutable m (VP.Vector a) where
    type Ref m (VP.Vector a) = MVP.MVector (PrimState m) a
    thawRef :: Vector a -> m (Ref m (Vector a))
thawRef         = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.thaw
    freezeRef :: Ref m (Vector a) -> m (Vector a)
freezeRef       = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.freeze
    copyRef :: Ref m (Vector a) -> Vector a -> m ()
copyRef         = Ref m (Vector a) -> Vector a -> m ()
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> v a -> m ()
VG.copy
    moveRef :: Ref m (Vector a) -> Ref m (Vector a) -> m ()
moveRef         = Ref m (Vector a) -> Ref m (Vector a) -> m ()
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> v (PrimState m) a -> m ()
MVG.move
    cloneRef :: Ref m (Vector a) -> m (Ref m (Vector a))
cloneRef        = Ref m (Vector a) -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> * -> *) a.
(PrimMonad m, MVector v a) =>
v (PrimState m) a -> m (v (PrimState m) a)
MVG.clone
    unsafeThawRef :: Vector a -> m (Ref m (Vector a))
unsafeThawRef   = Vector a -> m (Ref m (Vector a))
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
v a -> m (Mutable v (PrimState m) a)
VG.unsafeThaw
    unsafeFreezeRef :: Ref m (Vector a) -> m (Vector a)
unsafeFreezeRef = Ref m (Vector a) -> m (Vector a)
forall (m :: * -> *) (v :: * -> *) a.
(PrimMonad m, Vector v a) =>
Mutable v (PrimState m) a -> m (v a)
VG.unsafeFreeze

instance PrimMonad m => Mutable m (Array a) where
    type Ref m (Array a) = MutableArray (PrimState m) a

    thawRef :: Array a -> m (Ref m (Array a))
thawRef xs :: Array a
xs = Array a -> Int -> Int -> m (MutableArray (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
Array a -> Int -> Int -> m (MutableArray (PrimState m) a)
thawArray Array a
xs 0 (Array a -> Int
forall a. Array a -> Int
sizeofArray Array a
xs)
    freezeRef :: Ref m (Array a) -> m (Array a)
freezeRef rs :: Ref m (Array a)
rs = MutableArray (PrimState m) a -> Int -> Int -> m (Array a)
forall (m :: * -> *) a.
PrimMonad m =>
MutableArray (PrimState m) a -> Int -> Int -> m (Array a)
freezeArray MutableArray (PrimState m) a
Ref m (Array a)
rs 0 (MutableArray (PrimState m) a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs)
    copyRef :: Ref m (Array a) -> Array a -> m ()
copyRef rs :: Ref m (Array a)
rs xs :: Array a
xs = MutableArray (PrimState m) a
-> Int -> Array a -> Int -> Int -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutableArray (PrimState m) a
-> Int -> Array a -> Int -> Int -> m ()
copyArray MutableArray (PrimState m) a
Ref m (Array a)
rs 0 Array a
xs 0 Int
l
      where
        l :: Int
l = Array a -> Int
forall a. Array a -> Int
sizeofArray Array a
xs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutableArray (PrimState m) a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs
    moveRef :: Ref m (Array a) -> Ref m (Array a) -> m ()
moveRef rs :: Ref m (Array a)
rs vs :: Ref m (Array a)
vs = MutableArray (PrimState m) a
-> Int -> MutableArray (PrimState m) a -> Int -> Int -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MutableArray (PrimState m) a
-> Int -> MutableArray (PrimState m) a -> Int -> Int -> m ()
copyMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs 0 MutableArray (PrimState m) a
Ref m (Array a)
vs 0 Int
l
      where
        l :: Int
l = MutableArray (PrimState m) a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray (PrimState m) a
Ref m (Array a)
vs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutableArray (PrimState m) a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs
    cloneRef :: Ref m (Array a) -> m (Ref m (Array a))
cloneRef rs :: Ref m (Array a)
rs = MutableArray (PrimState m) a
-> Int -> Int -> m (MutableArray (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
MutableArray (PrimState m) a
-> Int -> Int -> m (MutableArray (PrimState m) a)
cloneMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs 0 (MutableArray (PrimState m) a -> Int
forall s a. MutableArray s a -> Int
sizeofMutableArray MutableArray (PrimState m) a
Ref m (Array a)
rs)
    unsafeThawRef :: Array a -> m (Ref m (Array a))
unsafeThawRef   = Array a -> m (Ref m (Array a))
forall (m :: * -> *) a.
PrimMonad m =>
Array a -> m (MutableArray (PrimState m) a)
unsafeThawArray
    unsafeFreezeRef :: Ref m (Array a) -> m (Array a)
unsafeFreezeRef = Ref m (Array a) -> m (Array a)
forall (m :: * -> *) a.
PrimMonad m =>
MutableArray (PrimState m) a -> m (Array a)
unsafeFreezeArray

instance PrimMonad m => Mutable m (SmallArray a) where
    type Ref m (SmallArray a) = SmallMutableArray (PrimState m) a

    thawRef :: SmallArray a -> m (Ref m (SmallArray a))
thawRef xs :: SmallArray a
xs = SmallArray a -> Int -> Int -> m (SmallMutableArray (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
SmallArray a -> Int -> Int -> m (SmallMutableArray (PrimState m) a)
thawSmallArray SmallArray a
xs 0 (SmallArray a -> Int
forall a. SmallArray a -> Int
sizeofSmallArray SmallArray a
xs)
    freezeRef :: Ref m (SmallArray a) -> m (SmallArray a)
freezeRef rs :: Ref m (SmallArray a)
rs = SmallMutableArray (PrimState m) a -> Int -> Int -> m (SmallArray a)
forall (m :: * -> *) a.
PrimMonad m =>
SmallMutableArray (PrimState m) a -> Int -> Int -> m (SmallArray a)
freezeSmallArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs 0 (SmallMutableArray (PrimState m) a -> Int
forall s a. SmallMutableArray s a -> Int
sizeofSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs)
    copyRef :: Ref m (SmallArray a) -> SmallArray a -> m ()
copyRef rs :: Ref m (SmallArray a)
rs xs :: SmallArray a
xs = SmallMutableArray (PrimState m) a
-> Int -> SmallArray a -> Int -> Int -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
SmallMutableArray (PrimState m) a
-> Int -> SmallArray a -> Int -> Int -> m ()
copySmallArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs 0 SmallArray a
xs 0 Int
l
      where
        l :: Int
l = SmallArray a -> Int
forall a. SmallArray a -> Int
sizeofSmallArray SmallArray a
xs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` SmallMutableArray (PrimState m) a -> Int
forall s a. SmallMutableArray s a -> Int
sizeofSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs
    moveRef :: Ref m (SmallArray a) -> Ref m (SmallArray a) -> m ()
moveRef rs :: Ref m (SmallArray a)
rs vs :: Ref m (SmallArray a)
vs = SmallMutableArray (PrimState m) a
-> Int -> SmallMutableArray (PrimState m) a -> Int -> Int -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
SmallMutableArray (PrimState m) a
-> Int -> SmallMutableArray (PrimState m) a -> Int -> Int -> m ()
copySmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs 0 SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
vs 0 Int
l
      where
        l :: Int
l = SmallMutableArray (PrimState m) a -> Int
forall s a. SmallMutableArray s a -> Int
sizeofSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
vs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` SmallMutableArray (PrimState m) a -> Int
forall s a. SmallMutableArray s a -> Int
sizeofSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs
    cloneRef :: Ref m (SmallArray a) -> m (Ref m (SmallArray a))
cloneRef rs :: Ref m (SmallArray a)
rs = SmallMutableArray (PrimState m) a
-> Int -> Int -> m (SmallMutableArray (PrimState m) a)
forall (m :: * -> *) a.
PrimMonad m =>
SmallMutableArray (PrimState m) a
-> Int -> Int -> m (SmallMutableArray (PrimState m) a)
cloneSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs 0 (SmallMutableArray (PrimState m) a -> Int
forall s a. SmallMutableArray s a -> Int
sizeofSmallMutableArray SmallMutableArray (PrimState m) a
Ref m (SmallArray a)
rs)
    unsafeThawRef :: SmallArray a -> m (Ref m (SmallArray a))
unsafeThawRef   = SmallArray a -> m (Ref m (SmallArray a))
forall (m :: * -> *) a.
PrimMonad m =>
SmallArray a -> m (SmallMutableArray (PrimState m) a)
unsafeThawSmallArray
    unsafeFreezeRef :: Ref m (SmallArray a) -> m (SmallArray a)
unsafeFreezeRef = Ref m (SmallArray a) -> m (SmallArray a)
forall (m :: * -> *) a.
PrimMonad m =>
SmallMutableArray (PrimState m) a -> m (SmallArray a)
unsafeFreezeSmallArray

instance PrimMonad m => Mutable m ByteArray where
    type Ref m ByteArray = MutableByteArray (PrimState m)

    thawRef :: ByteArray -> m (Ref m ByteArray)
thawRef xs :: ByteArray
xs = do
        MutableByteArray (PrimState m)
rs <- Int -> m (MutableByteArray (PrimState m))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray (ByteArray -> Int
sizeofByteArray ByteArray
xs)
        MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
copyByteArray MutableByteArray (PrimState m)
rs 0 ByteArray
xs 0 (ByteArray -> Int
sizeofByteArray ByteArray
xs)
        MutableByteArray (PrimState m)
-> m (MutableByteArray (PrimState m))
forall (f :: * -> *) a. Applicative f => a -> f a
pure MutableByteArray (PrimState m)
rs
    freezeRef :: Ref m ByteArray -> m ByteArray
freezeRef rs :: Ref m ByteArray
rs = do
        MutableByteArray (PrimState m)
xs <- Int -> m (MutableByteArray (PrimState m))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray (MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs)
        MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
copyMutableByteArray MutableByteArray (PrimState m)
xs 0 MutableByteArray (PrimState m)
Ref m ByteArray
rs 0 (MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs)
        MutableByteArray (PrimState m) -> m ByteArray
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m) -> m ByteArray
unsafeFreezeByteArray MutableByteArray (PrimState m)
xs
    copyRef :: Ref m ByteArray -> ByteArray -> m ()
copyRef rs :: Ref m ByteArray
rs xs :: ByteArray
xs = MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> ByteArray -> Int -> Int -> m ()
copyByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs 0 ByteArray
xs 0 Int
l
      where
        l :: Int
l = ByteArray -> Int
sizeofByteArray ByteArray
xs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs
    moveRef :: Ref m ByteArray -> Ref m ByteArray -> m ()
moveRef rs :: Ref m ByteArray
rs vs :: Ref m ByteArray
vs = MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
copyMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs 0 MutableByteArray (PrimState m)
Ref m ByteArray
vs 0 Int
l
      where
        l :: Int
l = MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
vs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs
    cloneRef :: Ref m ByteArray -> m (Ref m ByteArray)
cloneRef rs :: Ref m ByteArray
rs = do
        MutableByteArray (PrimState m)
vs <- Int -> m (MutableByteArray (PrimState m))
forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray (MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs)
        MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m)
-> Int -> MutableByteArray (PrimState m) -> Int -> Int -> m ()
copyMutableByteArray MutableByteArray (PrimState m)
vs 0 MutableByteArray (PrimState m)
Ref m ByteArray
rs 0 (MutableByteArray (PrimState m) -> Int
forall s. MutableByteArray s -> Int
sizeofMutableByteArray MutableByteArray (PrimState m)
Ref m ByteArray
rs)
        MutableByteArray (PrimState m)
-> m (MutableByteArray (PrimState m))
forall (f :: * -> *) a. Applicative f => a -> f a
pure MutableByteArray (PrimState m)
vs
    unsafeThawRef :: ByteArray -> m (Ref m ByteArray)
unsafeThawRef   = ByteArray -> m (Ref m ByteArray)
forall (m :: * -> *).
PrimMonad m =>
ByteArray -> m (MutableByteArray (PrimState m))
unsafeThawByteArray
    unsafeFreezeRef :: Ref m ByteArray -> m ByteArray
unsafeFreezeRef = Ref m ByteArray -> m ByteArray
forall (m :: * -> *).
PrimMonad m =>
MutableByteArray (PrimState m) -> m ByteArray
unsafeFreezeByteArray

instance (PrimMonad m, Prim a) => Mutable m (PrimArray a) where
    type Ref m (PrimArray a) = MutablePrimArray (PrimState m) a

    thawRef :: PrimArray a -> m (Ref m (PrimArray a))
thawRef xs :: PrimArray a
xs = do
        MutablePrimArray (PrimState m) a
rs <- Int -> m (MutablePrimArray (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
Int -> m (MutablePrimArray (PrimState m) a)
newPrimArray (PrimArray a -> Int
forall a. Prim a => PrimArray a -> Int
sizeofPrimArray PrimArray a
xs)
        MutablePrimArray (PrimState m) a
-> Int -> PrimArray a -> Int -> Int -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
MutablePrimArray (PrimState m) a
-> Int -> PrimArray a -> Int -> Int -> m ()
copyPrimArray MutablePrimArray (PrimState m) a
rs 0 PrimArray a
xs 0 (PrimArray a -> Int
forall a. Prim a => PrimArray a -> Int
sizeofPrimArray PrimArray a
xs)
        MutablePrimArray (PrimState m) a
-> m (MutablePrimArray (PrimState m) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure MutablePrimArray (PrimState m) a
rs
    freezeRef :: Ref m (PrimArray a) -> m (PrimArray a)
freezeRef rs :: Ref m (PrimArray a)
rs = do
        MutablePrimArray (PrimState m) a
xs <- Int -> m (MutablePrimArray (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
Int -> m (MutablePrimArray (PrimState m) a)
newPrimArray (MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs)
        MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
copyMutablePrimArray MutablePrimArray (PrimState m) a
xs 0 MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs 0 (MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs)
        MutablePrimArray (PrimState m) a -> m (PrimArray a)
forall (m :: * -> *) a.
PrimMonad m =>
MutablePrimArray (PrimState m) a -> m (PrimArray a)
unsafeFreezePrimArray MutablePrimArray (PrimState m) a
xs
    copyRef :: Ref m (PrimArray a) -> PrimArray a -> m ()
copyRef rs :: Ref m (PrimArray a)
rs xs :: PrimArray a
xs = MutablePrimArray (PrimState m) a
-> Int -> PrimArray a -> Int -> Int -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
MutablePrimArray (PrimState m) a
-> Int -> PrimArray a -> Int -> Int -> m ()
copyPrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs 0 PrimArray a
xs 0 Int
l
      where
        l :: Int
l = PrimArray a -> Int
forall a. Prim a => PrimArray a -> Int
sizeofPrimArray PrimArray a
xs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs
    moveRef :: Ref m (PrimArray a) -> Ref m (PrimArray a) -> m ()
moveRef rs :: Ref m (PrimArray a)
rs vs :: Ref m (PrimArray a)
vs = MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
copyMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs 0 MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
vs 0 Int
l
      where
        l :: Int
l = MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
vs Int -> Int -> Int
forall a. Ord a => a -> a -> a
`min` MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs
    cloneRef :: Ref m (PrimArray a) -> m (Ref m (PrimArray a))
cloneRef rs :: Ref m (PrimArray a)
rs = do
        MutablePrimArray (PrimState m) a
vs <- Int -> m (MutablePrimArray (PrimState m) a)
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
Int -> m (MutablePrimArray (PrimState m) a)
newPrimArray (MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs)
        MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
forall (m :: * -> *) a.
(PrimMonad m, Prim a) =>
MutablePrimArray (PrimState m) a
-> Int -> MutablePrimArray (PrimState m) a -> Int -> Int -> m ()
copyMutablePrimArray MutablePrimArray (PrimState m) a
vs 0 MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs 0 (MutablePrimArray (PrimState m) a -> Int
forall s a. Prim a => MutablePrimArray s a -> Int
sizeofMutablePrimArray MutablePrimArray (PrimState m) a
Ref m (PrimArray a)
rs)
        MutablePrimArray (PrimState m) a
-> m (MutablePrimArray (PrimState m) a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure MutablePrimArray (PrimState m) a
vs
    unsafeThawRef :: PrimArray a -> m (Ref m (PrimArray a))
unsafeThawRef   = PrimArray a -> m (Ref m (PrimArray a))
forall (m :: * -> *) a.
PrimMonad m =>
PrimArray a -> m (MutablePrimArray (PrimState m) a)
unsafeThawPrimArray
    unsafeFreezeRef :: Ref m (PrimArray a) -> m (PrimArray a)
unsafeFreezeRef = Ref m (PrimArray a) -> m (PrimArray a)
forall (m :: * -> *) a.
PrimMonad m =>
MutablePrimArray (PrimState m) a -> m (PrimArray a)
unsafeFreezePrimArray


    

instance Monad m => Mutable m Void where
    type Ref m Void = Void
    thawRef :: Void -> m (Ref m Void)
thawRef         = \case {}
    freezeRef :: Ref m Void -> m Void
freezeRef       = \case {}
    copyRef :: Ref m Void -> Void -> m ()
copyRef         = \case {}
    moveRef :: Ref m Void -> Ref m Void -> m ()
moveRef         = \case {}
    cloneRef :: Ref m Void -> m (Ref m Void)
cloneRef        = \case {}
    unsafeThawRef :: Void -> m (Ref m Void)
unsafeThawRef   = \case {}
    unsafeFreezeRef :: Ref m Void -> m Void
unsafeFreezeRef = \case {}

instance Monad m => Mutable m () where
    type Ref m () = ()
    thawRef :: () -> m (Ref m ())
thawRef   _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    freezeRef :: Ref m () -> m ()
freezeRef _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    copyRef :: Ref m () -> () -> m ()
copyRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    moveRef :: Ref m () -> Ref m () -> m ()
moveRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    cloneRef :: Ref m () -> m (Ref m ())
cloneRef _        = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    unsafeThawRef :: () -> m (Ref m ())
unsafeThawRef _   = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    unsafeFreezeRef :: Ref m () -> m ()
unsafeFreezeRef _ = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()

-- | A 'Ref' of a tuple is a tuple of 'Ref's, for easy accessing.
--
-- @
-- Ref m (Int, 'V.Vector' Double) = ('Data.Primitive.MutVar.MutVar' s Int, 'MV.MVector' s Double)
-- @
instance (Monad m, Mutable m a, Mutable m b) => Mutable m (a, b) where
    type Ref m (a, b) = (Ref m a, Ref m b)
    thawRef :: (a, b) -> m (Ref m (a, b))
thawRef   (!a
x, !b
y) = (,) (Ref m a -> Ref m b -> (Ref m a, Ref m b))
-> m (Ref m a) -> m (Ref m b -> (Ref m a, Ref m b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x   m (Ref m b -> (Ref m a, Ref m b))
-> m (Ref m b) -> m (Ref m a, Ref m b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef b
y
    freezeRef :: Ref m (a, b) -> m (a, b)
freezeRef (u , v ) = (,) (a -> b -> (a, b)) -> m a -> m (b -> (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
u m (b -> (a, b)) -> m b -> m (a, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m b
v
    copyRef :: Ref m (a, b) -> (a, b) -> m ()
copyRef   (u , v ) (!a
x, !b
y) = Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
u a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m b
v b
y
    moveRef :: Ref m (a, b) -> Ref m (a, b) -> m ()
moveRef   (u , v ) ( x,  y) = Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
u Ref m a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> Ref m b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m b
v Ref m b
y
    cloneRef :: Ref m (a, b) -> m (Ref m (a, b))
cloneRef  (x , y ) = (,) (Ref m a -> Ref m b -> (Ref m a, Ref m b))
-> m (Ref m a) -> m (Ref m b -> (Ref m a, Ref m b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m a
x   m (Ref m b -> (Ref m a, Ref m b))
-> m (Ref m b) -> m (Ref m a, Ref m b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m b
y
    unsafeThawRef :: (a, b) -> m (Ref m (a, b))
unsafeThawRef   (!a
x, !b
y) = (,) (Ref m a -> Ref m b -> (Ref m a, Ref m b))
-> m (Ref m a) -> m (Ref m b -> (Ref m a, Ref m b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x   m (Ref m b -> (Ref m a, Ref m b))
-> m (Ref m b) -> m (Ref m a, Ref m b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef b
y
    unsafeFreezeRef :: Ref m (a, b) -> m (a, b)
unsafeFreezeRef (u , v ) = (,) (a -> b -> (a, b)) -> m a -> m (b -> (a, b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
u m (b -> (a, b)) -> m b -> m (a, b)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m b
v

-- | A 'Ref' of a tuple is a tuple of 'Ref's, for easy accessing.
instance (Monad m, Mutable m a, Mutable m b, Mutable m c) => Mutable m (a, b, c) where
    type Ref m (a, b, c) = (Ref m a, Ref m b, Ref m c)
    thawRef :: (a, b, c) -> m (Ref m (a, b, c))
thawRef   (!a
x, !b
y, !c
z) = (,,) (Ref m a -> Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m a)
-> m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x   m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m b) -> m (Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef b
y   m (Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m c) -> m (Ref m a, Ref m b, Ref m c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef c
z
    freezeRef :: Ref m (a, b, c) -> m (a, b, c)
freezeRef (u , v , w ) = (,,) (a -> b -> c -> (a, b, c)) -> m a -> m (b -> c -> (a, b, c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
u m (b -> c -> (a, b, c)) -> m b -> m (c -> (a, b, c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m b
v m (c -> (a, b, c)) -> m c -> m (a, b, c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m c
w
    copyRef :: Ref m (a, b, c) -> (a, b, c) -> m ()
copyRef   (u , v , w ) (!a
x, !b
y, !c
z) = Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
u a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m b
v b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m c
w c
z
    moveRef :: Ref m (a, b, c) -> Ref m (a, b, c) -> m ()
moveRef   (u , v , w ) ( x,  y,  z) = Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
u Ref m a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> Ref m b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m b
v Ref m b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> Ref m c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m c
w Ref m c
z
    cloneRef :: Ref m (a, b, c) -> m (Ref m (a, b, c))
cloneRef  (x , y , z ) = (,,) (Ref m a -> Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m a)
-> m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m a
x   m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m b) -> m (Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m b
y   m (Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m c) -> m (Ref m a, Ref m b, Ref m c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m c
z
    unsafeThawRef :: (a, b, c) -> m (Ref m (a, b, c))
unsafeThawRef   (!a
x, !b
y, !c
z) = (,,) (Ref m a -> Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m a)
-> m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x   m (Ref m b -> Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m b) -> m (Ref m c -> (Ref m a, Ref m b, Ref m c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef b
y   m (Ref m c -> (Ref m a, Ref m b, Ref m c))
-> m (Ref m c) -> m (Ref m a, Ref m b, Ref m c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef c
z
    unsafeFreezeRef :: Ref m (a, b, c) -> m (a, b, c)
unsafeFreezeRef (u , v , w ) = (,,) (a -> b -> c -> (a, b, c)) -> m a -> m (b -> c -> (a, b, c))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
u m (b -> c -> (a, b, c)) -> m b -> m (c -> (a, b, c))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m b
v m (c -> (a, b, c)) -> m c -> m (a, b, c)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m c
w

-- | A 'Ref' of a tuple is a tuple of 'Ref's, for easy accessing.
instance (Monad m, Mutable m a, Mutable m b, Mutable m c, Mutable m d) => Mutable m (a, b, c, d) where
    type Ref m (a, b, c, d) = (Ref m a, Ref m b, Ref m c, Ref m d)
    thawRef :: (a, b, c, d) -> m (Ref m (a, b, c, d))
thawRef   (!a
x, !b
y, !c
z, !d
a) = (,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x   m (Ref m b
   -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m b)
-> m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef b
y   m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m c)
-> m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef c
z   m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m d) -> m (Ref m a, Ref m b, Ref m c, Ref m d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef d
a
    freezeRef :: Ref m (a, b, c, d) -> m (a, b, c, d)
freezeRef (u , v , w , j ) = (,,,) (a -> b -> c -> d -> (a, b, c, d))
-> m a -> m (b -> c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
u m (b -> c -> d -> (a, b, c, d))
-> m b -> m (c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m b
v m (c -> d -> (a, b, c, d)) -> m c -> m (d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m c
w m (d -> (a, b, c, d)) -> m d -> m (a, b, c, d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m d
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m d
j
    copyRef :: Ref m (a, b, c, d) -> (a, b, c, d) -> m ()
copyRef   (u , v , w , j ) (!a
x, !b
y, !c
z, !d
a) = Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
u a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m b
v b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m c
w c
z m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m d -> d -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m d
j d
a
    moveRef :: Ref m (a, b, c, d) -> Ref m (a, b, c, d) -> m ()
moveRef   (u , v , w , j ) ( x,  y,  z,  a) = Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
u Ref m a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> Ref m b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m b
v Ref m b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> Ref m c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m c
w Ref m c
z m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m d -> Ref m d -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m d
j Ref m d
a
    cloneRef :: Ref m (a, b, c, d) -> m (Ref m (a, b, c, d))
cloneRef  (x , y , z , a ) = (,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m a
x   m (Ref m b
   -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m b)
-> m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m b
y   m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m c)
-> m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m c
z   m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m d) -> m (Ref m a, Ref m b, Ref m c, Ref m d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m d
a
    unsafeThawRef :: (a, b, c, d) -> m (Ref m (a, b, c, d))
unsafeThawRef   (!a
x, !b
y, !c
z, !d
a) = (,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x   m (Ref m b
   -> Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m b)
-> m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef b
y   m (Ref m c -> Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m c)
-> m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef c
z   m (Ref m d -> (Ref m a, Ref m b, Ref m c, Ref m d))
-> m (Ref m d) -> m (Ref m a, Ref m b, Ref m c, Ref m d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef d
a
    unsafeFreezeRef :: Ref m (a, b, c, d) -> m (a, b, c, d)
unsafeFreezeRef (u , v , w , j ) = (,,,) (a -> b -> c -> d -> (a, b, c, d))
-> m a -> m (b -> c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
u m (b -> c -> d -> (a, b, c, d))
-> m b -> m (c -> d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m b
v m (c -> d -> (a, b, c, d)) -> m c -> m (d -> (a, b, c, d))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m c
w m (d -> (a, b, c, d)) -> m d -> m (a, b, c, d)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m d
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m d
j

-- | A 'Ref' of a tuple is a tuple of 'Ref's, for easy accessing.
instance (Monad m, Mutable m a, Mutable m b, Mutable m c, Mutable m d, Mutable m e) => Mutable m (a, b, c, d, e) where
    type Ref m (a, b, c, d, e) = (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e)
    thawRef :: (a, b, c, d, e) -> m (Ref m (a, b, c, d, e))
thawRef   (!a
x, !b
y, !c
z, !d
a, !e
b) = (,,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> Ref m e
 -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x   m (Ref m b
   -> Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m b)
-> m (Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef b
y   m (Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m c)
-> m (Ref m d
      -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef c
z   m (Ref m d
   -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m d)
-> m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef d
a   m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m e) -> m (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> e -> m (Ref m e)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef e
b
    freezeRef :: Ref m (a, b, c, d, e) -> m (a, b, c, d, e)
freezeRef (u , v , w , j , k ) = (,,,,) (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> m a -> m (b -> c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
u m (b -> c -> d -> e -> (a, b, c, d, e))
-> m b -> m (c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m b
v m (c -> d -> e -> (a, b, c, d, e))
-> m c -> m (d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m c
w m (d -> e -> (a, b, c, d, e)) -> m d -> m (e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m d
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m d
j m (e -> (a, b, c, d, e)) -> m e -> m (a, b, c, d, e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m e -> m e
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m e
k
    copyRef :: Ref m (a, b, c, d, e) -> (a, b, c, d, e) -> m ()
copyRef   (u , v , w , j , k ) (!a
x, !b
y, !c
z, !d
a, !e
b) = Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
u a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m b
v b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m c
w c
z m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m d -> d -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m d
j d
a m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m e -> e -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m e
k e
b
    moveRef :: Ref m (a, b, c, d, e) -> Ref m (a, b, c, d, e) -> m ()
moveRef   (u , v , w , j , k ) ( x,  y,  z,  a,  b) = Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
u Ref m a
x m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m b -> Ref m b -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m b
v Ref m b
y m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m c -> Ref m c -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m c
w Ref m c
z m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m d -> Ref m d -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m d
j Ref m d
a m () -> m () -> m ()
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Ref m e -> Ref m e -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m e
k Ref m e
b
    cloneRef :: Ref m (a, b, c, d, e) -> m (Ref m (a, b, c, d, e))
cloneRef  (x , y , z , a , b ) = (,,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> Ref m e
 -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m a
x   m (Ref m b
   -> Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m b)
-> m (Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m b
y   m (Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m c)
-> m (Ref m d
      -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m c
z   m (Ref m d
   -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m d)
-> m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m d
a   m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m e) -> m (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m e -> m (Ref m e)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m e
b
    unsafeThawRef :: (a, b, c, d, e) -> m (Ref m (a, b, c, d, e))
unsafeThawRef   (!a
x, !b
y, !c
z, !d
a, !e
b) = (,,,,) (Ref m a
 -> Ref m b
 -> Ref m c
 -> Ref m d
 -> Ref m e
 -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m a)
-> m (Ref m b
      -> Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x   m (Ref m b
   -> Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m b)
-> m (Ref m c
      -> Ref m d
      -> Ref m e
      -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> b -> m (Ref m b)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef b
y   m (Ref m c
   -> Ref m d
   -> Ref m e
   -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m c)
-> m (Ref m d
      -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> c -> m (Ref m c)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef c
z   m (Ref m d
   -> Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m d)
-> m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> d -> m (Ref m d)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef d
a   m (Ref m e -> (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e))
-> m (Ref m e) -> m (Ref m a, Ref m b, Ref m c, Ref m d, Ref m e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> e -> m (Ref m e)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef e
b
    unsafeFreezeRef :: Ref m (a, b, c, d, e) -> m (a, b, c, d, e)
unsafeFreezeRef (u , v , w , j , k ) = (,,,,) (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> m a -> m (b -> c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
u m (b -> c -> d -> e -> (a, b, c, d, e))
-> m b -> m (c -> d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m b -> m b
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m b
v m (c -> d -> e -> (a, b, c, d, e))
-> m c -> m (d -> e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m c -> m c
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m c
w m (d -> e -> (a, b, c, d, e)) -> m d -> m (e -> (a, b, c, d, e))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m d -> m d
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m d
j m (e -> (a, b, c, d, e)) -> m e -> m (a, b, c, d, e)
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m e -> m e
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m e
k

-- | 'Ref' for components in a vinyl 'Rec'.
newtype RecRef m f a = RecRef { RecRef m f a -> Ref m (f a)
getRecRef :: Ref m (f a) }

deriving instance Eq (Ref m (f a)) => Eq (RecRef m f a)
deriving instance Ord (Ref m (f a)) => Ord (RecRef m f a)

instance Monad m => Mutable m (Rec f '[]) where
    type Ref m (Rec f '[]) = Rec (RecRef m f) '[]
    thawRef :: Rec f '[] -> m (Ref m (Rec f '[]))
thawRef   _       = Rec (RecRef m f) '[] -> m (Rec (RecRef m f) '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec (RecRef m f) '[]
forall u (a :: u -> *). Rec a '[]
RNil
    freezeRef :: Ref m (Rec f '[]) -> m (Rec f '[])
freezeRef _       = Rec f '[] -> m (Rec f '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec f '[]
forall u (a :: u -> *). Rec a '[]
RNil
    copyRef :: Ref m (Rec f '[]) -> Rec f '[] -> m ()
copyRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    moveRef :: Ref m (Rec f '[]) -> Ref m (Rec f '[]) -> m ()
moveRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    cloneRef :: Ref m (Rec f '[]) -> m (Ref m (Rec f '[]))
cloneRef _        = Rec (RecRef m f) '[] -> m (Rec (RecRef m f) '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec (RecRef m f) '[]
forall u (a :: u -> *). Rec a '[]
RNil
    unsafeThawRef :: Rec f '[] -> m (Ref m (Rec f '[]))
unsafeThawRef _   = Rec (RecRef m f) '[] -> m (Rec (RecRef m f) '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec (RecRef m f) '[]
forall u (a :: u -> *). Rec a '[]
RNil
    unsafeFreezeRef :: Ref m (Rec f '[]) -> m (Rec f '[])
unsafeFreezeRef _ = Rec f '[] -> m (Rec f '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure Rec f '[]
forall u (a :: u -> *). Rec a '[]
RNil

instance (Monad m, Mutable m (f a), Mutable m (Rec f as), Ref m (Rec f as) ~ Rec (RecRef m f) as) => Mutable m (Rec f (a ': as)) where
    type Ref m (Rec f (a ': as)) = Rec (RecRef m f) (a ': as)
    thawRef :: Rec f (a : as) -> m (Ref m (Rec f (a : as)))
thawRef   = \case
      x :: f r
x :& xs :: Rec f rs
xs -> RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&) (RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (RecRef m f a)
-> m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ref m (f a) -> RecRef m f a
forall k (m :: * -> *) (f :: k -> *) (a :: k).
Ref m (f a) -> RecRef m f a
RecRef (Ref m (f a) -> RecRef m f a)
-> m (Ref m (f a)) -> m (RecRef m f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f r -> m (Ref m (f r))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef f r
x) m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (Rec (RecRef m f) as) -> m (Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Rec f rs -> m (Ref m (Rec f rs))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef Rec f rs
xs
    freezeRef :: Ref m (Rec f (a : as)) -> m (Rec f (a : as))
freezeRef = \case
      RecRef v :& vs -> f a -> Rec f as -> Rec f (a : as)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&) (f a -> Rec f as -> Rec f (a : as))
-> m (f a) -> m (Rec f as -> Rec f (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m (f a) -> m (f a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m (f a)
Ref m (f r)
v m (Rec f as -> Rec f (a : as))
-> m (Rec f as) -> m (Rec f (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (Rec f as) -> m (Rec f as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Rec (RecRef m f) rs
Ref m (Rec f as)
vs
    copyRef :: Ref m (Rec f (a : as)) -> Rec f (a : as) -> m ()
copyRef = \case
      RecRef v :& vs -> \case
        x :: f r
x :& xs :: Rec f rs
xs -> Ref m (f r) -> f r -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m (f r)
Ref m (f r)
v f r
x m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ref m (Rec f rs) -> Rec f rs -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Rec (RecRef m f) rs
Ref m (Rec f rs)
vs Rec f rs
xs
    moveRef :: Ref m (Rec f (a : as)) -> Ref m (Rec f (a : as)) -> m ()
moveRef = \case
      RecRef v :& vs -> \case
        RecRef r :& rs ->
          Ref m (f a) -> Ref m (f a) -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m (f a)
Ref m (f r)
v Ref m (f a)
Ref m (f r)
r m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ref m (Rec f as) -> Ref m (Rec f as) -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Rec (RecRef m f) rs
Ref m (Rec f as)
vs Rec (RecRef m f) rs
Ref m (Rec f as)
rs
    cloneRef :: Ref m (Rec f (a : as)) -> m (Ref m (Rec f (a : as)))
cloneRef = \case
      RecRef v :& rs -> RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&) (RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (RecRef m f a)
-> m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ref m (f a) -> RecRef m f a
forall k (m :: * -> *) (f :: k -> *) (a :: k).
Ref m (f a) -> RecRef m f a
RecRef (Ref m (f a) -> RecRef m f a)
-> m (Ref m (f a)) -> m (RecRef m f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m (f a) -> m (Ref m (f a))
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m (f a)
Ref m (f r)
v) m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (Rec (RecRef m f) as) -> m (Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (Rec f as) -> m (Ref m (Rec f as))
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Rec (RecRef m f) rs
Ref m (Rec f as)
rs
    unsafeThawRef :: Rec f (a : as) -> m (Ref m (Rec f (a : as)))
unsafeThawRef   = \case
      x :: f r
x :& xs :: Rec f rs
xs -> RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&) (RecRef m f a -> Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (RecRef m f a)
-> m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (Ref m (f a) -> RecRef m f a
forall k (m :: * -> *) (f :: k -> *) (a :: k).
Ref m (f a) -> RecRef m f a
RecRef (Ref m (f a) -> RecRef m f a)
-> m (Ref m (f a)) -> m (RecRef m f a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> f r -> m (Ref m (f r))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef f r
x) m (Rec (RecRef m f) as -> Rec (RecRef m f) (a : as))
-> m (Rec (RecRef m f) as) -> m (Rec (RecRef m f) (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Rec f rs -> m (Ref m (Rec f rs))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef Rec f rs
xs
    unsafeFreezeRef :: Ref m (Rec f (a : as)) -> m (Rec f (a : as))
unsafeFreezeRef = \case
      RecRef v :& vs -> f a -> Rec f as -> Rec f (a : as)
forall u (a :: u -> *) (r :: u) (rs :: [u]).
a r -> Rec a rs -> Rec a (r : rs)
(:&) (f a -> Rec f as -> Rec f (a : as))
-> m (f a) -> m (Rec f as -> Rec f (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m (f a) -> m (f a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m (f a)
Ref m (f r)
v m (Rec f as -> Rec f (a : as))
-> m (Rec f as) -> m (Rec f (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (Rec f as) -> m (Rec f as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Rec (RecRef m f) rs
Ref m (Rec f as)
vs


instance (Monad m, RecApplicative as, V.NatToInt (V.RLength as), RPureConstrained (V.IndexableField as) as, Mutable m (Rec f as), Ref m (Rec f as) ~ Rec (RecRef m f) as) => Mutable m (ARec f as) where
    type Ref m (ARec f as) = ARec (RecRef m f) as

    thawRef :: ARec f as -> m (Ref m (ARec f as))
thawRef         = (Rec (RecRef m f) as -> ARec (RecRef m f) as)
-> m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rec (RecRef m f) as -> ARec (RecRef m f) as
forall k (f :: k -> *) (ts :: [k]).
NatToInt (RLength ts) =>
Rec f ts -> ARec f ts
toARec (m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as))
-> (ARec f as -> m (Rec (RecRef m f) as))
-> ARec f as
-> m (ARec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec f as -> m (Rec (RecRef m f) as)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef   (Rec f as -> m (Rec (RecRef m f) as))
-> (ARec f as -> Rec f as) -> ARec f as -> m (Rec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ARec f as -> Rec f as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec
    freezeRef :: Ref m (ARec f as) -> m (ARec f as)
freezeRef       = (Rec f as -> ARec f as) -> m (Rec f as) -> m (ARec f as)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rec f as -> ARec f as
forall k (f :: k -> *) (ts :: [k]).
NatToInt (RLength ts) =>
Rec f ts -> ARec f ts
toARec (m (Rec f as) -> m (ARec f as))
-> (ARec (RecRef m f) as -> m (Rec f as))
-> ARec (RecRef m f) as
-> m (ARec f as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec (RecRef m f) as -> m (Rec f as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef (Rec (RecRef m f) as -> m (Rec f as))
-> (ARec (RecRef m f) as -> Rec (RecRef m f) as)
-> ARec (RecRef m f) as
-> m (Rec f as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec
    copyRef :: Ref m (ARec f as) -> ARec f as -> m ()
copyRef r :: Ref m (ARec f as)
r x :: ARec f as
x     = Ref m (Rec f as) -> Rec f as -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef (ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec ARec (RecRef m f) as
Ref m (ARec f as)
r) (ARec f as -> Rec f as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec ARec f as
x)
    moveRef :: Ref m (ARec f as) -> Ref m (ARec f as) -> m ()
moveRef r :: Ref m (ARec f as)
r v :: Ref m (ARec f as)
v     = Ref m (Rec f as) -> Ref m (Rec f as) -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef (ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec ARec (RecRef m f) as
Ref m (ARec f as)
r) (ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec ARec (RecRef m f) as
Ref m (ARec f as)
v)
    cloneRef :: Ref m (ARec f as) -> m (Ref m (ARec f as))
cloneRef        = (Rec (RecRef m f) as -> ARec (RecRef m f) as)
-> m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rec (RecRef m f) as -> ARec (RecRef m f) as
forall k (f :: k -> *) (ts :: [k]).
NatToInt (RLength ts) =>
Rec f ts -> ARec f ts
toARec (m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as))
-> (ARec (RecRef m f) as -> m (Rec (RecRef m f) as))
-> ARec (RecRef m f) as
-> m (ARec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec (RecRef m f) as -> m (Rec (RecRef m f) as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef (Rec (RecRef m f) as -> m (Rec (RecRef m f) as))
-> (ARec (RecRef m f) as -> Rec (RecRef m f) as)
-> ARec (RecRef m f) as
-> m (Rec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec
    unsafeThawRef :: ARec f as -> m (Ref m (ARec f as))
unsafeThawRef   = (Rec (RecRef m f) as -> ARec (RecRef m f) as)
-> m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rec (RecRef m f) as -> ARec (RecRef m f) as
forall k (f :: k -> *) (ts :: [k]).
NatToInt (RLength ts) =>
Rec f ts -> ARec f ts
toARec (m (Rec (RecRef m f) as) -> m (ARec (RecRef m f) as))
-> (ARec f as -> m (Rec (RecRef m f) as))
-> ARec f as
-> m (ARec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec f as -> m (Rec (RecRef m f) as)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef   (Rec f as -> m (Rec (RecRef m f) as))
-> (ARec f as -> Rec f as) -> ARec f as -> m (Rec (RecRef m f) as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ARec f as -> Rec f as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec
    unsafeFreezeRef :: Ref m (ARec f as) -> m (ARec f as)
unsafeFreezeRef = (Rec f as -> ARec f as) -> m (Rec f as) -> m (ARec f as)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Rec f as -> ARec f as
forall k (f :: k -> *) (ts :: [k]).
NatToInt (RLength ts) =>
Rec f ts -> ARec f ts
toARec (m (Rec f as) -> m (ARec f as))
-> (ARec (RecRef m f) as -> m (Rec f as))
-> ARec (RecRef m f) as
-> m (ARec f as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rec (RecRef m f) as -> m (Rec f as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef (Rec (RecRef m f) as -> m (Rec f as))
-> (ARec (RecRef m f) as -> Rec (RecRef m f) as)
-> ARec (RecRef m f) as
-> m (Rec f as)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ARec (RecRef m f) as -> Rec (RecRef m f) as
forall u (f :: u -> *) (ts :: [u]).
(RecApplicative ts, RPureConstrained (IndexableField ts) ts) =>
ARec f ts -> Rec f ts
fromARec

-- | Useful type family to @'Ref' m@ over every item in a type-level list
--
-- @
-- ghci> :kind! MapRef IO '[Int, V.Vector Double]
-- '[ MutVar RealWorld Int, MVector RealWorld Double ]
-- @
type family MapRef m as where
    MapRef m '[] = '[]
    MapRef m (a ': as) = Ref m a ': MapRef m as

-- | The mutable reference of the 'HList' type from generic-lens.
data HListRef :: (Type -> Type) -> [Type] -> Type where
    NilRef :: HListRef m '[]
    (:!>)  :: Ref m a -> HListRef m as -> HListRef m (a ': as)
infixr 5 :!>

instance Monad m => Mutable m (HList '[]) where
    type Ref m (HList '[]) = HListRef m '[]
    thawRef :: HList '[] -> m (Ref m (HList '[]))
thawRef   _       = HListRef m '[] -> m (HListRef m '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure HListRef m '[]
forall (m :: * -> *). HListRef m '[]
NilRef
    freezeRef :: Ref m (HList '[]) -> m (HList '[])
freezeRef _       = HList '[] -> m (HList '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure HList '[]
Nil
    copyRef :: Ref m (HList '[]) -> HList '[] -> m ()
copyRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    moveRef :: Ref m (HList '[]) -> Ref m (HList '[]) -> m ()
moveRef _ _       = () -> m ()
forall (f :: * -> *) a. Applicative f => a -> f a
pure ()
    cloneRef :: Ref m (HList '[]) -> m (Ref m (HList '[]))
cloneRef _        = HListRef m '[] -> m (HListRef m '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure HListRef m '[]
forall (m :: * -> *). HListRef m '[]
NilRef
    unsafeThawRef :: HList '[] -> m (Ref m (HList '[]))
unsafeThawRef _   = HListRef m '[] -> m (HListRef m '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure HListRef m '[]
forall (m :: * -> *). HListRef m '[]
NilRef
    unsafeFreezeRef :: Ref m (HList '[]) -> m (HList '[])
unsafeFreezeRef _ = HList '[] -> m (HList '[])
forall (f :: * -> *) a. Applicative f => a -> f a
pure HList '[]
Nil

instance (Monad m, Mutable m a, Mutable m (HList as), Ref m (HList as) ~ HListRef m as) => Mutable m (HList (a ': as)) where
    type Ref m (HList (a ': as)) = HListRef m (a ': as)
    thawRef :: HList (a : as) -> m (Ref m (HList (a : as)))
thawRef   = \case
      x :: a
x :> xs :: HList as1
xs -> Ref m a -> HListRef m as -> HListRef m (a : as)
forall (m :: * -> *) a (as :: [*]).
Ref m a -> HListRef m as -> HListRef m (a : as)
(:!>) (Ref m a -> HListRef m as -> HListRef m (a : as))
-> m (Ref m a) -> m (HListRef m as -> HListRef m (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef a
x m (HListRef m as -> HListRef m (a : as))
-> m (HListRef m as) -> m (HListRef m (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HList as1 -> m (Ref m (HList as1))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
thawRef HList as1
xs
    freezeRef :: Ref m (HList (a : as)) -> m (HList (a : as))
freezeRef = \case
      v :!> vs -> a -> HList as -> HList (a : as)
forall a (as1 :: [*]). a -> HList as1 -> HList (a : as1)
(:>) (a -> HList as -> HList (a : as))
-> m a -> m (HList as -> HList (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m a
Ref m a
v m (HList as -> HList (a : as))
-> m (HList as) -> m (HList (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (HList as) -> m (HList as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
freezeRef Ref m (HList as)
HListRef m as
vs
    copyRef :: Ref m (HList (a : as)) -> HList (a : as) -> m ()
copyRef = \case
      v :!> vs -> \case
        x :: a
x :> xs :: HList as1
xs -> Ref m a -> a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m a
Ref m a
v a
x m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ref m (HList as1) -> HList as1 -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> a -> m ()
copyRef Ref m (HList as1)
HListRef m as
vs HList as1
xs
    moveRef :: Ref m (HList (a : as)) -> Ref m (HList (a : as)) -> m ()
moveRef = \case
      v :!> vs -> \case
        r :!> rs ->
          Ref m a -> Ref m a -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m a
Ref m a
v Ref m a
Ref m a
r m () -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Ref m (HList as) -> Ref m (HList as) -> m ()
forall (m :: * -> *) a. Mutable m a => Ref m a -> Ref m a -> m ()
moveRef Ref m (HList as)
HListRef m as
vs Ref m (HList as)
HListRef m as
rs
    cloneRef :: Ref m (HList (a : as)) -> m (Ref m (HList (a : as)))
cloneRef = \case
      v :!> rs -> Ref m a -> HListRef m as -> HListRef m (a : as)
forall (m :: * -> *) a (as :: [*]).
Ref m a -> HListRef m as -> HListRef m (a : as)
(:!>) (Ref m a -> HListRef m as -> HListRef m (a : as))
-> m (Ref m a) -> m (HListRef m as -> HListRef m (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m a
Ref m a
v m (HListRef m as -> HListRef m (a : as))
-> m (HListRef m as) -> m (HListRef m (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (HList as) -> m (Ref m (HList as))
forall (m :: * -> *) a. Mutable m a => Ref m a -> m (Ref m a)
cloneRef Ref m (HList as)
HListRef m as
rs
    unsafeThawRef :: HList (a : as) -> m (Ref m (HList (a : as)))
unsafeThawRef   = \case
      x :: a
x :> xs :: HList as1
xs -> Ref m a -> HListRef m as -> HListRef m (a : as)
forall (m :: * -> *) a (as :: [*]).
Ref m a -> HListRef m as -> HListRef m (a : as)
(:!>) (Ref m a -> HListRef m as -> HListRef m (a : as))
-> m (Ref m a) -> m (HListRef m as -> HListRef m (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> m (Ref m a)
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef a
x m (HListRef m as -> HListRef m (a : as))
-> m (HListRef m as) -> m (HListRef m (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> HList as1 -> m (Ref m (HList as1))
forall (m :: * -> *) a. Mutable m a => a -> m (Ref m a)
unsafeThawRef HList as1
xs
    unsafeFreezeRef :: Ref m (HList (a : as)) -> m (HList (a : as))
unsafeFreezeRef = \case
      v :!> vs -> a -> HList as -> HList (a : as)
forall a (as1 :: [*]). a -> HList as1 -> HList (a : as1)
(:>) (a -> HList as -> HList (a : as))
-> m a -> m (HList as -> HList (a : as))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Ref m a -> m a
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m a
Ref m a
v m (HList as -> HList (a : as))
-> m (HList as) -> m (HList (a : as))
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Ref m (HList as) -> m (HList as)
forall (m :: * -> *) a. Mutable m a => Ref m a -> m a
unsafeFreezeRef Ref m (HList as)
HListRef m as
vs