Skip to content

Commit c6533da

Browse files
Convert FFI to uncurried functions (#54)
* Update FFI to uncurried functions * Inline Internal into Buffer; rewrap ST * Add changelog entry
1 parent f481921 commit c6533da

11 files changed

+160
-347
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ Bugfixes:
4949

5050
Other improvements:
5151
- Format code with `purs-tidy`; enforce in CI (#52 by @JordanMartinez)
52+
- Update FFI to use uncurried functions (#54 by @JordanMartinez)
53+
- Removed `Internal.purs` file (#54 by @JordanMartinez)
5254

5355
## [v8.0.0](https://github.com/purescript-node/purescript-node-buffer/releases/tag/v8.0.0) - 2022-04-27
5456

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
"purescript-effect": "^4.0.0",
1818
"purescript-maybe": "^6.0.0",
1919
"purescript-st": "^6.0.0",
20-
"purescript-unsafe-coerce": "^6.0.0"
20+
"purescript-unsafe-coerce": "^6.0.0",
21+
"purescript-nullable": "^6.0.0"
2122
},
2223
"devDependencies": {
2324
"purescript-assert": "^6.0.0",

src/Node/Buffer.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Buffer } from "node:buffer";
2+
3+
export const freezeImpl = (a) => Buffer.from(a);
4+
export const thawImpl = (a) => Buffer.from(a);
5+
6+
export const writeInternal = (ty, value, offset, buf) => buf["write" + ty](value, offset);
7+
8+
export const writeStringInternal = (encoding, offset, length, value, buff) =>
9+
buff.write(value, offset, length, encoding);
10+
11+
export const setAtOffsetImpl = (value, offset, buff) => {
12+
buff[offset] = value;
13+
};
14+
15+
export const copyImpl = (srcStart, srcEnd, src, targStart, targ) =>
16+
src.copy(targ, targStart, srcStart, srcEnd);
17+
18+
export const fillImpl = (octet, start, end, buf) =>
19+
buf.fill(octet, start, end);

src/Node/Buffer.purs

Lines changed: 64 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@ import Prelude
3232
import Data.ArrayBuffer.Types (ArrayBuffer)
3333
import Data.Maybe (Maybe)
3434
import Effect (Effect)
35+
import Effect.Uncurried (EffectFn1, EffectFn3, EffectFn4, EffectFn5, runEffectFn1, runEffectFn3, runEffectFn4, runEffectFn5)
3536
import Node.Buffer.Class (class MutableBuffer)
3637
import Node.Buffer.Immutable (ImmutableBuffer)
37-
import Node.Buffer.Internal as Internal
38+
import Node.Buffer.Immutable as Immutable
3839
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)
4143

4244
-- | A reference to a mutable buffer for use with `Effect`
4345
foreign import data Buffer :: Type
@@ -67,71 +69,94 @@ instance mutableBufferEffect :: MutableBuffer Buffer Effect where
6769
copy = copy
6870
fill = fill
6971

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+
7084
create :: Int -> Effect Buffer
71-
create = Internal.create
85+
create = usingToImmutable Immutable.create
7286

7387
freeze :: Buffer -> Effect ImmutableBuffer
74-
freeze = Internal.copyAll
88+
freeze = runEffectFn1 freezeImpl
7589

76-
unsafeFreeze :: Buffer -> Effect ImmutableBuffer
77-
unsafeFreeze = Internal.unsafeFreeze
90+
foreign import freezeImpl :: EffectFn1 Buffer ImmutableBuffer
7891

7992
thaw :: ImmutableBuffer -> Effect Buffer
80-
thaw = Internal.copyAll
93+
thaw = runEffectFn1 thawImpl
8194

82-
unsafeThaw :: ImmutableBuffer -> Effect Buffer
83-
unsafeThaw = Internal.unsafeThaw
95+
foreign import thawImpl :: EffectFn1 ImmutableBuffer Buffer
8496

85-
fromArray :: Array Int -> Effect Buffer
86-
fromArray = Internal.fromArray
97+
fromArray :: Array Octet -> Effect Buffer
98+
fromArray = usingToImmutable Immutable.fromArray
8799

88100
fromString :: String -> Encoding -> Effect Buffer
89-
fromString = Internal.fromString
101+
fromString s = usingToImmutable $ Immutable.fromString s
90102

91103
fromArrayBuffer :: ArrayBuffer -> Effect Buffer
92-
fromArrayBuffer = Internal.fromArrayBuffer
104+
fromArrayBuffer = usingToImmutable Immutable.fromArrayBuffer
93105

94106
toArrayBuffer :: Buffer -> Effect ArrayBuffer
95-
toArrayBuffer = Internal.toArrayBuffer
107+
toArrayBuffer = usingFromImmutable Immutable.toArrayBuffer
96108

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
99111

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'
102114

103115
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
105122

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
108126

109-
writeString :: Encoding -> Int -> Int -> String -> Buffer -> Effect Int
110-
writeString = Internal.writeString
127+
foreign import writeStringInternal :: EffectFn5 String Offset Int String Buffer Int
111128

112-
toArray :: Buffer -> Effect (Array Int)
113-
toArray = Internal.toArray
129+
toArray :: Buffer -> Effect (Array Octet)
130+
toArray = usingFromImmutable Immutable.toArray
114131

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
117134

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
120137

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
123142

124143
size :: Buffer -> Effect Int
125-
size = Internal.size
144+
size = usingFromImmutable Immutable.size
126145

127146
concat :: Array Buffer -> Effect Buffer
128-
concat = Internal.concat
147+
concat arrs = unsafeCoerce \_ -> Immutable.concat (unsafeCoerce arrs)
129148

130149
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
132157

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
135161

136-
fill :: Int -> Int -> Int -> Buffer -> Effect Unit
137-
fill = Internal.fill
162+
foreign import fillImpl :: EffectFn4 Octet Offset Offset Buffer Unit

src/Node/Buffer/Immutable.js

Lines changed: 18 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,40 @@
1-
/* global Buffer */
1+
import { Buffer } from "node:buffer";
2+
23
import { inspect } from "util";
34
export const showImpl = inspect;
45

5-
export function eqImpl(a) {
6-
return b => {
7-
return a.equals(b);
8-
};
9-
}
6+
export const eqImpl = (a, b) => a.equals(b);
107

11-
export function compareImpl(a) {
12-
return b => {
13-
return a.compare(b);
14-
};
15-
}
8+
export const compareImpl = (a, b) => a.compare(b);
169

17-
export function create(size) {
18-
return Buffer.alloc(size);
19-
}
10+
export const create = (size) => Buffer.alloc(size);
2011

21-
export function fromArray(octets) {
22-
return Buffer.from(octets);
23-
}
12+
export const fromArray = (octets) => Buffer.from(octets);
2413

25-
export function size(buff) {
26-
return buff.length;
27-
}
14+
export const size = (buff) => buff.length;
2815

2916
export function toArray(buff) {
3017
var json = buff.toJSON();
3118
return json.data || json;
3219
}
3320

34-
export function toArrayBuffer(buff) {
35-
return buff.buffer.slice(buff.byteOffset, buff.byteOffset + buff.byteLength);
36-
}
21+
export const toArrayBuffer = (buff) =>
22+
buff.buffer.slice(buff.byteOffset, buff.byteOffset + buff.byteLength);
3723

38-
export function fromArrayBuffer(ab) {
39-
return Buffer.from(ab);
40-
}
24+
export const fromArrayBuffer = (ab) => Buffer.from(ab);
4125

42-
export function fromStringImpl(str) {
43-
return encoding => {
44-
return Buffer.from(str, encoding);
45-
};
46-
}
26+
export const fromStringImpl = (str, encoding) => Buffer.from(str, encoding);
4727

48-
export function readImpl(ty) {
49-
return offset => {
50-
return buf => {
51-
return buf["read" + ty](offset);
52-
};
53-
};
54-
}
28+
export const readImpl = (ty, offset, buf) => buf["read" + ty](offset);
5529

56-
export function readStringImpl(enc) {
57-
return start => {
58-
return end => {
59-
return buff => {
60-
return buff.toString(enc, start, end);
61-
};
62-
};
63-
};
64-
}
30+
export const readStringImpl = (enc, start, end, buff) => buff.toString(enc, start, end);
6531

66-
export function getAtOffsetImpl(just) {
67-
return nothing => {
68-
return offset => {
69-
return buff => {
70-
var octet = buff[offset];
71-
return octet == null ? nothing : just(octet);
72-
};
73-
};
74-
};
75-
}
32+
export const getAtOffsetImpl = (offset, buff) => buff[offset];
7633

77-
export function toStringImpl(enc) {
78-
return buff => {
79-
return buff.toString(enc);
80-
};
81-
}
34+
export const toStringImpl = (enc, buff) => buff.toString(enc);
8235

83-
export function slice(start) {
84-
return end => {
85-
return buff => {
86-
return buff.slice(start, end);
87-
};
88-
};
89-
}
36+
export const sliceImpl = (start, end, buff) => buff.slice(start, end);
9037

91-
export function concat(buffs) {
92-
return Buffer.concat(buffs);
93-
}
38+
export const concat = (buffs) => Buffer.concat(buffs);
9439

95-
export function concatToLength(buffs) {
96-
return totalLength => {
97-
return Buffer.concat(buffs, totalLength);
98-
};
99-
}
40+
export const concatToLength = (buffs, totalLength) => Buffer.concat(buffs, totalLength);

0 commit comments

Comments
 (0)