@@ -2,7 +2,9 @@ module Node.Buffer.Mutable
22 ( class MutableBuffer
33 , create
44 , freeze
5+ , unsafeFreeze
56 , thaw
7+ , unsafeThaw
68 , fromArray
79 , fromString
810 , fromArrayBuffer
@@ -48,9 +50,17 @@ class Monad m <= MutableBuffer buf m | m -> buf, buf -> m where
4850 -- | Creates an immutable copy of a mutable buffer.
4951 freeze :: buf -> m Buffer
5052
53+ -- | O(1). Convert a mutable buffer to an immutable buffer, without copying. The
54+ -- | mutable buffer must not be mutated afterwards.
55+ unsafeFreeze :: buf -> m Buffer
56+
5157 -- | Creates a mutable copy of an immutable buffer.
5258 thaw :: Buffer -> m buf
5359
60+ -- | O(1) Convert an immutable buffer to a mutable buffer, without copying. The
61+ -- | input buffer must not be used afterward.
62+ unsafeThaw :: Buffer -> m buf
63+
5464 -- | Creates a new buffer from an array of octets, sized to match the array.
5565 fromArray :: Array Octet -> m buf
5666
@@ -121,13 +131,15 @@ foreign import data STBuffer :: Region -> Type
121131
122132-- | Runs an effect creating an `STBuffer` then freezes the buffer and returns
123133-- | it, without unneccessary copying.
124- runST :: forall h . ST h (STBuffer h ) -> Buffer
125- runST st = ST .run (unsafeCoerce st )
134+ runST :: ( forall h . ST h (STBuffer h ) ) -> Buffer
135+ runST st = ST .run (st >>= unsafeFreeze )
126136
127137instance mutableBufferEffect :: MutableBuffer EffectBuffer Effect where
128138 create = createImpl
129139 freeze = copyAllImpl
140+ unsafeFreeze = unsafeFreezeImpl
130141 thaw = copyAllImpl
142+ unsafeThaw = unsafeThawImpl
131143 fromArray = fromArrayImpl
132144 fromString = fromStringImpl
133145 fromArrayBuffer = fromArrayBufferImpl
@@ -150,7 +162,9 @@ instance mutableBufferEffect :: MutableBuffer EffectBuffer Effect where
150162instance mutableBufferST :: MutableBuffer (STBuffer h ) (ST h ) where
151163 create = createImpl
152164 freeze = copyAllImpl
165+ unsafeFreeze = unsafeFreezeImpl
153166 thaw = copyAllImpl
167+ unsafeThaw = unsafeThawImpl
154168 fromArray = fromArrayImpl
155169 fromString = fromStringImpl
156170 fromArrayBuffer = fromArrayBufferImpl
@@ -170,67 +184,73 @@ instance mutableBufferST :: MutableBuffer (STBuffer h) (ST h) where
170184 copy = copyImpl
171185 fill = fillImpl
172186
173- usingFromFrozen :: forall buf m a . (Buffer -> a ) -> buf -> m a
174- usingFromFrozen f buf = unsafeCoerce \_ -> f $ unsafeCoerce buf
187+ unsafeFreezeImpl :: forall buf m . Monad m => buf -> m Buffer
188+ unsafeFreezeImpl = pure <<< unsafeCoerce
189+
190+ unsafeThawImpl :: forall buf m . Monad m => Buffer -> m buf
191+ unsafeThawImpl = pure <<< unsafeCoerce
192+
193+ usingFromFrozen :: forall buf m a . Monad m => (Buffer -> a ) -> buf -> m a
194+ usingFromFrozen f buf = f <$> unsafeFreezeImpl buf
175195
176- usingToFrozen :: forall buf m a . (a -> Buffer ) -> a -> m buf
177- usingToFrozen f x = unsafeCoerce \_ -> unsafeCoerce $ f x
196+ usingToFrozen :: forall buf m a . Monad m => (a -> Buffer ) -> a -> m buf
197+ usingToFrozen f x = unsafeThawImpl $ f x
178198
179- createImpl :: forall buf m . Int -> m buf
199+ createImpl :: forall buf m . Monad m => Int -> m buf
180200createImpl = usingToFrozen Buffer .create
181201
182202foreign import copyAllImpl :: forall a buf m . a -> m buf
183203
184- fromArrayImpl :: forall buf m . Array Octet -> m buf
204+ fromArrayImpl :: forall buf m . Monad m => Array Octet -> m buf
185205fromArrayImpl = usingToFrozen Buffer .fromArray
186206
187- fromStringImpl :: forall buf m . String -> Encoding -> m buf
207+ fromStringImpl :: forall buf m . Monad m => String -> Encoding -> m buf
188208fromStringImpl s = usingToFrozen $ Buffer .fromString s
189209
190- fromArrayBufferImpl :: forall buf m . ArrayBuffer -> m buf
210+ fromArrayBufferImpl :: forall buf m . Monad m => ArrayBuffer -> m buf
191211fromArrayBufferImpl = usingToFrozen Buffer .fromArrayBuffer
192212
193- toArrayBufferImpl :: forall buf m . buf -> m ArrayBuffer
213+ toArrayBufferImpl :: forall buf m . Monad m => buf -> m ArrayBuffer
194214toArrayBufferImpl = usingFromFrozen Buffer .toArrayBuffer
195215
196- readImpl :: forall buf m . BufferValueType -> Offset -> buf -> m Int
216+ readImpl :: forall buf m . Monad m => BufferValueType -> Offset -> buf -> m Int
197217readImpl t o = usingFromFrozen $ Buffer .read t o
198218
199- readStringImpl :: forall buf m . Encoding -> Offset -> Offset -> buf -> m String
219+ readStringImpl :: forall buf m . Monad m => Encoding -> Offset -> Offset -> buf -> m String
200220readStringImpl m o o' = usingFromFrozen $ Buffer .readString m o o'
201221
202- toStringImpl :: forall buf m . Encoding -> buf -> m String
222+ toStringImpl :: forall buf m . Monad m => Encoding -> buf -> m String
203223toStringImpl m = usingFromFrozen $ Buffer .toString m
204224
205- writeImpl :: forall buf m . BufferValueType -> Int -> Offset -> buf -> m Unit
225+ writeImpl :: forall buf m . Monad m => BufferValueType -> Int -> Offset -> buf -> m Unit
206226writeImpl = writeInternal <<< show
207227
208228foreign import writeInternal :: forall buf m . String -> Int -> Offset -> buf -> m Unit
209229
210- writeStringImpl :: forall buf m . Encoding -> Offset -> Int -> String -> buf -> m Int
230+ writeStringImpl :: forall buf m . Monad m => Encoding -> Offset -> Int -> String -> buf -> m Int
211231writeStringImpl = writeStringInternal <<< encodingToNode
212232
213233foreign import writeStringInternal ::
214234 forall buf m . String -> Offset -> Int -> String -> buf -> m Int
215235
216- toArrayImpl :: forall buf m . buf -> m (Array Octet )
236+ toArrayImpl :: forall buf m . Monad m => buf -> m (Array Octet )
217237toArrayImpl = usingFromFrozen Buffer .toArray
218238
219- getAtOffsetImpl :: forall buf m . Offset -> buf -> m (Maybe Octet )
239+ getAtOffsetImpl :: forall buf m . Monad m => Offset -> buf -> m (Maybe Octet )
220240getAtOffsetImpl o = usingFromFrozen $ Buffer .getAtOffset o
221241
222242foreign import setAtOffsetImpl :: forall buf m . Octet -> Offset -> buf -> m Unit
223243
224244sliceImpl :: forall buf . Offset -> Offset -> buf -> buf
225245sliceImpl = unsafeCoerce Buffer .slice
226246
227- sizeImpl :: forall buf m . buf -> m Int
247+ sizeImpl :: forall buf m . Monad m => buf -> m Int
228248sizeImpl = usingFromFrozen Buffer .size
229249
230250concatImpl :: forall buf m . Array buf -> m buf
231251concatImpl arrs = unsafeCoerce \_ -> Buffer .concat (unsafeCoerce arrs)
232252
233- concatImpl' :: forall buf m . Array buf -> Int -> m buf
253+ concatImpl' :: forall buf m . Monad m => Array buf -> Int -> m buf
234254concatImpl' arrs n = unsafeCoerce \_ -> Buffer .concat' (unsafeCoerce arrs) n
235255
236256foreign import copyImpl :: forall buf m . Offset -> Offset -> buf -> Offset -> buf -> m Int
0 commit comments