@@ -2,7 +2,9 @@ module Node.Buffer.Mutable
2
2
( class MutableBuffer
3
3
, create
4
4
, freeze
5
+ , unsafeFreeze
5
6
, thaw
7
+ , unsafeThaw
6
8
, fromArray
7
9
, fromString
8
10
, fromArrayBuffer
@@ -48,9 +50,17 @@ class Monad m <= MutableBuffer buf m | m -> buf, buf -> m where
48
50
-- | Creates an immutable copy of a mutable buffer.
49
51
freeze :: buf -> m Buffer
50
52
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
+
51
57
-- | Creates a mutable copy of an immutable buffer.
52
58
thaw :: Buffer -> m buf
53
59
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
+
54
64
-- | Creates a new buffer from an array of octets, sized to match the array.
55
65
fromArray :: Array Octet -> m buf
56
66
@@ -121,13 +131,15 @@ foreign import data STBuffer :: Region -> Type
121
131
122
132
-- | Runs an effect creating an `STBuffer` then freezes the buffer and returns
123
133
-- | 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 )
126
136
127
137
instance mutableBufferEffect :: MutableBuffer EffectBuffer Effect where
128
138
create = createImpl
129
139
freeze = copyAllImpl
140
+ unsafeFreeze = unsafeFreezeImpl
130
141
thaw = copyAllImpl
142
+ unsafeThaw = unsafeThawImpl
131
143
fromArray = fromArrayImpl
132
144
fromString = fromStringImpl
133
145
fromArrayBuffer = fromArrayBufferImpl
@@ -150,7 +162,9 @@ instance mutableBufferEffect :: MutableBuffer EffectBuffer Effect where
150
162
instance mutableBufferST :: MutableBuffer (STBuffer h ) (ST h ) where
151
163
create = createImpl
152
164
freeze = copyAllImpl
165
+ unsafeFreeze = unsafeFreezeImpl
153
166
thaw = copyAllImpl
167
+ unsafeThaw = unsafeThawImpl
154
168
fromArray = fromArrayImpl
155
169
fromString = fromStringImpl
156
170
fromArrayBuffer = fromArrayBufferImpl
@@ -170,67 +184,73 @@ instance mutableBufferST :: MutableBuffer (STBuffer h) (ST h) where
170
184
copy = copyImpl
171
185
fill = fillImpl
172
186
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
175
195
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
178
198
179
- createImpl :: forall buf m . Int -> m buf
199
+ createImpl :: forall buf m . Monad m => Int -> m buf
180
200
createImpl = usingToFrozen Buffer .create
181
201
182
202
foreign import copyAllImpl :: forall a buf m . a -> m buf
183
203
184
- fromArrayImpl :: forall buf m . Array Octet -> m buf
204
+ fromArrayImpl :: forall buf m . Monad m => Array Octet -> m buf
185
205
fromArrayImpl = usingToFrozen Buffer .fromArray
186
206
187
- fromStringImpl :: forall buf m . String -> Encoding -> m buf
207
+ fromStringImpl :: forall buf m . Monad m => String -> Encoding -> m buf
188
208
fromStringImpl s = usingToFrozen $ Buffer .fromString s
189
209
190
- fromArrayBufferImpl :: forall buf m . ArrayBuffer -> m buf
210
+ fromArrayBufferImpl :: forall buf m . Monad m => ArrayBuffer -> m buf
191
211
fromArrayBufferImpl = usingToFrozen Buffer .fromArrayBuffer
192
212
193
- toArrayBufferImpl :: forall buf m . buf -> m ArrayBuffer
213
+ toArrayBufferImpl :: forall buf m . Monad m => buf -> m ArrayBuffer
194
214
toArrayBufferImpl = usingFromFrozen Buffer .toArrayBuffer
195
215
196
- readImpl :: forall buf m . BufferValueType -> Offset -> buf -> m Int
216
+ readImpl :: forall buf m . Monad m => BufferValueType -> Offset -> buf -> m Int
197
217
readImpl t o = usingFromFrozen $ Buffer .read t o
198
218
199
- readStringImpl :: forall buf m . Encoding -> Offset -> Offset -> buf -> m String
219
+ readStringImpl :: forall buf m . Monad m => Encoding -> Offset -> Offset -> buf -> m String
200
220
readStringImpl m o o' = usingFromFrozen $ Buffer .readString m o o'
201
221
202
- toStringImpl :: forall buf m . Encoding -> buf -> m String
222
+ toStringImpl :: forall buf m . Monad m => Encoding -> buf -> m String
203
223
toStringImpl m = usingFromFrozen $ Buffer .toString m
204
224
205
- writeImpl :: forall buf m . BufferValueType -> Int -> Offset -> buf -> m Unit
225
+ writeImpl :: forall buf m . Monad m => BufferValueType -> Int -> Offset -> buf -> m Unit
206
226
writeImpl = writeInternal <<< show
207
227
208
228
foreign import writeInternal :: forall buf m . String -> Int -> Offset -> buf -> m Unit
209
229
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
211
231
writeStringImpl = writeStringInternal <<< encodingToNode
212
232
213
233
foreign import writeStringInternal ::
214
234
forall buf m . String -> Offset -> Int -> String -> buf -> m Int
215
235
216
- toArrayImpl :: forall buf m . buf -> m (Array Octet )
236
+ toArrayImpl :: forall buf m . Monad m => buf -> m (Array Octet )
217
237
toArrayImpl = usingFromFrozen Buffer .toArray
218
238
219
- getAtOffsetImpl :: forall buf m . Offset -> buf -> m (Maybe Octet )
239
+ getAtOffsetImpl :: forall buf m . Monad m => Offset -> buf -> m (Maybe Octet )
220
240
getAtOffsetImpl o = usingFromFrozen $ Buffer .getAtOffset o
221
241
222
242
foreign import setAtOffsetImpl :: forall buf m . Octet -> Offset -> buf -> m Unit
223
243
224
244
sliceImpl :: forall buf . Offset -> Offset -> buf -> buf
225
245
sliceImpl = unsafeCoerce Buffer .slice
226
246
227
- sizeImpl :: forall buf m . buf -> m Int
247
+ sizeImpl :: forall buf m . Monad m => buf -> m Int
228
248
sizeImpl = usingFromFrozen Buffer .size
229
249
230
250
concatImpl :: forall buf m . Array buf -> m buf
231
251
concatImpl arrs = unsafeCoerce \_ -> Buffer .concat (unsafeCoerce arrs)
232
252
233
- concatImpl' :: forall buf m . Array buf -> Int -> m buf
253
+ concatImpl' :: forall buf m . Monad m => Array buf -> Int -> m buf
234
254
concatImpl' arrs n = unsafeCoerce \_ -> Buffer .concat' (unsafeCoerce arrs) n
235
255
236
256
foreign import copyImpl :: forall buf m . Offset -> Offset -> buf -> Offset -> buf -> m Int
0 commit comments