{-# 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 (
RecRef(..)
, HListRef(..)
, GRef(..)
, gThawRef, gFreezeRef
, gCopyRef, gMoveRef, gCloneRef
, gUnsafeThawRef, gUnsafeFreezeRef
, GMutable (GRef_)
, thawHKD, freezeHKD
, copyHKD, moveHKD, cloneHKD
, unsafeThawHKD, unsafeFreezeHKD
, CoerceRef(..)
, thawCoerce, freezeCoerce
, copyCoerce, moveCoerce, cloneCoerce
, unsafeThawCoerce, unsafeFreezeCoerce
, TraverseRef(..)
, thawTraverse, freezeTraverse
, copyTraverse, moveTraverse, cloneTraverse
, unsafeThawTraverse, unsafeFreezeTraverse
, ImmutableRef(..), thawImmutable, freezeImmutable, copyImmutable
, GMutableRef(..)
, MutSumF(..)
, 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))
instance (PrimMonad m, Mutable m a) => Mutable m [a] where
type Ref m [a] = GRef m [a]
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
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
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
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
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 ()
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
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
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
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
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
type family MapRef m as where
MapRef m '[] = '[]
MapRef m (a ': as) = Ref m a ': MapRef m as
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