@@ -32,12 +32,14 @@ import Prelude
32
32
import Data.ArrayBuffer.Types (ArrayBuffer )
33
33
import Data.Maybe (Maybe )
34
34
import Effect (Effect )
35
+ import Effect.Uncurried (EffectFn1 , EffectFn3 , EffectFn4 , EffectFn5 , runEffectFn1 , runEffectFn3 , runEffectFn4 , runEffectFn5 )
35
36
import Node.Buffer.Class (class MutableBuffer )
36
37
import Node.Buffer.Immutable (ImmutableBuffer )
37
- import Node.Buffer.Internal as Internal
38
+ import Node.Buffer.Immutable as Immutable
38
39
import Node.Buffer.Types (BufferValueType (..), Octet , Offset ) as TypesExports
39
- import Node.Buffer.Types (BufferValueType )
40
- import Node.Encoding (Encoding )
40
+ import Node.Buffer.Types (BufferValueType , Octet , Offset )
41
+ import Node.Encoding (Encoding , encodingToNode )
42
+ import Unsafe.Coerce (unsafeCoerce )
41
43
42
44
-- | A reference to a mutable buffer for use with `Effect`
43
45
foreign import data Buffer :: Type
@@ -67,71 +69,94 @@ instance mutableBufferEffect :: MutableBuffer Buffer Effect where
67
69
copy = copy
68
70
fill = fill
69
71
72
+ unsafeFreeze :: Buffer -> Effect ImmutableBuffer
73
+ unsafeFreeze = pure <<< unsafeCoerce
74
+
75
+ unsafeThaw :: ImmutableBuffer -> Effect Buffer
76
+ unsafeThaw = pure <<< unsafeCoerce
77
+
78
+ usingFromImmutable :: forall a . (ImmutableBuffer -> a ) -> Buffer -> Effect a
79
+ usingFromImmutable f buf = f <$> unsafeFreeze buf
80
+
81
+ usingToImmutable :: forall a . (a -> ImmutableBuffer ) -> a -> Effect Buffer
82
+ usingToImmutable f x = unsafeThaw $ f x
83
+
70
84
create :: Int -> Effect Buffer
71
- create = Internal .create
85
+ create = usingToImmutable Immutable .create
72
86
73
87
freeze :: Buffer -> Effect ImmutableBuffer
74
- freeze = Internal .copyAll
88
+ freeze = runEffectFn1 freezeImpl
75
89
76
- unsafeFreeze :: Buffer -> Effect ImmutableBuffer
77
- unsafeFreeze = Internal .unsafeFreeze
90
+ foreign import freezeImpl :: EffectFn1 Buffer ImmutableBuffer
78
91
79
92
thaw :: ImmutableBuffer -> Effect Buffer
80
- thaw = Internal .copyAll
93
+ thaw = runEffectFn1 thawImpl
81
94
82
- unsafeThaw :: ImmutableBuffer -> Effect Buffer
83
- unsafeThaw = Internal .unsafeThaw
95
+ foreign import thawImpl :: EffectFn1 ImmutableBuffer Buffer
84
96
85
- fromArray :: Array Int -> Effect Buffer
86
- fromArray = Internal .fromArray
97
+ fromArray :: Array Octet -> Effect Buffer
98
+ fromArray = usingToImmutable Immutable .fromArray
87
99
88
100
fromString :: String -> Encoding -> Effect Buffer
89
- fromString = Internal .fromString
101
+ fromString s = usingToImmutable $ Immutable .fromString s
90
102
91
103
fromArrayBuffer :: ArrayBuffer -> Effect Buffer
92
- fromArrayBuffer = Internal .fromArrayBuffer
104
+ fromArrayBuffer = usingToImmutable Immutable .fromArrayBuffer
93
105
94
106
toArrayBuffer :: Buffer -> Effect ArrayBuffer
95
- toArrayBuffer = Internal .toArrayBuffer
107
+ toArrayBuffer = usingFromImmutable Immutable .toArrayBuffer
96
108
97
- read :: BufferValueType -> Int -> Buffer -> Effect Number
98
- read = Internal .read
109
+ read :: BufferValueType -> Offset -> Buffer -> Effect Number
110
+ read t o = usingFromImmutable $ Immutable .read t o
99
111
100
- readString :: Encoding -> Int -> Int -> Buffer -> Effect String
101
- readString = Internal .readString
112
+ readString :: Encoding -> Offset -> Offset -> Buffer -> Effect String
113
+ readString enc o o' = usingFromImmutable $ Immutable .readString enc o o'
102
114
103
115
toString :: Encoding -> Buffer -> Effect String
104
- toString = Internal .toString
116
+ toString enc = usingFromImmutable $ Immutable .toString enc
117
+
118
+ write :: BufferValueType -> Number -> Offset -> Buffer -> Effect Unit
119
+ write ty value offset buf = runEffectFn4 writeInternal (show ty) value offset buf
120
+
121
+ foreign import writeInternal :: EffectFn4 String Number Offset Buffer Unit
105
122
106
- write :: BufferValueType -> Number -> Int -> Buffer -> Effect Unit
107
- write = Internal .write
123
+ writeString :: Encoding -> Offset -> Int -> String -> Buffer -> Effect Int
124
+ writeString enc offset len value buf =
125
+ runEffectFn5 writeStringInternal (encodingToNode enc) offset len value buf
108
126
109
- writeString :: Encoding -> Int -> Int -> String -> Buffer -> Effect Int
110
- writeString = Internal .writeString
127
+ foreign import writeStringInternal :: EffectFn5 String Offset Int String Buffer Int
111
128
112
- toArray :: Buffer -> Effect (Array Int )
113
- toArray = Internal .toArray
129
+ toArray :: Buffer -> Effect (Array Octet )
130
+ toArray = usingFromImmutable Immutable .toArray
114
131
115
- getAtOffset :: Int -> Buffer -> Effect (Maybe Int )
116
- getAtOffset = Internal .getAtOffset
132
+ getAtOffset :: Offset -> Buffer -> Effect (Maybe Octet )
133
+ getAtOffset o = usingFromImmutable $ Immutable .getAtOffset o
117
134
118
- setAtOffset :: Int -> Int -> Buffer -> Effect Unit
119
- setAtOffset = Internal .setAtOffset
135
+ setAtOffset :: Octet -> Offset -> Buffer -> Effect Unit
136
+ setAtOffset val off buff = runEffectFn3 setAtOffsetImpl val off buff
120
137
121
- slice :: Int -> Int -> Buffer -> Buffer
122
- slice = Internal .slice
138
+ foreign import setAtOffsetImpl :: EffectFn3 Octet Offset Buffer Unit
139
+
140
+ slice :: Offset -> Offset -> Buffer -> Buffer
141
+ slice = unsafeCoerce Immutable .slice
123
142
124
143
size :: Buffer -> Effect Int
125
- size = Internal .size
144
+ size = usingFromImmutable Immutable .size
126
145
127
146
concat :: Array Buffer -> Effect Buffer
128
- concat = Internal .concat
147
+ concat arrs = unsafeCoerce \_ -> Immutable .concat (unsafeCoerce arrs)
129
148
130
149
concat' :: Array Buffer -> Int -> Effect Buffer
131
- concat' = Internal .concat'
150
+ concat' arrs n = unsafeCoerce \_ -> Immutable .concat' (unsafeCoerce arrs) n
151
+
152
+ copy :: Offset -> Offset -> Buffer -> Offset -> Buffer -> Effect Int
153
+ copy srcStart srcEnd src targStart targ = do
154
+ runEffectFn5 copyImpl srcStart srcEnd src targStart targ
155
+
156
+ foreign import copyImpl :: EffectFn5 Offset Offset Buffer Offset Buffer Int
132
157
133
- copy :: Int -> Int -> Buffer -> Int -> Buffer -> Effect Int
134
- copy = Internal .copy
158
+ fill :: Octet -> Offset -> Offset -> Buffer -> Effect Unit
159
+ fill octet start end buf = do
160
+ runEffectFn4 fillImpl octet start end buf
135
161
136
- fill :: Int -> Int -> Int -> Buffer -> Effect Unit
137
- fill = Internal .fill
162
+ foreign import fillImpl :: EffectFn4 Octet Offset Offset Buffer Unit
0 commit comments