-
Notifications
You must be signed in to change notification settings - Fork 18
Expand file tree
/
Copy pathST.purs
More file actions
189 lines (152 loc) · 5.69 KB
/
ST.purs
File metadata and controls
189 lines (152 loc) · 5.69 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
module Node.Buffer.ST
( STBuffer
, run
, create
, alloc
, allocUnsafe
, allocUnsafeSlow
, compareParts
, freeze
, unsafeFreeze
, thaw
, unsafeThaw
, fromArray
, fromString
, fromArrayBuffer
, toArrayBuffer
, read
, readString
, toString
, toString'
, write
, writeString
, toArray
, getAtOffset
, setAtOffset
, slice
, size
, concat
, concat'
, copy
, fill
, swap16
, swap32
, swap64
, transcode
) where
import Prelude
import Control.Monad.ST (ST, Region)
import Control.Monad.ST as ST
import Data.ArrayBuffer.Types (ArrayBuffer)
import Data.Maybe (Maybe)
import Node.Buffer (BufferValueType, Octet, Offset)
import Node.Buffer as Buffer
import Node.Buffer.Class (class MutableBuffer)
import Node.Buffer.Immutable (ImmutableBuffer)
import Node.Encoding (Encoding)
import Unsafe.Coerce (unsafeCoerce)
-- | A reference to a mutable Buffer for use with `ST`
-- |
-- | The type parameter represents the memory region which the (STBuffer h) belongs to.
foreign import data STBuffer :: Region -> Type
-- | Runs an ST creating an `STBuffer` then freezes the (STBuffer h) and returns
-- | it, without unneccessary copying.
run :: (forall h. ST h (STBuffer h)) -> ImmutableBuffer
run st = ST.run (st >>= unsafeFreeze)
instance mutableBufferST :: MutableBuffer (STBuffer h) (ST h) where
create = create
freeze = freeze
unsafeFreeze = unsafeFreeze
thaw = thaw
unsafeThaw = unsafeThaw
fromArray = fromArray
fromString = fromString
fromArrayBuffer = fromArrayBuffer
toArrayBuffer = toArrayBuffer
read = read
readString = readString
toString = toString
write = write
writeString = writeString
toArray = toArray
getAtOffset = getAtOffset
setAtOffset = setAtOffset
slice = slice
size = size
concat = concat
concat' = concat'
copy = copy
fill = fill
-- | Creates a new `STBuffer`. Alias of `alloc`.
create :: forall h. Int -> ST h (STBuffer h)
create = alloc
-- | Creates a new `STBuffer`.
alloc :: forall h. Int -> ST h (STBuffer h)
alloc = unsafeCoerce Buffer.alloc
-- | Creates a new `STBuffer` of the specified size. Unsafe because it reuses memory from a pool
-- | and may contain sensitive data. See the Node docs:
-- | https://nodejs.org/docs/latest-v18.x/api/buffer.html#what-makes-bufferallocunsafe-and-bufferallocunsafeslow-unsafe
allocUnsafe :: forall h. Int -> ST h (STBuffer h)
allocUnsafe = unsafeCoerce Buffer.allocUnsafe
-- | Creates a new `STBuffer` of the specified size. Unsafe because it reuses memory from a pool
-- | and may contain sensitive data. See the Node docs:
-- | https://nodejs.org/docs/latest-v18.x/api/buffer.html#what-makes-bufferallocunsafe-and-bufferallocunsafeslow-unsafe
allocUnsafeSlow :: forall h. Int -> ST h (STBuffer h)
allocUnsafeSlow = unsafeCoerce Buffer.allocUnsafeSlow
compareParts :: forall h. STBuffer h -> STBuffer h -> Int -> Int -> Int -> Int -> ST h Ordering
compareParts = unsafeCoerce Buffer.compareParts
freeze :: forall h. (STBuffer h) -> ST h ImmutableBuffer
freeze = unsafeCoerce Buffer.freeze
unsafeFreeze :: forall h. STBuffer h -> ST h ImmutableBuffer
unsafeFreeze = unsafeCoerce Buffer.unsafeFreeze
thaw :: forall h. ImmutableBuffer -> ST h (STBuffer h)
thaw = unsafeCoerce Buffer.thaw
unsafeThaw :: forall h. ImmutableBuffer -> ST h (STBuffer h)
unsafeThaw = unsafeCoerce Buffer.unsafeThaw
fromArray :: forall h. Array Octet -> ST h (STBuffer h)
fromArray = unsafeCoerce Buffer.fromArray
fromString :: forall h. String -> Encoding -> ST h (STBuffer h)
fromString = unsafeCoerce Buffer.fromString
fromArrayBuffer :: forall h. ArrayBuffer -> ST h (STBuffer h)
fromArrayBuffer = unsafeCoerce Buffer.fromArrayBuffer
toArrayBuffer :: forall h. STBuffer h -> ST h ArrayBuffer
toArrayBuffer = unsafeCoerce Buffer.toArrayBuffer
read :: forall h. BufferValueType -> Offset -> STBuffer h -> ST h Number
read = unsafeCoerce Buffer.read
readString :: forall h. Encoding -> Offset -> Offset -> STBuffer h -> ST h String
readString = unsafeCoerce Buffer.readString
toString :: forall h. Encoding -> STBuffer h -> ST h String
toString = unsafeCoerce Buffer.toString
toString' :: forall h. Encoding -> Offset -> Offset -> STBuffer h -> ST h String
toString' = unsafeCoerce Buffer.toString'
write :: forall h. BufferValueType -> Number -> Offset -> STBuffer h -> ST h Unit
write = unsafeCoerce Buffer.write
writeString :: forall h. Encoding -> Offset -> Int -> String -> STBuffer h -> ST h Int
writeString =
unsafeCoerce Buffer.writeString
toArray :: forall h. STBuffer h -> ST h (Array Octet)
toArray = unsafeCoerce Buffer.toArray
getAtOffset :: forall h. Offset -> STBuffer h -> ST h (Maybe Octet)
getAtOffset = unsafeCoerce Buffer.getAtOffset
setAtOffset :: forall h. Octet -> Offset -> STBuffer h -> ST h Unit
setAtOffset = unsafeCoerce Buffer.setAtOffset
slice :: forall h. Offset -> Offset -> STBuffer h -> STBuffer h
slice = unsafeCoerce Buffer.slice
size :: forall h. STBuffer h -> ST h Int
size = unsafeCoerce Buffer.size
concat :: forall h. Array (STBuffer h) -> ST h (STBuffer h)
concat = unsafeCoerce Buffer.concat
concat' :: forall h. Array (STBuffer h) -> Int -> ST h (STBuffer h)
concat' = unsafeCoerce Buffer.concat'
copy :: forall h. Offset -> Offset -> STBuffer h -> Offset -> STBuffer h -> ST h Int
copy = unsafeCoerce Buffer.copy
fill :: forall h. Octet -> Offset -> Offset -> STBuffer h -> ST h Unit
fill = unsafeCoerce Buffer.fill
swap16 :: forall h. STBuffer h -> ST h (STBuffer h)
swap16 = unsafeCoerce Buffer.swap16
swap32 :: forall h. STBuffer h -> ST h (STBuffer h)
swap32 = unsafeCoerce Buffer.swap32
swap64 :: forall h. STBuffer h -> ST h (STBuffer h)
swap64 = unsafeCoerce Buffer.swap64
transcode :: forall h. STBuffer h -> Encoding -> Encoding -> ST h (STBuffer h)
transcode = unsafeCoerce Buffer.transcode