Skip to content

Commit fec1805

Browse files
committed
Add unsafeFreeze and unsafeThaw methods to MutableBuffer.
As requested in #discussion_r244536918
1 parent 398aad5 commit fec1805

File tree

1 file changed

+40
-20
lines changed

1 file changed

+40
-20
lines changed

src/Node/Buffer/Mutable.purs

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

127137
instance 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
150162
instance 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
180200
createImpl = usingToFrozen Buffer.create
181201

182202
foreign 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
185205
fromArrayImpl = usingToFrozen Buffer.fromArray
186206

187-
fromStringImpl :: forall buf m. String -> Encoding -> m buf
207+
fromStringImpl :: forall buf m. Monad m => String -> Encoding -> m buf
188208
fromStringImpl s = usingToFrozen $ Buffer.fromString s
189209

190-
fromArrayBufferImpl :: forall buf m. ArrayBuffer -> m buf
210+
fromArrayBufferImpl :: forall buf m. Monad m => ArrayBuffer -> m buf
191211
fromArrayBufferImpl = usingToFrozen Buffer.fromArrayBuffer
192212

193-
toArrayBufferImpl :: forall buf m. buf -> m ArrayBuffer
213+
toArrayBufferImpl :: forall buf m. Monad m => buf -> m ArrayBuffer
194214
toArrayBufferImpl = 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
197217
readImpl 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
200220
readStringImpl 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
203223
toStringImpl 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
206226
writeImpl = writeInternal <<< show
207227

208228
foreign 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
211231
writeStringImpl = writeStringInternal <<< encodingToNode
212232

213233
foreign 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)
217237
toArrayImpl = 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)
220240
getAtOffsetImpl o = usingFromFrozen $ Buffer.getAtOffset o
221241

222242
foreign import setAtOffsetImpl :: forall buf m. Octet -> Offset -> buf -> m Unit
223243

224244
sliceImpl :: forall buf. Offset -> Offset -> buf -> buf
225245
sliceImpl = unsafeCoerce Buffer.slice
226246

227-
sizeImpl :: forall buf m. buf -> m Int
247+
sizeImpl :: forall buf m. Monad m => buf -> m Int
228248
sizeImpl = usingFromFrozen Buffer.size
229249

230250
concatImpl :: forall buf m. Array buf -> m buf
231251
concatImpl 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
234254
concatImpl' arrs n = unsafeCoerce \_ -> Buffer.concat' (unsafeCoerce arrs) n
235255

236256
foreign import copyImpl :: forall buf m. Offset -> Offset -> buf -> Offset -> buf -> m Int

0 commit comments

Comments
 (0)