├── CombineOperators.png ├── README.md ├── CombineOperators ├── Assets.xcassets │ ├── Contents.json │ ├── AccentColor.colorset │ │ └── Contents.json │ └── AppIcon.appiconset │ │ └── Contents.json ├── Preview Content │ └── Preview Assets.xcassets │ │ └── Contents.json ├── CombineOperatorsApp.swift ├── Color+Hex.swift ├── ArrowView.swift ├── ContentView.swift ├── ValueStyle.swift └── OperatorViewModel.swift └── CombineOperators.xcodeproj ├── project.xcworkspace ├── contents.xcworkspacedata ├── xcuserdata │ └── nfadeeva.xcuserdatad │ │ └── UserInterfaceState.xcuserstate └── xcshareddata │ └── IDEWorkspaceChecks.plist ├── xcuserdata └── nfadeeva.xcuserdatad │ └── xcschemes │ └── xcschememanagement.plist └── project.pbxproj /CombineOperators.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanaschita/combineOperators/HEAD/CombineOperators.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Combine operators cheat sheet built with SwiftUI. 2 | 3 | ![Combine operators](CombineOperators.png) -------------------------------------------------------------------------------- /CombineOperators/Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /CombineOperators/Preview Content/Preview Assets.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "author" : "xcode", 4 | "version" : 1 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /CombineOperators.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /CombineOperators/Assets.xcassets/AccentColor.colorset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "colors" : [ 3 | { 4 | "idiom" : "universal" 5 | } 6 | ], 7 | "info" : { 8 | "author" : "xcode", 9 | "version" : 1 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /CombineOperators.xcodeproj/project.xcworkspace/xcuserdata/nfadeeva.xcuserdatad/UserInterfaceState.xcuserstate: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Tanaschita/combineOperators/HEAD/CombineOperators.xcodeproj/project.xcworkspace/xcuserdata/nfadeeva.xcuserdatad/UserInterfaceState.xcuserstate -------------------------------------------------------------------------------- /CombineOperators/Assets.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "universal", 5 | "platform" : "ios", 6 | "size" : "1024x1024" 7 | } 8 | ], 9 | "info" : { 10 | "author" : "xcode", 11 | "version" : 1 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /CombineOperators.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /CombineOperators/CombineOperatorsApp.swift: -------------------------------------------------------------------------------- 1 | // 2 | // CombineOperatorsApp.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 16.11.22. 6 | // 7 | 8 | import SwiftUI 9 | 10 | @main 11 | struct CombineOperatorsApp: App { 12 | var body: some Scene { 13 | WindowGroup { 14 | ContentView() 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /CombineOperators.xcodeproj/xcuserdata/nfadeeva.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | CombineOperators.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /CombineOperators/Color+Hex.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Color+Hex.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 19.11.22. 6 | // 7 | 8 | import SwiftUI 9 | 10 | extension Color { 11 | init(hex: UInt, alpha: Double = 1) { 12 | self.init( 13 | .sRGB, 14 | red: Double((hex >> 16) & 0xff) / 255, 15 | green: Double((hex >> 08) & 0xff) / 255, 16 | blue: Double((hex >> 00) & 0xff) / 255, 17 | opacity: alpha 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CombineOperators/ArrowView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Triangle.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 19.11.22. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ArrowView: View { 11 | 12 | private func arrowPath() -> Path { 13 | Path { path in 14 | path.move(to: .zero) 15 | path.addLine(to: .init(x: -10.0, y: 5.0)) 16 | path.addLine(to: .init(x: -10.0, y: -5.0)) 17 | path.closeSubpath() 18 | } 19 | } 20 | 21 | var body: some View { 22 | HStack(spacing: 0) { 23 | Rectangle() 24 | .fill(.black) 25 | .frame(width: 500, height: 3) 26 | Triangle() 27 | .fill(.black) 28 | .frame(width: 10, height: 10) 29 | } 30 | } 31 | } 32 | 33 | struct Triangle: Shape { 34 | 35 | func path(in rect: CGRect) -> Path { 36 | var path = Path() 37 | path.move(to: CGPoint(x: rect.minX, y: rect.minY)) 38 | path.addLine(to: CGPoint(x: rect.minX, y: rect.maxY)) 39 | path.addLine(to: CGPoint(x: rect.maxX, y: rect.midY)) 40 | path.addLine(to: CGPoint(x: rect.minX, y: rect.minY)) 41 | return path 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /CombineOperators/ContentView.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ContentView.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 16.11.22. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ContentView: View { 11 | 12 | var body: some View { 13 | operatorView(OperatorViewModel.switchToLatest) 14 | } 15 | 16 | @ViewBuilder 17 | func operatorView(_ viewModel: OperatorViewModel) -> some View { 18 | VStack() { 19 | valuesRow(viewModel.p1) 20 | if let p2 = viewModel.p2 { 21 | valuesRow(p2) 22 | } 23 | operatorRow(text: viewModel.operatorDescription) 24 | valuesRow(viewModel.output) 25 | } 26 | } 27 | 28 | func valuesRow(_ values: [String]) -> some View { 29 | return ZStack { 30 | ArrowView() 31 | HStack(spacing: 20) { 32 | ForEach(values, id: \.self) { 33 | circle(withValue: $0) 34 | } 35 | } 36 | } 37 | } 38 | 39 | func operatorRow(text: String) -> some View { 40 | return ZStack { 41 | RoundedRectangle(cornerSize: CGSize(width: 20, height: 20)) 42 | .strokeBorder(lineWidth: 2) 43 | .frame(width: 500, height: 80) 44 | Text(text) 45 | .font(.custom("Menlo", size: 30)) 46 | .fontWeight(.bold) 47 | } 48 | .padding(.top, 20) 49 | .padding(.bottom, 20) 50 | } 51 | 52 | func circle(withValue value: String) -> some View { 53 | let style = ValueStyle.style(for: value) 54 | 55 | return ZStack { 56 | Circle() 57 | .stroke(style.borderColor, lineWidth: 2) 58 | .background(Circle().fill(style.fillColor)) 59 | .frame(width: 80, height: 80) 60 | Text(value) 61 | .foregroundColor(style.textColor) 62 | .font(ValueStyle.font(for: value)) 63 | } 64 | } 65 | } 66 | 67 | struct ContentView_Previews: PreviewProvider { 68 | static var previews: some View { 69 | ContentView() 70 | .previewInterfaceOrientation(.landscapeLeft) 71 | } 72 | } 73 | 74 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /CombineOperators/ValueStyle.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ValueStyle.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 19.11.22. 6 | // 7 | 8 | import SwiftUI 9 | 10 | struct ValueStyle { 11 | 12 | let fillColor: Color 13 | let borderColor: Color 14 | let textColor: Color 15 | 16 | static func font(for value: String) -> Font { 17 | if value.count > 2 { 18 | return .title 19 | } 20 | if value.count > 5 { 21 | return .body 22 | } 23 | return .largeTitle 24 | } 25 | 26 | static func style(for value: String) -> ValueStyle { 27 | let borderColor: Color 28 | let fillColor: Color 29 | var textColor: Color = .white 30 | 31 | switch value { 32 | case "|": 33 | borderColor = Color(hex: 0xFFFFFF, alpha: 0) 34 | fillColor = Color(hex: 0xFFFFFF, alpha: 0) 35 | textColor = Color(hex: 0x000000) 36 | case "nil": 37 | borderColor = Color(hex: 0xFFFFFF) 38 | fillColor = Color(hex: 0x677799) 39 | case "0": 40 | borderColor = Color(hex: 0xFFFFFF, alpha: 0) 41 | fillColor = Color(hex: 0xFFFFFF, alpha: 0) 42 | textColor = Color(hex: 0xFFFFFF, alpha: 0) 43 | case "1": 44 | borderColor = Color(hex: 0x7a6966) 45 | fillColor = Color(hex: 0x8f7975) 46 | case "2": 47 | borderColor = Color(hex: 0x965d51) 48 | fillColor = Color(hex: 0xb57062) 49 | case "3": 50 | borderColor = Color(hex: 0x80415f) 51 | fillColor = Color(hex: 0x9c5175) 52 | case "4": 53 | borderColor = Color(hex: 0x61876c) 54 | fillColor = Color(hex: 0x76a383) 55 | case "5": 56 | borderColor = Color(hex: 0x638079) 57 | fillColor = Color(hex: 0x7ea39b) 58 | case "6": 59 | borderColor = Color(hex: 0x6a4e7a) 60 | fillColor = Color(hex: 0x89679e) 61 | case "7": 62 | borderColor = Color(hex: 0x65808c) 63 | fillColor = Color(hex: 0x7695a3) 64 | case "8": 65 | borderColor = Color(hex: 0x8f4d4d) 66 | fillColor = Color(hex: 0xa65858) 67 | case "10": 68 | borderColor = Color(hex: 0x638079) 69 | fillColor = Color(hex: 0x7ea39b) 70 | default: 71 | return ValueStyle.style(for: String(Int.random(in: 5...8))) 72 | } 73 | 74 | return ValueStyle(fillColor: fillColor, borderColor: borderColor, textColor: textColor) 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /CombineOperators/OperatorViewModel.swift: -------------------------------------------------------------------------------- 1 | // 2 | // OperatorViewModel.swift 3 | // CombineOperators 4 | // 5 | // Created by Natascha Fadeeva on 19.11.22. 6 | // 7 | 8 | import Foundation 9 | 10 | struct OperatorViewModel { 11 | let p1: [String] 12 | let p2: [String]? 13 | let operatorDescription: String 14 | let output: [String] 15 | 16 | init(p1: [String], p2: [String]? = nil, op: String, out: [String]) { 17 | self.p1 = p1 18 | self.p2 = p2 19 | self.operatorDescription = op 20 | self.output = out 21 | } 22 | 23 | // MARK: Mapping Elements 24 | 25 | static var map: OperatorViewModel { 26 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".map { $0 * 2 }", out: ["2", "4", "6", "8"]) 27 | } 28 | 29 | static var replaceNil: OperatorViewModel { 30 | return OperatorViewModel(p1: ["1", "2", "-1", "4"], op: ".replaceNil(with: 5)", out: ["1", "2", "5", "4"]) 31 | } 32 | 33 | static var scan: OperatorViewModel { 34 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".scan(0) { $0 + $1 }", out: ["1", "3", "6", "10"]) 35 | } 36 | 37 | 38 | // MARK: Filter Elements 39 | 40 | static var filter: OperatorViewModel { 41 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".filter { $0 % 2 == 1 }", out: ["1", "0", "3", "0"]) 42 | } 43 | 44 | static var compactMap: OperatorViewModel { 45 | return OperatorViewModel(p1: ["1", "2", "nil", "4"], op: ".compactMap { $0 }", out: ["1", "2", "0", "4"]) 46 | } 47 | 48 | static var removeDuplicates: OperatorViewModel { 49 | return OperatorViewModel(p1: ["1", "3", "3", "1"], op: ".removeDuplicates()", out: ["1", "3", "0", "1"]) 50 | } 51 | 52 | // MARK: Reducing Elements 53 | 54 | static var collect: OperatorViewModel { 55 | return OperatorViewModel(p1: ["1", "2", "3", "|"], op: "collect(2)", out: ["0", "[1, 2]", "0", "[3]"]) 56 | } 57 | 58 | static var ignoreOutput: OperatorViewModel { 59 | return OperatorViewModel(p1: ["1", "2", "3", "-2"], op: "ignoreOutput()", out: ["0", "0", "0", "-2"]) 60 | } 61 | 62 | static var reduce: OperatorViewModel { 63 | return OperatorViewModel(p1: ["1", "2", "3", "|"], op: ".reduce(0) { $0 + $1 }", out: ["0", "0", "0", "6"]) 64 | } 65 | 66 | // MARK: Mathematical Operations 67 | 68 | static var count: OperatorViewModel { 69 | return OperatorViewModel(p1: ["1", "8", "6", "-2"], op: ".count()", out: ["0", "0", "0", "3"]) 70 | } 71 | 72 | static var max: OperatorViewModel { 73 | return OperatorViewModel(p1: ["1", "8", "3", "-2"], op: ".max()", out: ["0", "0", "0", "8"]) 74 | } 75 | 76 | static var mp1: OperatorViewModel { 77 | return OperatorViewModel(p1: ["1", "8", "3", "-2"], op: ".min()", out: ["0", "0", "0", "1"]) 78 | } 79 | 80 | // MARK: Matching Operators 81 | 82 | static var contains: OperatorViewModel { 83 | return OperatorViewModel(p1: ["2", "1", "7", "6"], op: ".contains { $0 > 4 }", out: ["0", "0", "true", "|"]) 84 | } 85 | 86 | static var allSatisfyFalse: OperatorViewModel { 87 | return OperatorViewModel(p1: ["6", "1", "7", "5"], op: ".allSatisfy { $0 > 4 }", out: ["0", "false", "|", "0"]) 88 | } 89 | 90 | static var allSatisfyTrue: OperatorViewModel { 91 | return OperatorViewModel(p1: ["7", "8", "6", "|"], op: ".allSatisfy { $0 > 4 }", out: ["0", "0", "0", "true"]) 92 | } 93 | 94 | // MARK: Sequence Operators 95 | 96 | static var dropFirst: OperatorViewModel { 97 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".dropFirst(2)", out: ["0", "0", "3", "4"]) 98 | } 99 | 100 | static var dropWhile: OperatorViewModel { 101 | return OperatorViewModel(p1: ["1", "2", "6", "1"], op: ".drop(while: { $0 < 3 })", out: ["0", "0", "6", "1"]) 102 | } 103 | 104 | static var append: OperatorViewModel { 105 | return OperatorViewModel(p1: ["1", "2", "|", "0"], op: ".append(6, 7)", out: ["1", "2", "6", "7"]) 106 | } 107 | 108 | static var prepend: OperatorViewModel { 109 | return OperatorViewModel(p1: ["1", "2", "0", "0"], op: ".prepend(3, 4)", out: ["3", "4", "1", "2"]) 110 | } 111 | 112 | static var prefix: OperatorViewModel { 113 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".prefix(2)", out: ["1", "2", "|", "0"]) 114 | } 115 | 116 | static var prefixWhile: OperatorViewModel { 117 | return OperatorViewModel(p1: ["1", "2", "3", "1"], op: ".prefix(while: { $0 < 3 })", out: ["1", "2", "|", "0"]) 118 | } 119 | 120 | // MARK: Selecting Operators 121 | 122 | 123 | static var first: OperatorViewModel { 124 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".first()", out: ["1", "|", "0", "0"]) 125 | } 126 | 127 | static var firstWhere: OperatorViewModel { 128 | return OperatorViewModel(p1: ["1", "2", "5", "8"], op: ".first { $0 > 3 }", out: ["0", "0", "5", "|"]) 129 | } 130 | 131 | static var last: OperatorViewModel { 132 | return OperatorViewModel(p1: ["1", "2", "3", "|"], op: ".last()", out: ["0", "0", "0", "3"]) 133 | } 134 | 135 | static var lastWhere: OperatorViewModel { 136 | return OperatorViewModel(p1: ["1", "2", "5", "|"], op: ".last { $0 < 3 }", out: ["0", "0", "0", "2"]) 137 | } 138 | 139 | static var outputAt: OperatorViewModel { 140 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".output(at: 2)", out: ["0", "0", "3", "|"]) 141 | } 142 | 143 | static var outputIn: OperatorViewModel { 144 | return OperatorViewModel(p1: ["1", "2", "3", "4"], op: ".output(p1: (1...2))", out: ["0", "2", "3", "|"]) 145 | } 146 | 147 | // MARK: Republishing Operators 148 | 149 | static var combineLatest: OperatorViewModel { 150 | return OperatorViewModel(p1: ["1", "0", "3", "0"], p2: ["0", "5", "0", "7"], op: "p1.combineLatest(p2)", out: ["0", "(1, 5)", "(5, 3)", "(3, 7)"]) 151 | } 152 | 153 | static var merge: OperatorViewModel { 154 | return OperatorViewModel(p1: ["1", "0", "3", "4"], p2: ["0", "5", "0", "0"], op: "p1.merge(p2)", out: ["1", "5", "3", "4"]) 155 | } 156 | 157 | static var zip: OperatorViewModel { 158 | return OperatorViewModel(p1: ["1", "0", "3", "0"], p2: ["0", "5", "0", "7"], op: "p1.zip(p2)", out: ["0", "(1, 5)", "0", "(3, 7)"]) 159 | } 160 | 161 | 162 | static var flatMap: OperatorViewModel { 163 | return OperatorViewModel(p1: ["[1, 2]", "0", "[3]", "[4]"], op: "flatMap { $0.publisher }", out: ["1", "2", "3", "4"]) 164 | } 165 | 166 | static var switchToLatest: OperatorViewModel { 167 | return OperatorViewModel(p1: ["1", "2", "0", "4"], p2: ["0", "0", "5", "0"], op: "switchToLatest()", out: ["1", "2", "5", "0"]) 168 | } 169 | 170 | } 171 | -------------------------------------------------------------------------------- /CombineOperators.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 56; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 21294A8729296D3700FC4E2D /* OperatorViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21294A8629296D3700FC4E2D /* OperatorViewModel.swift */; }; 11 | 21294A8929296D6600FC4E2D /* ValueStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21294A8829296D6600FC4E2D /* ValueStyle.swift */; }; 12 | 21294A8B29296D7800FC4E2D /* ArrowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21294A8A29296D7800FC4E2D /* ArrowView.swift */; }; 13 | 21294A8D29296DC900FC4E2D /* Color+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21294A8C29296DC900FC4E2D /* Color+Hex.swift */; }; 14 | 2149E73D29099F9100086934 /* CombineOperatorsApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2149E73C29099F9100086934 /* CombineOperatorsApp.swift */; }; 15 | 2149E73F29099F9100086934 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2149E73E29099F9100086934 /* ContentView.swift */; }; 16 | 2149E74129099F9200086934 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2149E74029099F9200086934 /* Assets.xcassets */; }; 17 | 2149E74429099F9200086934 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2149E74329099F9200086934 /* Preview Assets.xcassets */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 21294A8629296D3700FC4E2D /* OperatorViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperatorViewModel.swift; sourceTree = ""; }; 22 | 21294A8829296D6600FC4E2D /* ValueStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ValueStyle.swift; sourceTree = ""; }; 23 | 21294A8A29296D7800FC4E2D /* ArrowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArrowView.swift; sourceTree = ""; }; 24 | 21294A8C29296DC900FC4E2D /* Color+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Hex.swift"; sourceTree = ""; }; 25 | 2149E73929099F9100086934 /* CombineOperators.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CombineOperators.app; sourceTree = BUILT_PRODUCTS_DIR; }; 26 | 2149E73C29099F9100086934 /* CombineOperatorsApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CombineOperatorsApp.swift; sourceTree = ""; }; 27 | 2149E73E29099F9100086934 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; 28 | 2149E74029099F9200086934 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 29 | 2149E74329099F9200086934 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 30 | /* End PBXFileReference section */ 31 | 32 | /* Begin PBXFrameworksBuildPhase section */ 33 | 2149E73629099F9100086934 /* Frameworks */ = { 34 | isa = PBXFrameworksBuildPhase; 35 | buildActionMask = 2147483647; 36 | files = ( 37 | ); 38 | runOnlyForDeploymentPostprocessing = 0; 39 | }; 40 | /* End PBXFrameworksBuildPhase section */ 41 | 42 | /* Begin PBXGroup section */ 43 | 2149E73029099F9100086934 = { 44 | isa = PBXGroup; 45 | children = ( 46 | 2149E73B29099F9100086934 /* CombineOperators */, 47 | 2149E73A29099F9100086934 /* Products */, 48 | ); 49 | sourceTree = ""; 50 | }; 51 | 2149E73A29099F9100086934 /* Products */ = { 52 | isa = PBXGroup; 53 | children = ( 54 | 2149E73929099F9100086934 /* CombineOperators.app */, 55 | ); 56 | name = Products; 57 | sourceTree = ""; 58 | }; 59 | 2149E73B29099F9100086934 /* CombineOperators */ = { 60 | isa = PBXGroup; 61 | children = ( 62 | 2149E73C29099F9100086934 /* CombineOperatorsApp.swift */, 63 | 2149E73E29099F9100086934 /* ContentView.swift */, 64 | 21294A8629296D3700FC4E2D /* OperatorViewModel.swift */, 65 | 21294A8A29296D7800FC4E2D /* ArrowView.swift */, 66 | 21294A8829296D6600FC4E2D /* ValueStyle.swift */, 67 | 21294A8C29296DC900FC4E2D /* Color+Hex.swift */, 68 | 2149E74029099F9200086934 /* Assets.xcassets */, 69 | 2149E74229099F9200086934 /* Preview Content */, 70 | ); 71 | path = CombineOperators; 72 | sourceTree = ""; 73 | }; 74 | 2149E74229099F9200086934 /* Preview Content */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 2149E74329099F9200086934 /* Preview Assets.xcassets */, 78 | ); 79 | path = "Preview Content"; 80 | sourceTree = ""; 81 | }; 82 | /* End PBXGroup section */ 83 | 84 | /* Begin PBXNativeTarget section */ 85 | 2149E73829099F9100086934 /* CombineOperators */ = { 86 | isa = PBXNativeTarget; 87 | buildConfigurationList = 2149E74729099F9200086934 /* Build configuration list for PBXNativeTarget "CombineOperators" */; 88 | buildPhases = ( 89 | 2149E73529099F9100086934 /* Sources */, 90 | 2149E73629099F9100086934 /* Frameworks */, 91 | 2149E73729099F9100086934 /* Resources */, 92 | ); 93 | buildRules = ( 94 | ); 95 | dependencies = ( 96 | ); 97 | name = CombineOperators; 98 | productName = CombineOperators; 99 | productReference = 2149E73929099F9100086934 /* CombineOperators.app */; 100 | productType = "com.apple.product-type.application"; 101 | }; 102 | /* End PBXNativeTarget section */ 103 | 104 | /* Begin PBXProject section */ 105 | 2149E73129099F9100086934 /* Project object */ = { 106 | isa = PBXProject; 107 | attributes = { 108 | BuildIndependentTargetsInParallel = 1; 109 | LastSwiftUpdateCheck = 1400; 110 | LastUpgradeCheck = 1400; 111 | TargetAttributes = { 112 | 2149E73829099F9100086934 = { 113 | CreatedOnToolsVersion = 14.0; 114 | }; 115 | }; 116 | }; 117 | buildConfigurationList = 2149E73429099F9100086934 /* Build configuration list for PBXProject "CombineOperators" */; 118 | compatibilityVersion = "Xcode 14.0"; 119 | developmentRegion = en; 120 | hasScannedForEncodings = 0; 121 | knownRegions = ( 122 | en, 123 | Base, 124 | ); 125 | mainGroup = 2149E73029099F9100086934; 126 | productRefGroup = 2149E73A29099F9100086934 /* Products */; 127 | projectDirPath = ""; 128 | projectRoot = ""; 129 | targets = ( 130 | 2149E73829099F9100086934 /* CombineOperators */, 131 | ); 132 | }; 133 | /* End PBXProject section */ 134 | 135 | /* Begin PBXResourcesBuildPhase section */ 136 | 2149E73729099F9100086934 /* Resources */ = { 137 | isa = PBXResourcesBuildPhase; 138 | buildActionMask = 2147483647; 139 | files = ( 140 | 2149E74429099F9200086934 /* Preview Assets.xcassets in Resources */, 141 | 2149E74129099F9200086934 /* Assets.xcassets in Resources */, 142 | ); 143 | runOnlyForDeploymentPostprocessing = 0; 144 | }; 145 | /* End PBXResourcesBuildPhase section */ 146 | 147 | /* Begin PBXSourcesBuildPhase section */ 148 | 2149E73529099F9100086934 /* Sources */ = { 149 | isa = PBXSourcesBuildPhase; 150 | buildActionMask = 2147483647; 151 | files = ( 152 | 2149E73F29099F9100086934 /* ContentView.swift in Sources */, 153 | 21294A8929296D6600FC4E2D /* ValueStyle.swift in Sources */, 154 | 21294A8B29296D7800FC4E2D /* ArrowView.swift in Sources */, 155 | 21294A8729296D3700FC4E2D /* OperatorViewModel.swift in Sources */, 156 | 2149E73D29099F9100086934 /* CombineOperatorsApp.swift in Sources */, 157 | 21294A8D29296DC900FC4E2D /* Color+Hex.swift in Sources */, 158 | ); 159 | runOnlyForDeploymentPostprocessing = 0; 160 | }; 161 | /* End PBXSourcesBuildPhase section */ 162 | 163 | /* Begin XCBuildConfiguration section */ 164 | 2149E74529099F9200086934 /* Debug */ = { 165 | isa = XCBuildConfiguration; 166 | buildSettings = { 167 | ALWAYS_SEARCH_USER_PATHS = NO; 168 | CLANG_ANALYZER_NONNULL = YES; 169 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 170 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 171 | CLANG_ENABLE_MODULES = YES; 172 | CLANG_ENABLE_OBJC_ARC = YES; 173 | CLANG_ENABLE_OBJC_WEAK = YES; 174 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 175 | CLANG_WARN_BOOL_CONVERSION = YES; 176 | CLANG_WARN_COMMA = YES; 177 | CLANG_WARN_CONSTANT_CONVERSION = YES; 178 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 179 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 180 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 181 | CLANG_WARN_EMPTY_BODY = YES; 182 | CLANG_WARN_ENUM_CONVERSION = YES; 183 | CLANG_WARN_INFINITE_RECURSION = YES; 184 | CLANG_WARN_INT_CONVERSION = YES; 185 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 186 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 187 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 188 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 189 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 190 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 191 | CLANG_WARN_STRICT_PROTOTYPES = YES; 192 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 193 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 194 | CLANG_WARN_UNREACHABLE_CODE = YES; 195 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 196 | COPY_PHASE_STRIP = NO; 197 | DEBUG_INFORMATION_FORMAT = dwarf; 198 | ENABLE_STRICT_OBJC_MSGSEND = YES; 199 | ENABLE_TESTABILITY = YES; 200 | GCC_C_LANGUAGE_STANDARD = gnu11; 201 | GCC_DYNAMIC_NO_PIC = NO; 202 | GCC_NO_COMMON_BLOCKS = YES; 203 | GCC_OPTIMIZATION_LEVEL = 0; 204 | GCC_PREPROCESSOR_DEFINITIONS = ( 205 | "DEBUG=1", 206 | "$(inherited)", 207 | ); 208 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 209 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 210 | GCC_WARN_UNDECLARED_SELECTOR = YES; 211 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 212 | GCC_WARN_UNUSED_FUNCTION = YES; 213 | GCC_WARN_UNUSED_VARIABLE = YES; 214 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 215 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 216 | MTL_FAST_MATH = YES; 217 | ONLY_ACTIVE_ARCH = YES; 218 | SDKROOT = iphoneos; 219 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 220 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 221 | }; 222 | name = Debug; 223 | }; 224 | 2149E74629099F9200086934 /* Release */ = { 225 | isa = XCBuildConfiguration; 226 | buildSettings = { 227 | ALWAYS_SEARCH_USER_PATHS = NO; 228 | CLANG_ANALYZER_NONNULL = YES; 229 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 230 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; 231 | CLANG_ENABLE_MODULES = YES; 232 | CLANG_ENABLE_OBJC_ARC = YES; 233 | CLANG_ENABLE_OBJC_WEAK = YES; 234 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 235 | CLANG_WARN_BOOL_CONVERSION = YES; 236 | CLANG_WARN_COMMA = YES; 237 | CLANG_WARN_CONSTANT_CONVERSION = YES; 238 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 239 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 240 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 241 | CLANG_WARN_EMPTY_BODY = YES; 242 | CLANG_WARN_ENUM_CONVERSION = YES; 243 | CLANG_WARN_INFINITE_RECURSION = YES; 244 | CLANG_WARN_INT_CONVERSION = YES; 245 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 246 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 247 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 248 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 249 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 250 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 251 | CLANG_WARN_STRICT_PROTOTYPES = YES; 252 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 253 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 254 | CLANG_WARN_UNREACHABLE_CODE = YES; 255 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 256 | COPY_PHASE_STRIP = NO; 257 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 258 | ENABLE_NS_ASSERTIONS = NO; 259 | ENABLE_STRICT_OBJC_MSGSEND = YES; 260 | GCC_C_LANGUAGE_STANDARD = gnu11; 261 | GCC_NO_COMMON_BLOCKS = YES; 262 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 263 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 264 | GCC_WARN_UNDECLARED_SELECTOR = YES; 265 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 266 | GCC_WARN_UNUSED_FUNCTION = YES; 267 | GCC_WARN_UNUSED_VARIABLE = YES; 268 | IPHONEOS_DEPLOYMENT_TARGET = 16.0; 269 | MTL_ENABLE_DEBUG_INFO = NO; 270 | MTL_FAST_MATH = YES; 271 | SDKROOT = iphoneos; 272 | SWIFT_COMPILATION_MODE = wholemodule; 273 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 274 | VALIDATE_PRODUCT = YES; 275 | }; 276 | name = Release; 277 | }; 278 | 2149E74829099F9200086934 /* Debug */ = { 279 | isa = XCBuildConfiguration; 280 | buildSettings = { 281 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 282 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 283 | CODE_SIGN_STYLE = Automatic; 284 | CURRENT_PROJECT_VERSION = 1; 285 | DEVELOPMENT_ASSET_PATHS = "\"CombineOperators/Preview Content\""; 286 | DEVELOPMENT_TEAM = 8PJZYT7P7G; 287 | ENABLE_PREVIEWS = YES; 288 | GENERATE_INFOPLIST_FILE = YES; 289 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 290 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 291 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 292 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 293 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 294 | LD_RUNPATH_SEARCH_PATHS = ( 295 | "$(inherited)", 296 | "@executable_path/Frameworks", 297 | ); 298 | MARKETING_VERSION = 1.0; 299 | PRODUCT_BUNDLE_IDENTIFIER = com.tanaschita.CombineOperators; 300 | PRODUCT_NAME = "$(TARGET_NAME)"; 301 | SWIFT_EMIT_LOC_STRINGS = YES; 302 | SWIFT_VERSION = 5.0; 303 | TARGETED_DEVICE_FAMILY = "1,2"; 304 | }; 305 | name = Debug; 306 | }; 307 | 2149E74929099F9200086934 /* Release */ = { 308 | isa = XCBuildConfiguration; 309 | buildSettings = { 310 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 311 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; 312 | CODE_SIGN_STYLE = Automatic; 313 | CURRENT_PROJECT_VERSION = 1; 314 | DEVELOPMENT_ASSET_PATHS = "\"CombineOperators/Preview Content\""; 315 | DEVELOPMENT_TEAM = 8PJZYT7P7G; 316 | ENABLE_PREVIEWS = YES; 317 | GENERATE_INFOPLIST_FILE = YES; 318 | INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; 319 | INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; 320 | INFOPLIST_KEY_UILaunchScreen_Generation = YES; 321 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 322 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; 323 | LD_RUNPATH_SEARCH_PATHS = ( 324 | "$(inherited)", 325 | "@executable_path/Frameworks", 326 | ); 327 | MARKETING_VERSION = 1.0; 328 | PRODUCT_BUNDLE_IDENTIFIER = com.tanaschita.CombineOperators; 329 | PRODUCT_NAME = "$(TARGET_NAME)"; 330 | SWIFT_EMIT_LOC_STRINGS = YES; 331 | SWIFT_VERSION = 5.0; 332 | TARGETED_DEVICE_FAMILY = "1,2"; 333 | }; 334 | name = Release; 335 | }; 336 | /* End XCBuildConfiguration section */ 337 | 338 | /* Begin XCConfigurationList section */ 339 | 2149E73429099F9100086934 /* Build configuration list for PBXProject "CombineOperators" */ = { 340 | isa = XCConfigurationList; 341 | buildConfigurations = ( 342 | 2149E74529099F9200086934 /* Debug */, 343 | 2149E74629099F9200086934 /* Release */, 344 | ); 345 | defaultConfigurationIsVisible = 0; 346 | defaultConfigurationName = Release; 347 | }; 348 | 2149E74729099F9200086934 /* Build configuration list for PBXNativeTarget "CombineOperators" */ = { 349 | isa = XCConfigurationList; 350 | buildConfigurations = ( 351 | 2149E74829099F9200086934 /* Debug */, 352 | 2149E74929099F9200086934 /* Release */, 353 | ); 354 | defaultConfigurationIsVisible = 0; 355 | defaultConfigurationName = Release; 356 | }; 357 | /* End XCConfigurationList section */ 358 | }; 359 | rootObject = 2149E73129099F9100086934 /* Project object */; 360 | } 361 | --------------------------------------------------------------------------------