goscript 0.0.37 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compiler/analysis.go +129 -8
- package/compiler/compiler.go +4 -1
- package/compiler/composite-lit.go +2 -4
- package/compiler/expr-call.go +12 -0
- package/compiler/lit.go +100 -6
- package/compiler/protobuf.go +2 -2
- package/compiler/spec-value.go +3 -3
- package/compiler/spec.go +6 -3
- package/compiler/stmt-assign.go +1 -1
- package/dist/gs/builtin/builtin.d.ts +45 -0
- package/dist/gs/builtin/builtin.js +197 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.js +2 -1
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.d.ts +56 -0
- package/dist/gs/bytes/buffer.gs.js +611 -0
- package/dist/gs/bytes/buffer.gs.js.map +1 -0
- package/dist/gs/bytes/bytes.gs.d.ts +78 -0
- package/dist/gs/bytes/bytes.gs.js +1011 -0
- package/dist/gs/bytes/bytes.gs.js.map +1 -0
- package/dist/gs/bytes/index.d.ts +4 -0
- package/dist/gs/bytes/index.js +5 -0
- package/dist/gs/bytes/index.js.map +1 -0
- package/dist/gs/bytes/iter.gs.d.ts +9 -0
- package/dist/gs/bytes/iter.gs.js +143 -0
- package/dist/gs/bytes/iter.gs.js.map +1 -0
- package/dist/gs/bytes/reader.gs.d.ts +34 -0
- package/dist/gs/bytes/reader.gs.js +198 -0
- package/dist/gs/bytes/reader.gs.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/errors.js +182 -23
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/go113.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js +1 -1
- package/dist/gs/github.com/pkg/errors/go113.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/index.d.ts +3 -3
- package/dist/gs/github.com/pkg/errors/index.js +3 -3
- package/dist/gs/github.com/pkg/errors/index.js.map +1 -1
- package/dist/gs/github.com/pkg/errors/stack.d.ts +1 -1
- package/dist/gs/github.com/pkg/errors/stack.js +8 -5
- package/dist/gs/github.com/pkg/errors/stack.js.map +1 -1
- package/dist/gs/internal/abi/index.d.ts +20 -0
- package/dist/gs/internal/abi/index.js +20 -0
- package/dist/gs/internal/abi/index.js.map +1 -0
- package/dist/gs/internal/bytealg/index.d.ts +14 -0
- package/dist/gs/internal/bytealg/index.js +139 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -0
- package/dist/gs/internal/byteorder/index.d.ts +1 -1
- package/dist/gs/internal/byteorder/index.js +4 -4
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/math/index.d.ts +44 -44
- package/dist/gs/math/index.js +44 -44
- package/dist/gs/math/index.js.map +1 -1
- package/dist/gs/os/index.d.ts +19 -19
- package/dist/gs/os/index.js +19 -19
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/reflect/deepequal.d.ts +2 -0
- package/dist/gs/reflect/deepequal.js +91 -0
- package/dist/gs/reflect/deepequal.js.map +1 -0
- package/dist/gs/reflect/index.d.ts +8 -0
- package/dist/gs/reflect/index.js +10 -0
- package/dist/gs/reflect/index.js.map +1 -0
- package/dist/gs/reflect/iter.d.ts +4 -0
- package/dist/gs/reflect/iter.js +24 -0
- package/dist/gs/reflect/iter.js.map +1 -0
- package/dist/gs/reflect/map.d.ts +20 -0
- package/dist/gs/reflect/map.js +74 -0
- package/dist/gs/reflect/map.js.map +1 -0
- package/dist/gs/reflect/swapper.d.ts +2 -0
- package/dist/gs/reflect/swapper.js +46 -0
- package/dist/gs/reflect/swapper.js.map +1 -0
- package/dist/gs/reflect/type.d.ts +134 -0
- package/dist/gs/reflect/type.js +825 -0
- package/dist/gs/reflect/type.js.map +1 -0
- package/dist/gs/reflect/types.d.ts +90 -0
- package/dist/gs/reflect/types.js +119 -0
- package/dist/gs/reflect/types.js.map +1 -0
- package/dist/gs/reflect/value.d.ts +13 -0
- package/dist/gs/reflect/value.js +202 -0
- package/dist/gs/reflect/value.js.map +1 -0
- package/dist/gs/reflect/visiblefields.d.ts +4 -0
- package/dist/gs/reflect/visiblefields.js +149 -0
- package/dist/gs/reflect/visiblefields.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +6 -6
- package/dist/gs/strconv/index.js +6 -6
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/index.d.ts +1 -1
- package/dist/gs/strings/index.js +1 -1
- package/dist/gs/strings/index.js.map +1 -1
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/sync/atomic/index.d.ts +4 -4
- package/dist/gs/sync/atomic/index.js +4 -4
- package/dist/gs/sync/atomic/index.js.map +1 -1
- package/dist/gs/syscall/index.d.ts +6 -6
- package/dist/gs/syscall/index.js +34 -28
- package/dist/gs/syscall/index.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +1 -1
- package/dist/gs/unicode/utf8/utf8.js +4 -2
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unsafe/unsafe.js.map +1 -1
- package/gs/builtin/builtin.ts +219 -0
- package/gs/builtin/slice.ts +2 -1
- package/gs/bytes/buffer.gs.ts +614 -0
- package/gs/bytes/bytes.gs.ts +1180 -0
- package/gs/bytes/godoc.txt +69 -0
- package/gs/bytes/index.ts +69 -0
- package/gs/bytes/iter.gs.ts +149 -0
- package/gs/bytes/reader.gs.ts +230 -0
- package/gs/github.com/pkg/errors/errors.ts +408 -238
- package/gs/github.com/pkg/errors/go113.ts +5 -6
- package/gs/github.com/pkg/errors/index.ts +12 -3
- package/gs/github.com/pkg/errors/stack.ts +107 -105
- package/gs/internal/abi/index.ts +37 -0
- package/gs/internal/bytealg/index.ts +149 -0
- package/gs/internal/byteorder/index.ts +5 -5
- package/gs/math/abs.gs.test.ts +1 -1
- package/gs/math/acosh.gs.test.ts +4 -2
- package/gs/math/asin.gs.test.ts +1 -1
- package/gs/math/asinh.gs.test.ts +7 -3
- package/gs/math/atan.gs.test.ts +1 -1
- package/gs/math/atan2.gs.test.ts +17 -9
- package/gs/math/atanh.gs.test.ts +1 -1
- package/gs/math/bits.gs.test.ts +1 -1
- package/gs/math/cbrt.gs.test.ts +1 -1
- package/gs/math/const.gs.test.ts +34 -8
- package/gs/math/copysign.gs.test.ts +7 -3
- package/gs/math/dim.gs.test.ts +19 -7
- package/gs/math/erf.gs.test.ts +1 -1
- package/gs/math/erfinv.gs.test.ts +4 -2
- package/gs/math/exp.gs.test.ts +1 -1
- package/gs/math/expm1.gs.test.ts +6 -4
- package/gs/math/floor.gs.test.ts +17 -4
- package/gs/math/fma.gs.test.ts +53 -53
- package/gs/math/frexp.gs.test.ts +112 -117
- package/gs/math/gamma.gs.test.ts +1 -1
- package/gs/math/hypot.gs.test.ts +53 -53
- package/gs/math/index.ts +80 -44
- package/gs/math/j0.gs.test.ts +6 -2
- package/gs/math/j1.gs.test.ts +6 -2
- package/gs/math/jn.gs.test.ts +9 -5
- package/gs/math/ldexp.gs.test.ts +103 -86
- package/gs/math/lgamma.gs.test.ts +10 -10
- package/gs/math/log.gs.test.ts +1 -1
- package/gs/math/log10.gs.test.ts +1 -1
- package/gs/math/log1p.gs.test.ts +2 -2
- package/gs/math/logb.gs.test.ts +1 -1
- package/gs/math/mod.gs.test.ts +2 -2
- package/gs/math/modf.gs.test.ts +7 -7
- package/gs/math/nextafter.gs.test.ts +9 -7
- package/gs/math/pow.gs.test.ts +6 -4
- package/gs/math/pow10.gs.test.ts +1 -1
- package/gs/math/remainder.gs.test.ts +1 -1
- package/gs/math/signbit.gs.test.ts +1 -1
- package/gs/math/sin.gs.test.ts +1 -1
- package/gs/math/sincos.gs.test.ts +33 -14
- package/gs/math/sinh.gs.test.ts +1 -1
- package/gs/math/sqrt.gs.test.ts +1 -1
- package/gs/math/tan.gs.test.ts +3 -3
- package/gs/math/tanh.gs.test.ts +1 -1
- package/gs/os/index.ts +128 -19
- package/gs/reflect/ANALYSIS.md +278 -0
- package/gs/reflect/deepequal.test.ts +41 -0
- package/gs/reflect/deepequal.ts +169 -0
- package/gs/reflect/function-types.test.ts +146 -0
- package/gs/reflect/godoc.txt +67 -0
- package/gs/reflect/index.ts +83 -0
- package/gs/reflect/iter.ts +44 -0
- package/gs/reflect/map.test.ts +30 -0
- package/gs/reflect/map.ts +85 -0
- package/gs/reflect/swapper.ts +52 -0
- package/gs/reflect/type.ts +1016 -0
- package/gs/reflect/types.ts +214 -0
- package/gs/reflect/value.ts +270 -0
- package/gs/reflect/visiblefields.ts +177 -0
- package/gs/strconv/index.ts +39 -6
- package/gs/strings/index.ts +7 -1
- package/gs/strings/replace.ts +1 -9
- package/gs/sync/atomic/index.ts +53 -4
- package/gs/syscall/index.ts +45 -37
- package/gs/unicode/utf8/utf8.ts +8 -5
- package/gs/unsafe/unsafe.ts +1 -1
- package/package.json +2 -1
- package/dist/gs/internal/testlog/index.d.ts +0 -1
- package/dist/gs/internal/testlog/index.js +0 -5
- package/dist/gs/internal/testlog/index.js.map +0 -1
- package/dist/gs/maps/iter.gs.d.ts +0 -7
- package/dist/gs/maps/iter.gs.js +0 -65
- package/dist/gs/maps/iter.gs.js.map +0 -1
- package/dist/gs/maps/maps.gs.d.ts +0 -7
- package/dist/gs/maps/maps.gs.js +0 -79
- package/dist/gs/maps/maps.gs.js.map +0 -1
- package/dist/gs/stringslite/index.d.ts +0 -1
- package/dist/gs/stringslite/index.js +0 -2
- package/dist/gs/stringslite/index.js.map +0 -1
- package/dist/gs/stringslite/strings.d.ts +0 -11
- package/dist/gs/stringslite/strings.js +0 -67
- package/dist/gs/stringslite/strings.js.map +0 -1
- package/gs/internal/testlog/index.ts +0 -7
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Export the main reflect functions organized like Go stdlib
|
|
2
|
+
export {
|
|
3
|
+
TypeOf,
|
|
4
|
+
ValueOf,
|
|
5
|
+
Value,
|
|
6
|
+
Kind,
|
|
7
|
+
ArrayOf,
|
|
8
|
+
SliceOf,
|
|
9
|
+
PointerTo,
|
|
10
|
+
PtrTo,
|
|
11
|
+
MapOf,
|
|
12
|
+
ChanOf,
|
|
13
|
+
} from './type'
|
|
14
|
+
export type { Type } from './type'
|
|
15
|
+
export { DeepEqual } from './deepequal'
|
|
16
|
+
export {
|
|
17
|
+
Zero,
|
|
18
|
+
Copy,
|
|
19
|
+
Indirect,
|
|
20
|
+
New,
|
|
21
|
+
MakeSlice,
|
|
22
|
+
MakeMap,
|
|
23
|
+
Append,
|
|
24
|
+
MakeChan,
|
|
25
|
+
Select,
|
|
26
|
+
} from './value'
|
|
27
|
+
export { Swapper } from './swapper'
|
|
28
|
+
|
|
29
|
+
// Export new types and constants
|
|
30
|
+
export {
|
|
31
|
+
ChanDir,
|
|
32
|
+
RecvDir,
|
|
33
|
+
SendDir,
|
|
34
|
+
BothDir,
|
|
35
|
+
StructTag,
|
|
36
|
+
ValueError,
|
|
37
|
+
SelectDir,
|
|
38
|
+
SelectSend,
|
|
39
|
+
SelectRecv,
|
|
40
|
+
SelectDefault,
|
|
41
|
+
bitVector,
|
|
42
|
+
} from './types'
|
|
43
|
+
export type {
|
|
44
|
+
uintptr,
|
|
45
|
+
Pointer,
|
|
46
|
+
StructField,
|
|
47
|
+
Method,
|
|
48
|
+
SelectCase,
|
|
49
|
+
SliceHeader,
|
|
50
|
+
StringHeader,
|
|
51
|
+
MapIter,
|
|
52
|
+
} from './types'
|
|
53
|
+
|
|
54
|
+
// Export kind constants
|
|
55
|
+
export {
|
|
56
|
+
Invalid,
|
|
57
|
+
Bool,
|
|
58
|
+
Int,
|
|
59
|
+
Int8,
|
|
60
|
+
Int16,
|
|
61
|
+
Int32,
|
|
62
|
+
Int64,
|
|
63
|
+
Uint,
|
|
64
|
+
Uint8,
|
|
65
|
+
Uint16,
|
|
66
|
+
Uint32,
|
|
67
|
+
Uint64,
|
|
68
|
+
Uintptr,
|
|
69
|
+
Float32,
|
|
70
|
+
Float64,
|
|
71
|
+
Complex64,
|
|
72
|
+
Complex128,
|
|
73
|
+
Array,
|
|
74
|
+
Chan,
|
|
75
|
+
Func,
|
|
76
|
+
Interface,
|
|
77
|
+
Map,
|
|
78
|
+
Ptr,
|
|
79
|
+
Slice,
|
|
80
|
+
String,
|
|
81
|
+
Struct,
|
|
82
|
+
UnsafePointer,
|
|
83
|
+
} from './type'
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Type, Value } from './type.js'
|
|
2
|
+
import { uintptr } from './types.js'
|
|
3
|
+
import { ValueOf } from './value.js'
|
|
4
|
+
|
|
5
|
+
import * as iter from '@goscript/iter/index.js'
|
|
6
|
+
|
|
7
|
+
export function rangeNum<
|
|
8
|
+
T extends
|
|
9
|
+
| number
|
|
10
|
+
| number
|
|
11
|
+
| number
|
|
12
|
+
| number
|
|
13
|
+
| number
|
|
14
|
+
| number
|
|
15
|
+
| number
|
|
16
|
+
| number
|
|
17
|
+
| number
|
|
18
|
+
| number
|
|
19
|
+
| uintptr,
|
|
20
|
+
N extends number | number,
|
|
21
|
+
>(num: N, t: Type): iter.Seq<Value> {
|
|
22
|
+
// cannot use range T(v) because no core type.
|
|
23
|
+
|
|
24
|
+
// if the iteration value type is define by
|
|
25
|
+
// type T built-in type.
|
|
26
|
+
return (_yield: ((v: Value) => boolean) | null): void => {
|
|
27
|
+
let convert = t!.PkgPath!() != ''
|
|
28
|
+
// cannot use range T(v) because no core type.
|
|
29
|
+
|
|
30
|
+
// if the iteration value type is define by
|
|
31
|
+
// type T built-in type.
|
|
32
|
+
for (let i = 0 as unknown as T; i < (num as unknown as T); i++) {
|
|
33
|
+
let tmp = ValueOf(i).clone()
|
|
34
|
+
// if the iteration value type is define by
|
|
35
|
+
// type T built-in type.
|
|
36
|
+
if (convert) {
|
|
37
|
+
tmp = tmp.Convert(t).clone()
|
|
38
|
+
}
|
|
39
|
+
if (!_yield!(tmp)) {
|
|
40
|
+
return
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest'
|
|
2
|
+
import { MapIter } from './map.js'
|
|
3
|
+
|
|
4
|
+
describe('MapIter', () => {
|
|
5
|
+
it('should iterate over map entries with proper typing', () => {
|
|
6
|
+
const map = new Map<string, number>()
|
|
7
|
+
map.set('one', 1)
|
|
8
|
+
map.set('two', 2)
|
|
9
|
+
map.set('three', 3)
|
|
10
|
+
|
|
11
|
+
const iter = new MapIter<string, number>(map)
|
|
12
|
+
|
|
13
|
+
expect(iter.current?.done === false).toBe(true)
|
|
14
|
+
expect(iter.Key()).toBe('one')
|
|
15
|
+
expect(iter.Value()).toBe(1)
|
|
16
|
+
|
|
17
|
+
expect(iter.Next()).toBe(true)
|
|
18
|
+
expect(iter.current?.done === false).toBe(true)
|
|
19
|
+
expect(typeof iter.Key()).toBe('string')
|
|
20
|
+
expect(typeof iter.Value()).toBe('number')
|
|
21
|
+
|
|
22
|
+
const newMap = new Map<string, number>()
|
|
23
|
+
newMap.set('reset', 100)
|
|
24
|
+
iter.Reset(newMap)
|
|
25
|
+
|
|
26
|
+
expect(iter.current?.done === false).toBe(true)
|
|
27
|
+
expect(iter.Key()).toBe('reset')
|
|
28
|
+
expect(iter.Value()).toBe(100)
|
|
29
|
+
})
|
|
30
|
+
})
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Type, Kind, Value } from './type.js'
|
|
2
|
+
|
|
3
|
+
// Simple MapOf implementation using JavaScript Map
|
|
4
|
+
export function MapOf(key: Type, elem: Type): Type {
|
|
5
|
+
return new MapType(key, elem)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
// Simple map type implementation
|
|
9
|
+
class MapType implements Type {
|
|
10
|
+
constructor(
|
|
11
|
+
private _keyType: Type,
|
|
12
|
+
private _elemType: Type,
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
public String(): string {
|
|
16
|
+
return `map[${this._keyType.String()}]${this._elemType.String()}`
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
public Kind(): Kind {
|
|
20
|
+
return new Kind(21) // Map kind
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public Size(): number {
|
|
24
|
+
return 8 // pointer size
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public Elem(): Type | null {
|
|
28
|
+
return this._elemType
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public Key(): Type | null {
|
|
32
|
+
return this._keyType
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public NumField(): number {
|
|
36
|
+
return 0
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* MapIter provides an iterator interface for Go maps.
|
|
42
|
+
* It wraps a JavaScript Map iterator and provides methods to iterate over key-value pairs.
|
|
43
|
+
* @template K - The type of keys in the map
|
|
44
|
+
* @template V - The type of values in the map
|
|
45
|
+
*/
|
|
46
|
+
export class MapIter<K = unknown, V = unknown> {
|
|
47
|
+
public iterator: Iterator<[K, V]>
|
|
48
|
+
public current: IteratorResult<[K, V]> | null = null
|
|
49
|
+
|
|
50
|
+
constructor(public map: Map<K, V>) {
|
|
51
|
+
this.iterator = map.entries()
|
|
52
|
+
this.Next()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public Next(): boolean {
|
|
56
|
+
this.current = this.iterator.next()
|
|
57
|
+
return !this.current.done
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
public Key(): K | null {
|
|
61
|
+
return this.current?.value?.[0] ?? null
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public Value(): V | null {
|
|
65
|
+
return this.current?.value?.[1] ?? null
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public Reset(m: Map<K, V>): void {
|
|
69
|
+
this.map = m
|
|
70
|
+
this.iterator = m.entries()
|
|
71
|
+
this.current = null
|
|
72
|
+
this.Next()
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Helper functions for map operations
|
|
77
|
+
export function MakeMap(typ: Type): Value {
|
|
78
|
+
const map = new Map()
|
|
79
|
+
return new Value(map, typ)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function MakeMapWithSize(typ: Type, _n: number): Value {
|
|
83
|
+
// JavaScript Map doesn't have initial size, so we ignore n
|
|
84
|
+
return MakeMap(typ)
|
|
85
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ReflectValue } from './types'
|
|
2
|
+
|
|
3
|
+
// Swapper returns a function that swaps the elements in the provided slice.
|
|
4
|
+
// Swapper panics if the provided interface is not a slice.
|
|
5
|
+
export function Swapper(slice: ReflectValue): (i: number, j: number) => void {
|
|
6
|
+
let actualArray: unknown[] | null = null
|
|
7
|
+
|
|
8
|
+
// Try to extract the underlying array
|
|
9
|
+
if (Array.isArray(slice)) {
|
|
10
|
+
actualArray = slice
|
|
11
|
+
} else if (slice && typeof slice === 'object' && '__meta__' in slice) {
|
|
12
|
+
// GoScript slice object
|
|
13
|
+
const meta = (slice as { __meta__?: { backing?: unknown[] } }).__meta__
|
|
14
|
+
if (meta && meta.backing && Array.isArray(meta.backing)) {
|
|
15
|
+
actualArray = meta.backing
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
if (!actualArray) {
|
|
20
|
+
// Return a no-op function if we can't extract an array
|
|
21
|
+
return () => {}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Fast path for slices of size 0 and 1. Nothing to swap.
|
|
25
|
+
switch (actualArray.length) {
|
|
26
|
+
case 0:
|
|
27
|
+
return (_i: number, _j: number): void => {
|
|
28
|
+
throw new Error('reflect: slice index out of range')
|
|
29
|
+
}
|
|
30
|
+
case 1:
|
|
31
|
+
return (i: number, j: number): void => {
|
|
32
|
+
if (i !== 0 || j !== 0) {
|
|
33
|
+
throw new Error('reflect: slice index out of range')
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Return the swapper function
|
|
39
|
+
return (i: number, j: number) => {
|
|
40
|
+
if (
|
|
41
|
+
actualArray &&
|
|
42
|
+
i >= 0 &&
|
|
43
|
+
j >= 0 &&
|
|
44
|
+
i < actualArray.length &&
|
|
45
|
+
j < actualArray.length
|
|
46
|
+
) {
|
|
47
|
+
const temp = actualArray[i]
|
|
48
|
+
actualArray[i] = actualArray[j]
|
|
49
|
+
actualArray[j] = temp
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|