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