From a6fa93e0caf7292390c61939c3e6197ec2c8aefe Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 4 Aug 2020 10:33:22 +0100 Subject: [PATCH 1/2] Implement `RandomAccessCollection` on `JSArrayRef` --- .gitignore | 2 +- .../TestSuites/Sources/PrimaryTests/main.swift | 11 +++++++++++ Sources/JavaScriptKit/JSArrayRef.swift | 11 ++++++++++- 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index c1866f55e..4f8aecf97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,7 @@ dist node_modules .DS_Store -/.build +.build /Packages /*.xcodeproj xcuserdata/ diff --git a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift index 140cc0bd3..60806e671 100644 --- a/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift +++ b/IntegrationTests/TestSuites/Sources/PrimaryTests/main.swift @@ -100,6 +100,17 @@ Array_Iterator: do { try expectEqual(Array(array), expectedProp_4) } +Array_RandomAccessCollection: do { + let globalObject1 = getJSValue(this: .global, name: "globalObject1") + let globalObject1Ref = try expectObject(globalObject1) + let prop_4 = getJSValue(this: globalObject1Ref, name: "prop_4") + let array = try expectArray(prop_4) + let expectedProp_4: [JSValue] = [ + .number(3), .number(4), .string("str_elm_1"), .number(5), + ] + try expectEqual([array[0], array[1], array[2], array[3]], expectedProp_4) +} + Value_Decoder: do { struct GlobalObject1: Codable { struct Prop1: Codable { diff --git a/Sources/JavaScriptKit/JSArrayRef.swift b/Sources/JavaScriptKit/JSArrayRef.swift index 05f46bbec..92c779ff0 100644 --- a/Sources/JavaScriptKit/JSArrayRef.swift +++ b/Sources/JavaScriptKit/JSArrayRef.swift @@ -14,8 +14,9 @@ public class JSArrayRef { } } -extension JSArrayRef: Sequence { +extension JSArrayRef: RandomAccessCollection { public typealias Element = JSValue + public typealias Index = Int public func makeIterator() -> Iterator { Iterator(ref: ref) @@ -37,4 +38,12 @@ extension JSArrayRef: Sequence { return value.isNull ? nil : value } } + + public subscript(position: Int) -> JSValue { + ref.get(position) + } + + public var startIndex: Int { 0 } + + public var endIndex: Int { ref.length.number.map(Int.init) ?? 0 } } From 3b50fe57805a1ac6c6861a65fc1b4e0831830e18 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Tue, 4 Aug 2020 10:40:21 +0100 Subject: [PATCH 2/2] Remove unused `Index` typealias --- Sources/JavaScriptKit/JSArrayRef.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/JavaScriptKit/JSArrayRef.swift b/Sources/JavaScriptKit/JSArrayRef.swift index 92c779ff0..d4abc7e66 100644 --- a/Sources/JavaScriptKit/JSArrayRef.swift +++ b/Sources/JavaScriptKit/JSArrayRef.swift @@ -16,7 +16,6 @@ public class JSArrayRef { extension JSArrayRef: RandomAccessCollection { public typealias Element = JSValue - public typealias Index = Int public func makeIterator() -> Iterator { Iterator(ref: ref)