//===--- Reduce.swift - tests for the two reduce variants -----------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // RUN: %target-run-simple-swift | %FileCheck %s // REQUIRES: executable_test // CHECK: testing... print("testing...") // Test the examples from the documentation of reduce(_:_:) and reduce(into:_:) let numbers = [1, 2, 3, 4] let numberSum = numbers.reduce(0, { x, y in x + y }) // CHECK-NEXT: 10 print(numberSum) let letters = "abracadabra" let letterCount = letters.reduce(into: [:]) { counts, letter in counts[letter, default: 0] += 1 } // CHECK-NEXT: ["a", "b", "c", "d", "r"] print(letterCount.keys.sorted()) print(letterCount["a"]!) // CHECK: 5 print(letterCount["b"]!) // CHECK: 2 print(letterCount["c"]!) // CHECK: 1 print(letterCount["d"]!) // CHECK: 1 print(letterCount["r"]!) // CHECK: 2 // Test the two reduce methods with different levels of inference let numbers2 = Array(2..<7) // Test reduce(_:_:) // CHECK-NEXT: 20 let sum1 = numbers2.reduce(0) { (x: Int, y: Int) -> Int in x + y } print(sum1) // CHECK-NEXT: 20 let sum2 = numbers2.reduce(0) { (x, y) in x + y } print(sum2) // CHECK-NEXT: 20 let sum3 = numbers2.reduce(0) { $0 + $1 } print(sum3) // CHECK-NEXT: 20 let sum4 = numbers2.reduce(0, +) print(sum4) // Test reduce(into:_:) // CHECK-NEXT: 20 let sum5 = numbers2.reduce(into: 0) { (x: inout Int, y: Int) in x += y } print(sum5) // CHECK-NEXT: 20 let sum6 = numbers2.reduce(into: 0) { x, y in x += y } print(sum6) // CHECK-NEXT: 20 let sum7 = numbers2.reduce(into: 0) { $0 += $1 } print(sum7) // CHECK-NEXT: 20 let sum8 = numbers2.reduce(into: 0, +=) print(sum8) // Test that the initial value remains unmodified var original = [0, 1] let result = numbers2.reduce(into: original) { acc, x in acc.append(x) } // CHECK-NEXT: [0, 1] print(original) // CHECK-NEXT: [0, 1, 2, 3, 4, 5, 6] print(result) // CHECK: all done. print("all done.")