1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
-- |
-- Module : Foundation.Array.Mutable
-- License : BSD-style
-- Maintainer : Vincent Hanquez <vincent@snarc.org>
-- Stability : experimental
-- Portability : portable
--
module Foundation.Collection.Mutable
( MutableCollection(..)
) where
import Basement.Monad
import Basement.Types.OffsetSize
import qualified Basement.Block as BLK
import qualified Basement.Block.Mutable as BLK
import qualified Basement.UArray.Mutable as MUV
import qualified Basement.UArray as UV
import qualified Basement.BoxedArray as BA
-- | Collection of things that can be made mutable, modified and then freezed into an MutableFreezed collection
class MutableCollection c where
-- unfortunately: cannot set mutUnsafeWrite to default to mutWrite .. same for read..
{-# MINIMAL thaw, freeze, mutNew, mutWrite, mutRead, mutUnsafeWrite, mutUnsafeRead #-}
type MutableFreezed c
type MutableKey c
type MutableValue c
unsafeThaw :: PrimMonad prim => MutableFreezed c -> prim (c (PrimState prim))
unsafeThaw = thaw
unsafeFreeze :: PrimMonad prim => c (PrimState prim) -> prim (MutableFreezed c)
unsafeFreeze = freeze
thaw :: PrimMonad prim => MutableFreezed c -> prim (c (PrimState prim))
freeze :: PrimMonad prim => c (PrimState prim) -> prim (MutableFreezed c)
mutNew :: PrimMonad prim => CountOf (MutableValue c) -> prim (c (PrimState prim))
mutUnsafeWrite :: PrimMonad prim => c (PrimState prim) -> MutableKey c -> MutableValue c -> prim ()
mutWrite :: PrimMonad prim => c (PrimState prim) -> MutableKey c -> MutableValue c -> prim ()
mutUnsafeRead :: PrimMonad prim => c (PrimState prim) -> MutableKey c -> prim (MutableValue c)
mutRead :: PrimMonad prim => c (PrimState prim) -> MutableKey c -> prim (MutableValue c)
instance UV.PrimType ty => MutableCollection (MUV.MUArray ty) where
type MutableFreezed (MUV.MUArray ty) = UV.UArray ty
type MutableKey (MUV.MUArray ty) = Offset ty
type MutableValue (MUV.MUArray ty) = ty
thaw = UV.thaw
freeze = UV.freeze
unsafeThaw = UV.unsafeThaw
unsafeFreeze = UV.unsafeFreeze
mutNew = MUV.new
mutUnsafeWrite = MUV.unsafeWrite
mutUnsafeRead = MUV.unsafeRead
mutWrite = MUV.write
mutRead = MUV.read
instance UV.PrimType ty => MutableCollection (BLK.MutableBlock ty) where
type MutableFreezed (BLK.MutableBlock ty) = BLK.Block ty
type MutableKey (BLK.MutableBlock ty) = Offset ty
type MutableValue (BLK.MutableBlock ty) = ty
thaw = BLK.thaw
freeze = BLK.freeze
unsafeThaw = BLK.unsafeThaw
unsafeFreeze = BLK.unsafeFreeze
mutNew = BLK.new
mutUnsafeWrite = BLK.unsafeWrite
mutUnsafeRead = BLK.unsafeRead
mutWrite = BLK.write
mutRead = BLK.read
instance MutableCollection (BA.MArray ty) where
type MutableFreezed (BA.MArray ty) = BA.Array ty
type MutableKey (BA.MArray ty) = Offset ty
type MutableValue (BA.MArray ty) = ty
thaw = BA.thaw
freeze = BA.freeze
unsafeThaw = BA.unsafeThaw
unsafeFreeze = BA.unsafeFreeze
mutNew = BA.new
mutUnsafeWrite = BA.unsafeWrite
mutUnsafeRead = BA.unsafeRead
mutWrite = BA.write
mutRead = BA.read
|