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