/// map
/// 각 요소에 대한 값을 변경
/// 배열의 상태로 반환한다.
/*구현체
func map<T>(_ transform: (String) throws -> T) rethrows -> [T]
*/
let array: [Int] = [1, 2, 3, 4]
let mapped = array.map { $0 * 2 }
print(array)
print(mapped)
/// compactMap
/// 1차원 배열에서 nil을 제거하고 옵셔널 바인딩을 할 때
/*구현체
func compactMap<ElementOfResult>(_ transform: (Int?) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
*/
let optionalArray: [Int?] = [1, 2, nil, 3, 4, nil, 5, 6]
let compacted = optionalArray.compactMap { $0 }
print(optionalArray)
print(compacted)
/// flatMap
/// 2차원 배열을 1차원 배열로 flatten하게 만들 때
/*구현체
func flatMap<SegmentOfResult>(_ transform: ([Int]) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
*/
let twoDimensionArray: [[Int]] = [[1, 2, 3], [4, 5, 6]]
let flattened = twoDimensionArray.flatMap{ $0 }
print(twoDimensionArray)
print(flattened)