Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit f5483d3

Browse files
committedJan 13, 2019
Give MutableBuffer and it's instances a module of their own each.
1 parent 18cc642 commit f5483d3

File tree

9 files changed

+536
-461
lines changed

9 files changed

+536
-461
lines changed
 

‎src/Node/Buffer.purs

Lines changed: 28 additions & 250 deletions
Original file line numberDiff line numberDiff line change
@@ -1,262 +1,40 @@
11
-- | Mutable buffers and associated operations.
22
module Node.Buffer
3-
( class MutableBuffer
4-
, create
5-
, freeze
6-
, unsafeFreeze
7-
, thaw
8-
, unsafeThaw
9-
, fromArray
10-
, fromString
11-
, fromArrayBuffer
12-
, toArrayBuffer
13-
, read
14-
, readString
15-
, toString
16-
, write
17-
, writeString
18-
, toArray
19-
, getAtOffset
20-
, setAtOffset
21-
, slice
22-
, size
23-
, concat
24-
, concat'
25-
, copy
26-
, fill
27-
, Buffer
28-
, STBuffer
29-
, runST
3+
( Buffer
304
, module TypesExports
5+
, module Class
316
) where
327

33-
import Prelude
34-
35-
import Control.Monad.ST (ST, kind Region)
36-
import Control.Monad.ST as ST
37-
import Data.ArrayBuffer.Types (ArrayBuffer)
38-
import Data.Maybe (Maybe)
398
import Effect (Effect)
40-
import Node.Buffer.Immutable (ImmutableBuffer)
41-
import Node.Buffer.Immutable as Immutable
42-
import Node.Buffer.Types (BufferValueType, Octet, Offset)
9+
import Node.Buffer.Class (class MutableBuffer)
10+
import Node.Buffer.Class (class MutableBuffer, concat, concat', copy, create, fill, freeze, fromArray, fromArrayBuffer, fromString, getAtOffset, read, readString, setAtOffset, size, slice, thaw, toArray, toArrayBuffer, toString, unsafeFreeze, unsafeThaw, write, writeString) as Class
11+
import Node.Buffer.Internal as Internal
4312
import Node.Buffer.Types (BufferValueType(..), Octet, Offset) as TypesExports
44-
import Node.Encoding (Encoding, encodingToNode)
45-
import Unsafe.Coerce (unsafeCoerce)
46-
47-
-- | A type class for mutable buffers `buf` where operations on those buffers are
48-
-- | represented by a particular monadic effect type `m`.
49-
class Monad m <= MutableBuffer buf m | m -> buf, buf -> m where
50-
51-
-- | Creates a new buffer of the specified size.
52-
create :: Int -> m buf
53-
54-
-- | Creates an immutable copy of a mutable buffer.
55-
freeze :: buf -> m ImmutableBuffer
56-
57-
-- | O(1). Convert a mutable buffer to an immutable buffer, without copying. The
58-
-- | mutable buffer must not be mutated afterwards.
59-
unsafeFreeze :: buf -> m ImmutableBuffer
60-
61-
-- | Creates a mutable copy of an immutable buffer.
62-
thaw :: ImmutableBuffer -> m buf
63-
64-
-- | O(1) Convert an immutable buffer to a mutable buffer, without copying. The
65-
-- | input buffer must not be used afterward.
66-
unsafeThaw :: ImmutableBuffer -> m buf
67-
68-
-- | Creates a new buffer from an array of octets, sized to match the array.
69-
fromArray :: Array Octet -> m buf
70-
71-
-- | Creates a new buffer from a string with the specified encoding, sized to
72-
-- | match the string.
73-
fromString :: String -> Encoding -> m buf
74-
75-
-- | Creates a buffer view from a JS ArrayByffer without copying data.
76-
fromArrayBuffer :: ArrayBuffer -> m buf
77-
78-
-- | Copies the data in the buffer to a new JS ArrayBuffer
79-
toArrayBuffer :: buf -> m ArrayBuffer
80-
81-
-- | Reads a numeric value from a buffer at the specified offset.
82-
read :: BufferValueType -> Offset -> buf -> m Int
83-
84-
-- | Reads a section of a buffer as a string with the specified encoding.
85-
readString :: Encoding -> Offset -> Offset -> buf -> m String
86-
87-
-- | Reads the buffer as a string with the specified encoding.
88-
toString :: Encoding -> buf -> m String
89-
90-
-- | Writes a numeric value to a buffer at the specified offset.
91-
write :: BufferValueType -> Int -> Offset -> buf -> m Unit
92-
93-
-- | Writes octets from a string to a buffer at the specified offset. Multi-byte
94-
-- | characters will not be written to the buffer if there is not enough capacity
95-
-- | to write them fully. The number of bytes written is returned.
96-
writeString :: Encoding -> Offset -> Int -> String -> buf -> m Int
97-
98-
-- | Creates an array of octets from a buffer's contents.
99-
toArray :: buf -> m (Array Octet)
100-
101-
-- | Reads an octet from a buffer at the specified offset.
102-
getAtOffset :: Offset -> buf -> m (Maybe Octet)
103-
104-
-- | Writes an octet in the buffer at the specified offset.
105-
setAtOffset :: Octet -> Offset -> buf -> m Unit
106-
107-
-- | Creates a new buffer slice that acts like a window on the original buffer.
108-
-- | Writing to the slice buffer updates the original buffer and vice-versa.
109-
slice :: Offset -> Offset -> buf -> buf
110-
111-
-- | Returns the size of a buffer.
112-
size :: buf -> m Int
113-
114-
-- | Concatenates a list of buffers.
115-
concat :: Array buf -> m buf
116-
117-
-- | Concatenates a list of buffers, combining them into a new buffer of the
118-
-- | specified length.
119-
concat' :: Array buf -> Int -> m buf
120-
121-
-- | Copies a section of a source buffer into a target buffer at the specified
122-
-- | offset, and returns the number of octets copied.
123-
copy :: Offset -> Offset -> buf -> Offset -> buf -> m Int
124-
125-
-- | Fills a range in a buffer with the specified octet.
126-
fill :: Octet -> Offset -> Offset -> buf -> m Unit
12713

12814
-- | A reference to a mutable buffer for use with `Effect`
12915
foreign import data Buffer :: Type
13016

131-
-- | A reference to a mutable buffer for use with `ST`
132-
-- |
133-
-- | The type parameter represents the memory region which the buffer belongs to.
134-
foreign import data STBuffer :: Region -> Type
135-
136-
-- | Runs an effect creating an `STBuffer` then freezes the buffer and returns
137-
-- | it, without unneccessary copying.
138-
runST :: (forall h. ST h (STBuffer h)) -> ImmutableBuffer
139-
runST st = ST.run (st >>= unsafeFreeze)
140-
14117
instance mutableBufferEffect :: MutableBuffer Buffer Effect where
142-
create = createImpl
143-
freeze = copyAllImpl
144-
unsafeFreeze = unsafeFreezeImpl
145-
thaw = copyAllImpl
146-
unsafeThaw = unsafeThawImpl
147-
fromArray = fromArrayImpl
148-
fromString = fromStringImpl
149-
fromArrayBuffer = fromArrayBufferImpl
150-
toArrayBuffer = toArrayBufferImpl
151-
read = readImpl
152-
readString = readStringImpl
153-
toString = toStringImpl
154-
write = writeImpl
155-
writeString = writeStringImpl
156-
toArray = toArrayImpl
157-
getAtOffset = getAtOffsetImpl
158-
setAtOffset = setAtOffsetImpl
159-
slice = sliceImpl
160-
size = sizeImpl
161-
concat = concatImpl
162-
concat' = concatImpl'
163-
copy = copyImpl
164-
fill = fillImpl
165-
166-
instance mutableBufferST :: MutableBuffer (STBuffer h) (ST h) where
167-
create = createImpl
168-
freeze = copyAllImpl
169-
unsafeFreeze = unsafeFreezeImpl
170-
thaw = copyAllImpl
171-
unsafeThaw = unsafeThawImpl
172-
fromArray = fromArrayImpl
173-
fromString = fromStringImpl
174-
fromArrayBuffer = fromArrayBufferImpl
175-
toArrayBuffer = toArrayBufferImpl
176-
read = readImpl
177-
readString = readStringImpl
178-
toString = toStringImpl
179-
write = writeImpl
180-
writeString = writeStringImpl
181-
toArray = toArrayImpl
182-
getAtOffset = getAtOffsetImpl
183-
setAtOffset = setAtOffsetImpl
184-
slice = sliceImpl
185-
size = sizeImpl
186-
concat = concatImpl
187-
concat' = concatImpl'
188-
copy = copyImpl
189-
fill = fillImpl
190-
191-
unsafeFreezeImpl :: forall buf m. Monad m => buf -> m ImmutableBuffer
192-
unsafeFreezeImpl = pure <<< unsafeCoerce
193-
194-
unsafeThawImpl :: forall buf m. Monad m => ImmutableBuffer -> m buf
195-
unsafeThawImpl = pure <<< unsafeCoerce
196-
197-
usingFromImmutable :: forall buf m a. Monad m => (ImmutableBuffer -> a) -> buf -> m a
198-
usingFromImmutable f buf = f <$> unsafeFreezeImpl buf
199-
200-
usingToImmutable :: forall buf m a. Monad m => (a -> ImmutableBuffer) -> a -> m buf
201-
usingToImmutable f x = unsafeThawImpl $ f x
202-
203-
createImpl :: forall buf m. Monad m => Int -> m buf
204-
createImpl = usingToImmutable Immutable.create
205-
206-
foreign import copyAllImpl :: forall a buf m. a -> m buf
207-
208-
fromArrayImpl :: forall buf m. Monad m => Array Octet -> m buf
209-
fromArrayImpl = usingToImmutable Immutable.fromArray
210-
211-
fromStringImpl :: forall buf m. Monad m => String -> Encoding -> m buf
212-
fromStringImpl s = usingToImmutable $ Immutable.fromString s
213-
214-
fromArrayBufferImpl :: forall buf m. Monad m => ArrayBuffer -> m buf
215-
fromArrayBufferImpl = usingToImmutable Immutable.fromArrayBuffer
216-
217-
toArrayBufferImpl :: forall buf m. Monad m => buf -> m ArrayBuffer
218-
toArrayBufferImpl = usingFromImmutable Immutable.toArrayBuffer
219-
220-
readImpl :: forall buf m. Monad m => BufferValueType -> Offset -> buf -> m Int
221-
readImpl t o = usingFromImmutable $ Immutable.read t o
222-
223-
readStringImpl :: forall buf m. Monad m => Encoding -> Offset -> Offset -> buf -> m String
224-
readStringImpl m o o' = usingFromImmutable $ Immutable.readString m o o'
225-
226-
toStringImpl :: forall buf m. Monad m => Encoding -> buf -> m String
227-
toStringImpl m = usingFromImmutable $ Immutable.toString m
228-
229-
writeImpl :: forall buf m. Monad m => BufferValueType -> Int -> Offset -> buf -> m Unit
230-
writeImpl = writeInternal <<< show
231-
232-
foreign import writeInternal :: forall buf m. String -> Int -> Offset -> buf -> m Unit
233-
234-
writeStringImpl :: forall buf m. Monad m => Encoding -> Offset -> Int -> String -> buf -> m Int
235-
writeStringImpl = writeStringInternal <<< encodingToNode
236-
237-
foreign import writeStringInternal ::
238-
forall buf m. String -> Offset -> Int -> String -> buf -> m Int
239-
240-
toArrayImpl :: forall buf m. Monad m => buf -> m (Array Octet)
241-
toArrayImpl = usingFromImmutable Immutable.toArray
242-
243-
getAtOffsetImpl :: forall buf m. Monad m => Offset -> buf -> m (Maybe Octet)
244-
getAtOffsetImpl o = usingFromImmutable $ Immutable.getAtOffset o
245-
246-
foreign import setAtOffsetImpl :: forall buf m. Octet -> Offset -> buf -> m Unit
247-
248-
sliceImpl :: forall buf. Offset -> Offset -> buf -> buf
249-
sliceImpl = unsafeCoerce Immutable.slice
250-
251-
sizeImpl :: forall buf m. Monad m => buf -> m Int
252-
sizeImpl = usingFromImmutable Immutable.size
253-
254-
concatImpl :: forall buf m. Array buf -> m buf
255-
concatImpl arrs = unsafeCoerce \_ -> Immutable.concat (unsafeCoerce arrs)
256-
257-
concatImpl' :: forall buf m. Monad m => Array buf -> Int -> m buf
258-
concatImpl' arrs n = unsafeCoerce \_ -> Immutable.concat' (unsafeCoerce arrs) n
259-
260-
foreign import copyImpl :: forall buf m. Offset -> Offset -> buf -> Offset -> buf -> m Int
261-
262-
foreign import fillImpl :: forall buf m. Octet -> Offset -> Offset -> buf -> m Unit
18+
create = Internal.create
19+
freeze = Internal.copyAll
20+
unsafeFreeze = Internal.unsafeFreeze
21+
thaw = Internal.copyAll
22+
unsafeThaw = Internal.unsafeThaw
23+
fromArray = Internal.fromArray
24+
fromString = Internal.fromString
25+
fromArrayBuffer = Internal.fromArrayBuffer
26+
toArrayBuffer = Internal.toArrayBuffer
27+
read = Internal.read
28+
readString = Internal.readString
29+
toString = Internal.toString
30+
write = Internal.write
31+
writeString = Internal.writeString
32+
toArray = Internal.toArray
33+
getAtOffset = Internal.getAtOffset
34+
setAtOffset = Internal.setAtOffset
35+
slice = Internal.slice
36+
size = Internal.size
37+
concat = Internal.concat
38+
concat' = Internal.concat'
39+
copy = Internal.copy
40+
fill = Internal.fill

0 commit comments

Comments
 (0)
Please sign in to comment.