├── .gitattributes ├── .github └── workflows │ ├── dynamic-readme.yml │ └── dynamic-security.yml ├── .gitignore ├── CONTRIBUTING.md ├── Curry.podspec ├── Curry.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist └── xcshareddata │ └── xcschemes │ ├── Curry-Mac.xcscheme │ ├── Curry-iOS.xcscheme │ ├── Curry-tvOS.xcscheme │ └── Curry-watchOS.xcscheme ├── LICENSE ├── Package.swift ├── Package@swift-3.swift ├── Package@swift-4.2.swift ├── Package@swift-4.swift ├── Package@swift-5.0.swift ├── Package@swift-6.0.swift ├── README.md ├── Resources ├── Curry.h └── Info.plist ├── SECURITY.md ├── Source └── Curry.swift └── bin └── generate /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj merge=union 2 | -------------------------------------------------------------------------------- /.github/workflows/dynamic-readme.yml: -------------------------------------------------------------------------------- 1 | name: update-templates 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | update-templates: 11 | permissions: 12 | contents: write 13 | pull-requests: write 14 | pages: write 15 | uses: thoughtbot/templates/.github/workflows/dynamic-readme.yaml@main 16 | secrets: 17 | token: ${{ secrets.GITHUB_TOKEN }} 18 | -------------------------------------------------------------------------------- /.github/workflows/dynamic-security.yml: -------------------------------------------------------------------------------- 1 | name: update-security 2 | 3 | on: 4 | push: 5 | paths: 6 | - SECURITY.md 7 | branches: 8 | - main 9 | workflow_dispatch: 10 | 11 | jobs: 12 | update-security: 13 | permissions: 14 | contents: write 15 | pull-requests: write 16 | pages: write 17 | uses: thoughtbot/templates/.github/workflows/dynamic-security.yaml@main 18 | secrets: 19 | token: ${{ secrets.GITHUB_TOKEN }} 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OS X Finder 2 | .DS_Store 3 | 4 | # Xcode per-user config 5 | *.mode1 6 | *.mode1v3 7 | *.mode2v3 8 | *.perspective 9 | *.perspectivev3 10 | *.pbxuser 11 | xcuserdata 12 | *.xccheckout 13 | 14 | # Build products 15 | build/ 16 | *.o 17 | *.LinkFileList 18 | *.hmap 19 | 20 | # Automatic backup files 21 | *~.nib/ 22 | *.swp 23 | *~ 24 | *.dat 25 | *.dep 26 | 27 | # Cocoapods 28 | Pods 29 | 30 | # Carthage 31 | Carthage/Build 32 | 33 | # Swift Package Manager 34 | .build 35 | Packages 36 | 37 | # AppCode specific files 38 | .idea/ 39 | *.iml 40 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | We love pull requests from everyone. Follow the thoughtbot [code of conduct] 2 | while contributing. 3 | 4 | [code of conduct]: https://thoughtbot.com/open-source-code-of-conduct 5 | 6 | ## Contributing 7 | 8 | 1. Fork the repo. 9 | 2. Push to your fork and submit a pull request. 10 | 11 | At this point you're waiting on us. We like to at least comment on, if not 12 | accept, pull requests within three business days (and, typically, one business 13 | day). We may suggest some changes or improvements or alternatives. 14 | 15 | Some things that will increase the chance that your pull request is accepted, 16 | 17 | * Update the documentation, the surrounding one, examples elsewhere, guides, 18 | whatever is affected by your contribution 19 | * Follow the existing style of the project 20 | -------------------------------------------------------------------------------- /Curry.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |spec| 2 | spec.name = 'Curry' 3 | spec.version = '5.0.0' 4 | spec.summary = 'Function Currying for Swift' 5 | spec.homepage = 'https://github.com/thoughtbot/curry' 6 | spec.license = { :type => 'MIT', :file => 'LICENSE' } 7 | spec.author = { 8 | 'Gordon Fontenot' => 'gordon@fonten.io', 9 | 'thoughtbot' => nil, 10 | } 11 | spec.social_media_url = 'http://twitter.com/thoughtbot' 12 | spec.source = { :git => 'https://github.com/thoughtbot/curry.git', :tag => "v#{spec.version}" } 13 | spec.source_files = 'Source/**/*.{h,swift}' 14 | spec.requires_arc = true 15 | spec.swift_versions = [3.0, 4.0, 5.0] 16 | spec.ios.deployment_target = '8.0' 17 | spec.osx.deployment_target = '10.9' 18 | spec.watchos.deployment_target = '2.0' 19 | spec.tvos.deployment_target = '9.0' 20 | end 21 | -------------------------------------------------------------------------------- /Curry.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 804D01FB1BA3687E0005BBC4 /* Curry.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88630991B4EFD7600F53969 /* Curry.swift */; }; 11 | 804D01FC1BA368820005BBC4 /* Curry.h in Headers */ = {isa = PBXBuildFile; fileRef = F88630741B4EF9B200F53969 /* Curry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 12 | 80E0590F1BA9FAC10077CBA7 /* Curry.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88630991B4EFD7600F53969 /* Curry.swift */; }; 13 | 80E059101BA9FAC50077CBA7 /* Curry.h in Headers */ = {isa = PBXBuildFile; fileRef = F88630741B4EF9B200F53969 /* Curry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | F88630761B4EF9B200F53969 /* Curry.h in Headers */ = {isa = PBXBuildFile; fileRef = F88630741B4EF9B200F53969 /* Curry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | F88630961B4EFA2700F53969 /* Curry.h in Headers */ = {isa = PBXBuildFile; fileRef = F88630741B4EF9B200F53969 /* Curry.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16 | F886309A1B4EFD7600F53969 /* Curry.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88630991B4EFD7600F53969 /* Curry.swift */; }; 17 | F886309B1B4EFD7600F53969 /* Curry.swift in Sources */ = {isa = PBXBuildFile; fileRef = F88630991B4EFD7600F53969 /* Curry.swift */; }; 18 | /* End PBXBuildFile section */ 19 | 20 | /* Begin PBXFileReference section */ 21 | 804D01F31BA3684C0005BBC4 /* Curry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Curry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 22 | 80E059071BA9FA7F0077CBA7 /* Curry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Curry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | F88630561B4EF96200F53969 /* Curry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Curry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | F88630741B4EF9B200F53969 /* Curry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Curry.h; sourceTree = ""; }; 25 | F88630751B4EF9B200F53969 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 26 | F886307D1B4EF9F800F53969 /* Curry.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Curry.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 27 | F88630991B4EFD7600F53969 /* Curry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Curry.swift; sourceTree = ""; }; 28 | /* End PBXFileReference section */ 29 | 30 | /* Begin PBXFrameworksBuildPhase section */ 31 | 804D01EF1BA3684C0005BBC4 /* Frameworks */ = { 32 | isa = PBXFrameworksBuildPhase; 33 | buildActionMask = 2147483647; 34 | files = ( 35 | ); 36 | runOnlyForDeploymentPostprocessing = 0; 37 | }; 38 | 80E059031BA9FA7F0077CBA7 /* Frameworks */ = { 39 | isa = PBXFrameworksBuildPhase; 40 | buildActionMask = 2147483647; 41 | files = ( 42 | ); 43 | runOnlyForDeploymentPostprocessing = 0; 44 | }; 45 | F88630521B4EF96200F53969 /* Frameworks */ = { 46 | isa = PBXFrameworksBuildPhase; 47 | buildActionMask = 2147483647; 48 | files = ( 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | F88630791B4EF9F800F53969 /* Frameworks */ = { 53 | isa = PBXFrameworksBuildPhase; 54 | buildActionMask = 2147483647; 55 | files = ( 56 | ); 57 | runOnlyForDeploymentPostprocessing = 0; 58 | }; 59 | /* End PBXFrameworksBuildPhase section */ 60 | 61 | /* Begin PBXGroup section */ 62 | F886304C1B4EF96200F53969 = { 63 | isa = PBXGroup; 64 | children = ( 65 | F88630731B4EF9B200F53969 /* Resources */, 66 | F88630721B4EF9B200F53969 /* Source */, 67 | F88630571B4EF96200F53969 /* Products */, 68 | ); 69 | sourceTree = ""; 70 | }; 71 | F88630571B4EF96200F53969 /* Products */ = { 72 | isa = PBXGroup; 73 | children = ( 74 | F88630561B4EF96200F53969 /* Curry.framework */, 75 | F886307D1B4EF9F800F53969 /* Curry.framework */, 76 | 804D01F31BA3684C0005BBC4 /* Curry.framework */, 77 | 80E059071BA9FA7F0077CBA7 /* Curry.framework */, 78 | ); 79 | name = Products; 80 | sourceTree = ""; 81 | }; 82 | F88630721B4EF9B200F53969 /* Source */ = { 83 | isa = PBXGroup; 84 | children = ( 85 | F88630991B4EFD7600F53969 /* Curry.swift */, 86 | ); 87 | path = Source; 88 | sourceTree = ""; 89 | }; 90 | F88630731B4EF9B200F53969 /* Resources */ = { 91 | isa = PBXGroup; 92 | children = ( 93 | F88630741B4EF9B200F53969 /* Curry.h */, 94 | F88630751B4EF9B200F53969 /* Info.plist */, 95 | ); 96 | path = Resources; 97 | sourceTree = ""; 98 | }; 99 | /* End PBXGroup section */ 100 | 101 | /* Begin PBXHeadersBuildPhase section */ 102 | 804D01F01BA3684C0005BBC4 /* Headers */ = { 103 | isa = PBXHeadersBuildPhase; 104 | buildActionMask = 2147483647; 105 | files = ( 106 | 804D01FC1BA368820005BBC4 /* Curry.h in Headers */, 107 | ); 108 | runOnlyForDeploymentPostprocessing = 0; 109 | }; 110 | 80E059041BA9FA7F0077CBA7 /* Headers */ = { 111 | isa = PBXHeadersBuildPhase; 112 | buildActionMask = 2147483647; 113 | files = ( 114 | 80E059101BA9FAC50077CBA7 /* Curry.h in Headers */, 115 | ); 116 | runOnlyForDeploymentPostprocessing = 0; 117 | }; 118 | F88630531B4EF96200F53969 /* Headers */ = { 119 | isa = PBXHeadersBuildPhase; 120 | buildActionMask = 2147483647; 121 | files = ( 122 | F88630761B4EF9B200F53969 /* Curry.h in Headers */, 123 | ); 124 | runOnlyForDeploymentPostprocessing = 0; 125 | }; 126 | F886307A1B4EF9F800F53969 /* Headers */ = { 127 | isa = PBXHeadersBuildPhase; 128 | buildActionMask = 2147483647; 129 | files = ( 130 | F88630961B4EFA2700F53969 /* Curry.h in Headers */, 131 | ); 132 | runOnlyForDeploymentPostprocessing = 0; 133 | }; 134 | /* End PBXHeadersBuildPhase section */ 135 | 136 | /* Begin PBXNativeTarget section */ 137 | 804D01F21BA3684C0005BBC4 /* Curry-watchOS */ = { 138 | isa = PBXNativeTarget; 139 | buildConfigurationList = 804D01FA1BA3684C0005BBC4 /* Build configuration list for PBXNativeTarget "Curry-watchOS" */; 140 | buildPhases = ( 141 | 804D01EE1BA3684C0005BBC4 /* Sources */, 142 | 804D01EF1BA3684C0005BBC4 /* Frameworks */, 143 | 804D01F01BA3684C0005BBC4 /* Headers */, 144 | 804D01F11BA3684C0005BBC4 /* Resources */, 145 | ); 146 | buildRules = ( 147 | ); 148 | dependencies = ( 149 | ); 150 | name = "Curry-watchOS"; 151 | productName = "Curry-watchOS"; 152 | productReference = 804D01F31BA3684C0005BBC4 /* Curry.framework */; 153 | productType = "com.apple.product-type.framework"; 154 | }; 155 | 80E059061BA9FA7F0077CBA7 /* Curry-tvOS */ = { 156 | isa = PBXNativeTarget; 157 | buildConfigurationList = 80E0590E1BA9FA7F0077CBA7 /* Build configuration list for PBXNativeTarget "Curry-tvOS" */; 158 | buildPhases = ( 159 | 80E059021BA9FA7F0077CBA7 /* Sources */, 160 | 80E059031BA9FA7F0077CBA7 /* Frameworks */, 161 | 80E059041BA9FA7F0077CBA7 /* Headers */, 162 | 80E059051BA9FA7F0077CBA7 /* Resources */, 163 | ); 164 | buildRules = ( 165 | ); 166 | dependencies = ( 167 | ); 168 | name = "Curry-tvOS"; 169 | productName = "Curry-tvOS"; 170 | productReference = 80E059071BA9FA7F0077CBA7 /* Curry.framework */; 171 | productType = "com.apple.product-type.framework"; 172 | }; 173 | F88630551B4EF96200F53969 /* Curry-iOS */ = { 174 | isa = PBXNativeTarget; 175 | buildConfigurationList = F886306C1B4EF96200F53969 /* Build configuration list for PBXNativeTarget "Curry-iOS" */; 176 | buildPhases = ( 177 | F88630511B4EF96200F53969 /* Sources */, 178 | F88630521B4EF96200F53969 /* Frameworks */, 179 | F88630531B4EF96200F53969 /* Headers */, 180 | F88630541B4EF96200F53969 /* Resources */, 181 | ); 182 | buildRules = ( 183 | ); 184 | dependencies = ( 185 | ); 186 | name = "Curry-iOS"; 187 | productName = Curry; 188 | productReference = F88630561B4EF96200F53969 /* Curry.framework */; 189 | productType = "com.apple.product-type.framework"; 190 | }; 191 | F886307C1B4EF9F800F53969 /* Curry-Mac */ = { 192 | isa = PBXNativeTarget; 193 | buildConfigurationList = F88630901B4EF9F800F53969 /* Build configuration list for PBXNativeTarget "Curry-Mac" */; 194 | buildPhases = ( 195 | F88630781B4EF9F800F53969 /* Sources */, 196 | F88630791B4EF9F800F53969 /* Frameworks */, 197 | F886307A1B4EF9F800F53969 /* Headers */, 198 | F886307B1B4EF9F800F53969 /* Resources */, 199 | ); 200 | buildRules = ( 201 | ); 202 | dependencies = ( 203 | ); 204 | name = "Curry-Mac"; 205 | productName = "Curry-Mac"; 206 | productReference = F886307D1B4EF9F800F53969 /* Curry.framework */; 207 | productType = "com.apple.product-type.framework"; 208 | }; 209 | /* End PBXNativeTarget section */ 210 | 211 | /* Begin PBXProject section */ 212 | F886304D1B4EF96200F53969 /* Project object */ = { 213 | isa = PBXProject; 214 | attributes = { 215 | LastSwiftUpdateCheck = 0700; 216 | LastUpgradeCheck = 1140; 217 | ORGANIZATIONNAME = thoughtbot; 218 | TargetAttributes = { 219 | 804D01F21BA3684C0005BBC4 = { 220 | CreatedOnToolsVersion = 7.0; 221 | LastSwiftMigration = 0800; 222 | }; 223 | 80E059061BA9FA7F0077CBA7 = { 224 | CreatedOnToolsVersion = 7.1; 225 | LastSwiftMigration = 0800; 226 | }; 227 | F88630551B4EF96200F53969 = { 228 | CreatedOnToolsVersion = 6.4; 229 | LastSwiftMigration = 0800; 230 | }; 231 | F886307C1B4EF9F800F53969 = { 232 | CreatedOnToolsVersion = 6.4; 233 | LastSwiftMigration = 1140; 234 | }; 235 | }; 236 | }; 237 | buildConfigurationList = F88630501B4EF96200F53969 /* Build configuration list for PBXProject "Curry" */; 238 | compatibilityVersion = "Xcode 3.2"; 239 | developmentRegion = en; 240 | hasScannedForEncodings = 0; 241 | knownRegions = ( 242 | en, 243 | Base, 244 | ); 245 | mainGroup = F886304C1B4EF96200F53969; 246 | productRefGroup = F88630571B4EF96200F53969 /* Products */; 247 | projectDirPath = ""; 248 | projectRoot = ""; 249 | targets = ( 250 | F88630551B4EF96200F53969 /* Curry-iOS */, 251 | F886307C1B4EF9F800F53969 /* Curry-Mac */, 252 | 804D01F21BA3684C0005BBC4 /* Curry-watchOS */, 253 | 80E059061BA9FA7F0077CBA7 /* Curry-tvOS */, 254 | ); 255 | }; 256 | /* End PBXProject section */ 257 | 258 | /* Begin PBXResourcesBuildPhase section */ 259 | 804D01F11BA3684C0005BBC4 /* Resources */ = { 260 | isa = PBXResourcesBuildPhase; 261 | buildActionMask = 2147483647; 262 | files = ( 263 | ); 264 | runOnlyForDeploymentPostprocessing = 0; 265 | }; 266 | 80E059051BA9FA7F0077CBA7 /* Resources */ = { 267 | isa = PBXResourcesBuildPhase; 268 | buildActionMask = 2147483647; 269 | files = ( 270 | ); 271 | runOnlyForDeploymentPostprocessing = 0; 272 | }; 273 | F88630541B4EF96200F53969 /* Resources */ = { 274 | isa = PBXResourcesBuildPhase; 275 | buildActionMask = 2147483647; 276 | files = ( 277 | ); 278 | runOnlyForDeploymentPostprocessing = 0; 279 | }; 280 | F886307B1B4EF9F800F53969 /* Resources */ = { 281 | isa = PBXResourcesBuildPhase; 282 | buildActionMask = 2147483647; 283 | files = ( 284 | ); 285 | runOnlyForDeploymentPostprocessing = 0; 286 | }; 287 | /* End PBXResourcesBuildPhase section */ 288 | 289 | /* Begin PBXSourcesBuildPhase section */ 290 | 804D01EE1BA3684C0005BBC4 /* Sources */ = { 291 | isa = PBXSourcesBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | 804D01FB1BA3687E0005BBC4 /* Curry.swift in Sources */, 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | }; 298 | 80E059021BA9FA7F0077CBA7 /* Sources */ = { 299 | isa = PBXSourcesBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | 80E0590F1BA9FAC10077CBA7 /* Curry.swift in Sources */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | F88630511B4EF96200F53969 /* Sources */ = { 307 | isa = PBXSourcesBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | F886309A1B4EFD7600F53969 /* Curry.swift in Sources */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | F88630781B4EF9F800F53969 /* Sources */ = { 315 | isa = PBXSourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | F886309B1B4EFD7600F53969 /* Curry.swift in Sources */, 319 | ); 320 | runOnlyForDeploymentPostprocessing = 0; 321 | }; 322 | /* End PBXSourcesBuildPhase section */ 323 | 324 | /* Begin XCBuildConfiguration section */ 325 | 804D01F81BA3684C0005BBC4 /* Debug */ = { 326 | isa = XCBuildConfiguration; 327 | buildSettings = { 328 | APPLICATION_EXTENSION_API_ONLY = YES; 329 | CODE_SIGN_IDENTITY = ""; 330 | DEBUG_INFORMATION_FORMAT = dwarf; 331 | DEFINES_MODULE = YES; 332 | DYLIB_COMPATIBILITY_VERSION = 1; 333 | DYLIB_CURRENT_VERSION = 1; 334 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 335 | ENABLE_BITCODE = YES; 336 | ENABLE_TESTABILITY = YES; 337 | INFOPLIST_FILE = Resources/Info.plist; 338 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 339 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 340 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 341 | PRODUCT_NAME = Curry; 342 | SDKROOT = watchos; 343 | SKIP_INSTALL = YES; 344 | TARGETED_DEVICE_FAMILY = 4; 345 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 346 | }; 347 | name = Debug; 348 | }; 349 | 804D01F91BA3684C0005BBC4 /* Release */ = { 350 | isa = XCBuildConfiguration; 351 | buildSettings = { 352 | APPLICATION_EXTENSION_API_ONLY = YES; 353 | CODE_SIGN_IDENTITY = ""; 354 | DEFINES_MODULE = YES; 355 | DYLIB_COMPATIBILITY_VERSION = 1; 356 | DYLIB_CURRENT_VERSION = 1; 357 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 358 | ENABLE_BITCODE = YES; 359 | INFOPLIST_FILE = Resources/Info.plist; 360 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 361 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 362 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 363 | PRODUCT_NAME = Curry; 364 | SDKROOT = watchos; 365 | SKIP_INSTALL = YES; 366 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 367 | TARGETED_DEVICE_FAMILY = 4; 368 | WATCHOS_DEPLOYMENT_TARGET = 2.0; 369 | }; 370 | name = Release; 371 | }; 372 | 80E0590C1BA9FA7F0077CBA7 /* Debug */ = { 373 | isa = XCBuildConfiguration; 374 | buildSettings = { 375 | APPLICATION_EXTENSION_API_ONLY = YES; 376 | CODE_SIGN_IDENTITY = ""; 377 | DEBUG_INFORMATION_FORMAT = dwarf; 378 | DEFINES_MODULE = YES; 379 | DYLIB_COMPATIBILITY_VERSION = 1; 380 | DYLIB_CURRENT_VERSION = 1; 381 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 382 | ENABLE_BITCODE = YES; 383 | ENABLE_TESTABILITY = YES; 384 | INFOPLIST_FILE = Resources/Info.plist; 385 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 386 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 387 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 388 | PRODUCT_NAME = Curry; 389 | SDKROOT = appletvos; 390 | SKIP_INSTALL = YES; 391 | TARGETED_DEVICE_FAMILY = 3; 392 | TVOS_DEPLOYMENT_TARGET = 9.0; 393 | }; 394 | name = Debug; 395 | }; 396 | 80E0590D1BA9FA7F0077CBA7 /* Release */ = { 397 | isa = XCBuildConfiguration; 398 | buildSettings = { 399 | APPLICATION_EXTENSION_API_ONLY = YES; 400 | CODE_SIGN_IDENTITY = ""; 401 | DEFINES_MODULE = YES; 402 | DYLIB_COMPATIBILITY_VERSION = 1; 403 | DYLIB_CURRENT_VERSION = 1; 404 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 405 | ENABLE_BITCODE = YES; 406 | INFOPLIST_FILE = Resources/Info.plist; 407 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 408 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 409 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 410 | PRODUCT_NAME = Curry; 411 | SDKROOT = appletvos; 412 | SKIP_INSTALL = YES; 413 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 414 | TARGETED_DEVICE_FAMILY = 3; 415 | TVOS_DEPLOYMENT_TARGET = 9.0; 416 | }; 417 | name = Release; 418 | }; 419 | F886306A1B4EF96200F53969 /* Debug */ = { 420 | isa = XCBuildConfiguration; 421 | buildSettings = { 422 | ALWAYS_SEARCH_USER_PATHS = NO; 423 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 424 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 425 | CLANG_CXX_LIBRARY = "libc++"; 426 | CLANG_ENABLE_MODULES = YES; 427 | CLANG_ENABLE_OBJC_ARC = YES; 428 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 429 | CLANG_WARN_BOOL_CONVERSION = YES; 430 | CLANG_WARN_COMMA = YES; 431 | CLANG_WARN_CONSTANT_CONVERSION = YES; 432 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 433 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 434 | CLANG_WARN_EMPTY_BODY = YES; 435 | CLANG_WARN_ENUM_CONVERSION = YES; 436 | CLANG_WARN_INFINITE_RECURSION = YES; 437 | CLANG_WARN_INT_CONVERSION = YES; 438 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 439 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 440 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 441 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 442 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 443 | CLANG_WARN_STRICT_PROTOTYPES = YES; 444 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 445 | CLANG_WARN_UNREACHABLE_CODE = YES; 446 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 447 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 448 | COPY_PHASE_STRIP = NO; 449 | CURRENT_PROJECT_VERSION = 1; 450 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 451 | ENABLE_STRICT_OBJC_MSGSEND = YES; 452 | ENABLE_TESTABILITY = YES; 453 | GCC_C_LANGUAGE_STANDARD = gnu99; 454 | GCC_DYNAMIC_NO_PIC = NO; 455 | GCC_NO_COMMON_BLOCKS = YES; 456 | GCC_OPTIMIZATION_LEVEL = 0; 457 | GCC_PREPROCESSOR_DEFINITIONS = ( 458 | "DEBUG=1", 459 | "$(inherited)", 460 | ); 461 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 462 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 463 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 464 | GCC_WARN_UNDECLARED_SELECTOR = YES; 465 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 466 | GCC_WARN_UNUSED_FUNCTION = YES; 467 | GCC_WARN_UNUSED_VARIABLE = YES; 468 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 469 | MTL_ENABLE_DEBUG_INFO = YES; 470 | ONLY_ACTIVE_ARCH = YES; 471 | SDKROOT = iphoneos; 472 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 473 | SWIFT_VERSION = 5.0; 474 | TARGETED_DEVICE_FAMILY = "1,2"; 475 | VERSIONING_SYSTEM = "apple-generic"; 476 | VERSION_INFO_PREFIX = ""; 477 | }; 478 | name = Debug; 479 | }; 480 | F886306B1B4EF96200F53969 /* Release */ = { 481 | isa = XCBuildConfiguration; 482 | buildSettings = { 483 | ALWAYS_SEARCH_USER_PATHS = NO; 484 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 485 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 486 | CLANG_CXX_LIBRARY = "libc++"; 487 | CLANG_ENABLE_MODULES = YES; 488 | CLANG_ENABLE_OBJC_ARC = YES; 489 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 490 | CLANG_WARN_BOOL_CONVERSION = YES; 491 | CLANG_WARN_COMMA = YES; 492 | CLANG_WARN_CONSTANT_CONVERSION = YES; 493 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 494 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 495 | CLANG_WARN_EMPTY_BODY = YES; 496 | CLANG_WARN_ENUM_CONVERSION = YES; 497 | CLANG_WARN_INFINITE_RECURSION = YES; 498 | CLANG_WARN_INT_CONVERSION = YES; 499 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 500 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 501 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 502 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 503 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 504 | CLANG_WARN_STRICT_PROTOTYPES = YES; 505 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 506 | CLANG_WARN_UNREACHABLE_CODE = YES; 507 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 508 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 509 | COPY_PHASE_STRIP = NO; 510 | CURRENT_PROJECT_VERSION = 1; 511 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 512 | ENABLE_NS_ASSERTIONS = NO; 513 | ENABLE_STRICT_OBJC_MSGSEND = YES; 514 | GCC_C_LANGUAGE_STANDARD = gnu99; 515 | GCC_NO_COMMON_BLOCKS = YES; 516 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 517 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 518 | GCC_WARN_UNDECLARED_SELECTOR = YES; 519 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 520 | GCC_WARN_UNUSED_FUNCTION = YES; 521 | GCC_WARN_UNUSED_VARIABLE = YES; 522 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 523 | MTL_ENABLE_DEBUG_INFO = NO; 524 | SDKROOT = iphoneos; 525 | SWIFT_VERSION = 5.0; 526 | TARGETED_DEVICE_FAMILY = "1,2"; 527 | VALIDATE_PRODUCT = YES; 528 | VERSIONING_SYSTEM = "apple-generic"; 529 | VERSION_INFO_PREFIX = ""; 530 | }; 531 | name = Release; 532 | }; 533 | F886306D1B4EF96200F53969 /* Debug */ = { 534 | isa = XCBuildConfiguration; 535 | buildSettings = { 536 | APPLICATION_EXTENSION_API_ONLY = YES; 537 | CLANG_ENABLE_MODULES = YES; 538 | CODE_SIGN_IDENTITY = ""; 539 | DEFINES_MODULE = YES; 540 | DYLIB_COMPATIBILITY_VERSION = 1; 541 | DYLIB_CURRENT_VERSION = 1; 542 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 543 | INFOPLIST_FILE = Resources/Info.plist; 544 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 545 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 546 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 547 | PRODUCT_NAME = Curry; 548 | SKIP_INSTALL = YES; 549 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 550 | }; 551 | name = Debug; 552 | }; 553 | F886306E1B4EF96200F53969 /* Release */ = { 554 | isa = XCBuildConfiguration; 555 | buildSettings = { 556 | APPLICATION_EXTENSION_API_ONLY = YES; 557 | CLANG_ENABLE_MODULES = YES; 558 | CODE_SIGN_IDENTITY = ""; 559 | DEFINES_MODULE = YES; 560 | DYLIB_COMPATIBILITY_VERSION = 1; 561 | DYLIB_CURRENT_VERSION = 1; 562 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 563 | INFOPLIST_FILE = Resources/Info.plist; 564 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 565 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 566 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 567 | PRODUCT_NAME = Curry; 568 | SKIP_INSTALL = YES; 569 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 570 | }; 571 | name = Release; 572 | }; 573 | F88630911B4EF9F800F53969 /* Debug */ = { 574 | isa = XCBuildConfiguration; 575 | buildSettings = { 576 | APPLICATION_EXTENSION_API_ONLY = YES; 577 | COMBINE_HIDPI_IMAGES = YES; 578 | DEBUG_INFORMATION_FORMAT = dwarf; 579 | DEFINES_MODULE = YES; 580 | DYLIB_COMPATIBILITY_VERSION = 1; 581 | DYLIB_CURRENT_VERSION = 1; 582 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 583 | FRAMEWORK_VERSION = A; 584 | GCC_PREPROCESSOR_DEFINITIONS = ( 585 | "DEBUG=1", 586 | "$(inherited)", 587 | ); 588 | INFOPLIST_FILE = Resources/Info.plist; 589 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 590 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 591 | MACOSX_DEPLOYMENT_TARGET = 10.9; 592 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 593 | PRODUCT_NAME = Curry; 594 | SDKROOT = macosx; 595 | SKIP_INSTALL = YES; 596 | }; 597 | name = Debug; 598 | }; 599 | F88630921B4EF9F800F53969 /* Release */ = { 600 | isa = XCBuildConfiguration; 601 | buildSettings = { 602 | APPLICATION_EXTENSION_API_ONLY = YES; 603 | COMBINE_HIDPI_IMAGES = YES; 604 | DEFINES_MODULE = YES; 605 | DYLIB_COMPATIBILITY_VERSION = 1; 606 | DYLIB_CURRENT_VERSION = 1; 607 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 608 | FRAMEWORK_VERSION = A; 609 | INFOPLIST_FILE = Resources/Info.plist; 610 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 611 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 612 | MACOSX_DEPLOYMENT_TARGET = 10.9; 613 | PRODUCT_BUNDLE_IDENTIFIER = "com.thoughtbot.$(PRODUCT_NAME:rfc1034identifier)"; 614 | PRODUCT_NAME = Curry; 615 | SDKROOT = macosx; 616 | SKIP_INSTALL = YES; 617 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 618 | }; 619 | name = Release; 620 | }; 621 | /* End XCBuildConfiguration section */ 622 | 623 | /* Begin XCConfigurationList section */ 624 | 804D01FA1BA3684C0005BBC4 /* Build configuration list for PBXNativeTarget "Curry-watchOS" */ = { 625 | isa = XCConfigurationList; 626 | buildConfigurations = ( 627 | 804D01F81BA3684C0005BBC4 /* Debug */, 628 | 804D01F91BA3684C0005BBC4 /* Release */, 629 | ); 630 | defaultConfigurationIsVisible = 0; 631 | defaultConfigurationName = Release; 632 | }; 633 | 80E0590E1BA9FA7F0077CBA7 /* Build configuration list for PBXNativeTarget "Curry-tvOS" */ = { 634 | isa = XCConfigurationList; 635 | buildConfigurations = ( 636 | 80E0590C1BA9FA7F0077CBA7 /* Debug */, 637 | 80E0590D1BA9FA7F0077CBA7 /* Release */, 638 | ); 639 | defaultConfigurationIsVisible = 0; 640 | defaultConfigurationName = Release; 641 | }; 642 | F88630501B4EF96200F53969 /* Build configuration list for PBXProject "Curry" */ = { 643 | isa = XCConfigurationList; 644 | buildConfigurations = ( 645 | F886306A1B4EF96200F53969 /* Debug */, 646 | F886306B1B4EF96200F53969 /* Release */, 647 | ); 648 | defaultConfigurationIsVisible = 0; 649 | defaultConfigurationName = Release; 650 | }; 651 | F886306C1B4EF96200F53969 /* Build configuration list for PBXNativeTarget "Curry-iOS" */ = { 652 | isa = XCConfigurationList; 653 | buildConfigurations = ( 654 | F886306D1B4EF96200F53969 /* Debug */, 655 | F886306E1B4EF96200F53969 /* Release */, 656 | ); 657 | defaultConfigurationIsVisible = 0; 658 | defaultConfigurationName = Release; 659 | }; 660 | F88630901B4EF9F800F53969 /* Build configuration list for PBXNativeTarget "Curry-Mac" */ = { 661 | isa = XCConfigurationList; 662 | buildConfigurations = ( 663 | F88630911B4EF9F800F53969 /* Debug */, 664 | F88630921B4EF9F800F53969 /* Release */, 665 | ); 666 | defaultConfigurationIsVisible = 0; 667 | defaultConfigurationName = Release; 668 | }; 669 | /* End XCConfigurationList section */ 670 | }; 671 | rootObject = F886304D1B4EF96200F53969 /* Project object */; 672 | } 673 | -------------------------------------------------------------------------------- /Curry.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Curry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Curry.xcodeproj/xcshareddata/xcschemes/Curry-Mac.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Curry.xcodeproj/xcshareddata/xcschemes/Curry-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Curry.xcodeproj/xcshareddata/xcschemes/Curry-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /Curry.xcodeproj/xcshareddata/xcschemes/Curry-watchOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 43 | 44 | 50 | 51 | 52 | 53 | 59 | 60 | 66 | 67 | 68 | 69 | 71 | 72 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 thoughtbot, inc. 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.2 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry", 7 | products: [.library(name: "Curry", targets: ["Curry"])], 8 | dependencies: [], 9 | targets: [.target(name: "Curry", dependencies: [], path: "Source")] 10 | ) 11 | -------------------------------------------------------------------------------- /Package@swift-3.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:3.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry" 7 | ) 8 | -------------------------------------------------------------------------------- /Package@swift-4.2.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.2 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry", 7 | products: [.library(name: "Curry", targets: ["Curry"])], 8 | dependencies: [], 9 | targets: [.target(name: "Curry", dependencies: [], path: "Source")] 10 | ) 11 | -------------------------------------------------------------------------------- /Package@swift-4.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry", 7 | products: [.library(name: "Curry", targets: ["Curry"])], 8 | dependencies: [], 9 | targets: [.target(name: "Curry", dependencies: [], path: "Source")] 10 | ) 11 | -------------------------------------------------------------------------------- /Package@swift-5.0.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:5.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry", 7 | products: [.library(name: "Curry", targets: ["Curry"])], 8 | dependencies: [], 9 | targets: [.target(name: "Curry", dependencies: [], path: "Source")] 10 | ) 11 | -------------------------------------------------------------------------------- /Package@swift-6.0.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:6.0 2 | 3 | import PackageDescription 4 | 5 | let package = Package( 6 | name: "Curry", 7 | products: [.library(name: "Curry", targets: ["Curry"])], 8 | dependencies: [], 9 | targets: [.target(name: "Curry", dependencies: [], path: "Source")] 10 | ) 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 2 | # Curry # 3 | 4 | Swift implementations for function currying. 5 | 6 | For more info on function currying in Swift, please refer to [this blog 7 | post][tb-curry] 8 | 9 | [tb-curry]: https://robots.thoughtbot.com/introduction-to-function-currying-in-swift 10 | 11 | ## Installation ## 12 | 13 | ### [Swift Package Manager] ### 14 | 15 | [Swift Package Manager]: https://swift.org/package-manager/ 16 | 17 | Add this as a package dependency in Xcode: 18 | 19 | ``` 20 | https://github.com/thoughtbot/Curry 21 | ``` 22 | 23 | Or add it as a dependency in your Package.swift file: 24 | 25 | ```swift 26 | dependencies: [ 27 | .package(url: "https://github.com/thoughtbot/Curry", from: "5.0.0"), 28 | ] 29 | ``` 30 | 31 | ### [Carthage] ### 32 | 33 | [Carthage]: https://github.com/Carthage/Carthage 34 | 35 | ``` 36 | github "thoughtbot/Curry" 37 | ``` 38 | 39 | Then run `carthage update`. 40 | 41 | Follow the current instructions in [Carthage's README][carthage-installation] 42 | for up to date installation instructions. 43 | 44 | [carthage-installation]: https://github.com/Carthage/Carthage#adding-frameworks-to-an-application 45 | 46 | ### [CocoaPods] ### 47 | 48 | [CocoaPods]: http://cocoapods.org 49 | 50 | Add the following to your [Podfile](http://guides.cocoapods.org/using/the-podfile.html): 51 | 52 | ```ruby 53 | pod 'Curry' 54 | ``` 55 | 56 | You will also need to make sure you're opting into using frameworks: 57 | 58 | ```ruby 59 | use_frameworks! 60 | ``` 61 | 62 | Then run `pod install` with CocoaPods 0.36 or newer. 63 | 64 | Contributing 65 | ------------ 66 | 67 | See the [CONTRIBUTING] document. Thank you, [contributors]! 68 | 69 | [CONTRIBUTING]: CONTRIBUTING.md 70 | [contributors]: https://github.com/thoughtbot/Curry/graphs/contributors 71 | 72 | License 73 | ------- 74 | 75 | Curry is Copyright (c) 2015 thoughtbot, inc. It is free software, and may be 76 | redistributed under the terms specified in the [LICENSE] file. 77 | 78 | [LICENSE]: /LICENSE 79 | 80 | 81 | ## About thoughtbot 82 | 83 | ![thoughtbot](https://thoughtbot.com/thoughtbot-logo-for-readmes.svg) 84 | 85 | This repo is maintained and funded by thoughtbot, inc. 86 | The names and logos for thoughtbot are trademarks of thoughtbot, inc. 87 | 88 | We love open source software! 89 | See [our other projects][community]. 90 | We are [available for hire][hire]. 91 | 92 | [community]: https://thoughtbot.com/community?utm_source=github 93 | [hire]: https://thoughtbot.com/hire-us?utm_source=github 94 | 95 | 96 | 97 | -------------------------------------------------------------------------------- /Resources/Curry.h: -------------------------------------------------------------------------------- 1 | // 2 | // Curry.h 3 | // Curry 4 | // 5 | // Created by Gordon Fontenot on 7/9/15. 6 | // Copyright (c) 2015 thoughtbot. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Curry. 12 | FOUNDATION_EXPORT double CurryVersionNumber; 13 | 14 | //! Project version string for Curry. 15 | FOUNDATION_EXPORT const unsigned char CurryVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Resources/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 5.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | # Security Policy 3 | 4 | ## Supported Versions 5 | 6 | Only the the latest version of this project is supported at a given time. If 7 | you find a security issue with an older version, please try updating to the 8 | latest version first. 9 | 10 | If for some reason you can't update to the latest version, please let us know 11 | your reasons so that we can have a better understanding of your situation. 12 | 13 | ## Reporting a Vulnerability 14 | 15 | For security inquiries or vulnerability reports, visit 16 | . 17 | 18 | If you have any suggestions to improve this policy, visit . 19 | 20 | -------------------------------------------------------------------------------- /Source/Curry.swift: -------------------------------------------------------------------------------- 1 | public func curry(_ function: @escaping (A) -> B) -> (A) -> B { 2 | return { (a: A) -> B in function(a) } 3 | } 4 | 5 | public func curry(_ function: @escaping ((A, B)) -> C) -> (A) -> (B) -> C { 6 | return { (a: A) -> (B) -> C in { (b: B) -> C in function((a, b)) } } 7 | } 8 | 9 | public func curry(_ function: @escaping ((A, B, C)) -> D) -> (A) -> (B) -> (C) -> D { 10 | return { (a: A) -> (B) -> (C) -> D in { (b: B) -> (C) -> D in { (c: C) -> D in function((a, b, c)) } } } 11 | } 12 | 13 | public func curry(_ function: @escaping ((A, B, C, D)) -> E) -> (A) -> (B) -> (C) -> (D) -> E { 14 | return { (a: A) -> (B) -> (C) -> (D) -> E in { (b: B) -> (C) -> (D) -> E in { (c: C) -> (D) -> E in { (d: D) -> E in function((a, b, c, d)) } } } } 15 | } 16 | 17 | public func curry(_ function: @escaping ((A, B, C, D, E)) -> F) -> (A) -> (B) -> (C) -> (D) -> (E) -> F { 18 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> F in { (b: B) -> (C) -> (D) -> (E) -> F in { (c: C) -> (D) -> (E) -> F in { (d: D) -> (E) -> F in { (e: E) -> F in function((a, b, c, d, e)) } } } } } 19 | } 20 | 21 | public func curry(_ function: @escaping ((A, B, C, D, E, F)) -> G) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> G { 22 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> G in { (b: B) -> (C) -> (D) -> (E) -> (F) -> G in { (c: C) -> (D) -> (E) -> (F) -> G in { (d: D) -> (E) -> (F) -> G in { (e: E) -> (F) -> G in { (f: F) -> G in function((a, b, c, d, e, f)) } } } } } } 23 | } 24 | 25 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G)) -> H) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> H { 26 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> H in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> H in { (c: C) -> (D) -> (E) -> (F) -> (G) -> H in { (d: D) -> (E) -> (F) -> (G) -> H in { (e: E) -> (F) -> (G) -> H in { (f: F) -> (G) -> H in { (g: G) -> H in function((a, b, c, d, e, f, g)) } } } } } } } 27 | } 28 | 29 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H)) -> I) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> I { 30 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> I in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> I in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> I in { (d: D) -> (E) -> (F) -> (G) -> (H) -> I in { (e: E) -> (F) -> (G) -> (H) -> I in { (f: F) -> (G) -> (H) -> I in { (g: G) -> (H) -> I in { (h: H) -> I in function((a, b, c, d, e, f, g, h)) } } } } } } } } 31 | } 32 | 33 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I)) -> J) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> J { 34 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> J in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> J in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> J in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> J in { (e: E) -> (F) -> (G) -> (H) -> (I) -> J in { (f: F) -> (G) -> (H) -> (I) -> J in { (g: G) -> (H) -> (I) -> J in { (h: H) -> (I) -> J in { (i: I) -> J in function((a, b, c, d, e, f, g, h, i)) } } } } } } } } } 35 | } 36 | 37 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J)) -> K) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K { 38 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> K in { (f: F) -> (G) -> (H) -> (I) -> (J) -> K in { (g: G) -> (H) -> (I) -> (J) -> K in { (h: H) -> (I) -> (J) -> K in { (i: I) -> (J) -> K in { (j: J) -> K in function((a, b, c, d, e, f, g, h, i, j)) } } } } } } } } } } 39 | } 40 | 41 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K)) -> L) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L { 42 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> L in { (g: G) -> (H) -> (I) -> (J) -> (K) -> L in { (h: H) -> (I) -> (J) -> (K) -> L in { (i: I) -> (J) -> (K) -> L in { (j: J) -> (K) -> L in { (k: K) -> L in function((a, b, c, d, e, f, g, h, i, j, k)) } } } } } } } } } } } 43 | } 44 | 45 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L)) -> M) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M { 46 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> M in { (h: H) -> (I) -> (J) -> (K) -> (L) -> M in { (i: I) -> (J) -> (K) -> (L) -> M in { (j: J) -> (K) -> (L) -> M in { (k: K) -> (L) -> M in { (l: L) -> M in function((a, b, c, d, e, f, g, h, i, j, k, l)) } } } } } } } } } } } } 47 | } 48 | 49 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M)) -> N) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N { 50 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> N in { (i: I) -> (J) -> (K) -> (L) -> (M) -> N in { (j: J) -> (K) -> (L) -> (M) -> N in { (k: K) -> (L) -> (M) -> N in { (l: L) -> (M) -> N in { (m: M) -> N in function((a, b, c, d, e, f, g, h, i, j, k, l, m)) } } } } } } } } } } } } } 51 | } 52 | 53 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N)) -> O) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O { 54 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> O in { (j: J) -> (K) -> (L) -> (M) -> (N) -> O in { (k: K) -> (L) -> (M) -> (N) -> O in { (l: L) -> (M) -> (N) -> O in { (m: M) -> (N) -> O in { (n: N) -> O in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n)) } } } } } } } } } } } } } } 55 | } 56 | 57 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)) -> P) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P { 58 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> P in { (k: K) -> (L) -> (M) -> (N) -> (O) -> P in { (l: L) -> (M) -> (N) -> (O) -> P in { (m: M) -> (N) -> (O) -> P in { (n: N) -> (O) -> P in { (o: O) -> P in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)) } } } } } } } } } } } } } } } 59 | } 60 | 61 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)) -> Q) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q { 62 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (k: K) -> (L) -> (M) -> (N) -> (O) -> (P) -> Q in { (l: L) -> (M) -> (N) -> (O) -> (P) -> Q in { (m: M) -> (N) -> (O) -> (P) -> Q in { (n: N) -> (O) -> (P) -> Q in { (o: O) -> (P) -> Q in { (p: P) -> Q in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)) } } } } } } } } } } } } } } } } 63 | } 64 | 65 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)) -> R) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R { 66 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (k: K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (l: L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> R in { (m: M) -> (N) -> (O) -> (P) -> (Q) -> R in { (n: N) -> (O) -> (P) -> (Q) -> R in { (o: O) -> (P) -> (Q) -> R in { (p: P) -> (Q) -> R in { (q: Q) -> R in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q)) } } } } } } } } } } } } } } } } } 67 | } 68 | 69 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)) -> S) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S { 70 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (k: K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (l: L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (m: M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> S in { (n: N) -> (O) -> (P) -> (Q) -> (R) -> S in { (o: O) -> (P) -> (Q) -> (R) -> S in { (p: P) -> (Q) -> (R) -> S in { (q: Q) -> (R) -> S in { (r: R) -> S in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r)) } } } } } } } } } } } } } } } } } } 71 | } 72 | 73 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)) -> T) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T { 74 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (k: K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (l: L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (m: M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (n: N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> T in { (o: O) -> (P) -> (Q) -> (R) -> (S) -> T in { (p: P) -> (Q) -> (R) -> (S) -> T in { (q: Q) -> (R) -> (S) -> T in { (r: R) -> (S) -> T in { (s: S) -> T in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s)) } } } } } } } } } } } } } } } } } } } 75 | } 76 | 77 | public func curry(_ function: @escaping ((A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)) -> U) -> (A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U { 78 | return { (a: A) -> (B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (b: B) -> (C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (c: C) -> (D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (d: D) -> (E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (e: E) -> (F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (f: F) -> (G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (g: G) -> (H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (h: H) -> (I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (i: I) -> (J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (j: J) -> (K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (k: K) -> (L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (l: L) -> (M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (m: M) -> (N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (n: N) -> (O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (o: O) -> (P) -> (Q) -> (R) -> (S) -> (T) -> U in { (p: P) -> (Q) -> (R) -> (S) -> (T) -> U in { (q: Q) -> (R) -> (S) -> (T) -> U in { (r: R) -> (S) -> (T) -> U in { (s: S) -> (T) -> U in { (t: T) -> U in function((a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t)) } } } } } } } } } } } } } } } } } } } } 79 | } 80 | -------------------------------------------------------------------------------- /bin/generate: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env xcrun swift 2 | 3 | // Generates a Swift file with implementation of function currying for a ridiculously high number of arguments 4 | 5 | import Foundation 6 | 7 | let generics = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 8 | 9 | extension Array { 10 | subscript(safe index: Int) -> Element? { 11 | return indices ~= index ? self[index] : .none 12 | } 13 | } 14 | 15 | func genericType(for position: Int) -> String { 16 | let max = generics.count 17 | switch position { 18 | case _ where position < max: return generics[position % max] 19 | default: return generics[position / max - 1] + generics[position % max] 20 | } 21 | } 22 | 23 | func commaConcat(_ xs: [String]) -> String { 24 | return xs.joined(separator: ", ") 25 | } 26 | 27 | func extraParentheses(_ string: String, when condition: Bool) -> String { 28 | return condition ? "(\(string))" : string 29 | } 30 | 31 | func singleParameterFunctions(_ xs: [String]) -> String { 32 | guard let first = xs.first else { fatalError("Attempted to nest functions with no arguments") } 33 | guard xs.last != first else { return first } 34 | let remainder = Array(xs.dropFirst()) 35 | return "(\(first)) -> \(singleParameterFunctions(remainder))" 36 | } 37 | 38 | func curryDefinitionGenerator(arguments: Int) -> String { 39 | let genericParameters = (0.." 41 | 42 | let inputParameters = Array(genericParameters[0.. 1) // "(A, B, C)" 47 | let returnFunction = singleParameterFunctions(genericParameters) // " (A) -> (B) -> (C) -> D" 48 | let innerFunctionArguments = commaConcat(lowerFunctionArguments) // "a, b, c" 49 | 50 | let functionDefinition = "function(\(extraParentheses(innerFunctionArguments, when: lowerFunctionArguments.count > 1)))" // function(a, b, c) 51 | 52 | let implementation = lowerFunctionArguments.enumerated().reversed().reduce(functionDefinition) { accum, tuple in 53 | let (index, argument) = tuple 54 | let functionParameters = Array(genericParameters.suffix(from: index + 1)) 55 | return "{ (\(argument): \(inputParameters[index])) -> \(singleParameterFunctions(functionParameters)) in \(accum) }" 56 | } // "{ (a: A) -> (B) -> (C) -> D in { (b: B) -> (C) -> D in { (c: C) -> D in function(a, b, c) } } }" 57 | 58 | let curry = [ 59 | "public func curry\(genericTypeDefinition)(_ function: @escaping \(functionArguments) -> \(returnType)) -> \(returnFunction) {", 60 | " return \(implementation)", 61 | "}" 62 | ] 63 | 64 | return curry.joined(separator: "\n") 65 | } 66 | 67 | print("Generating 💬") 68 | 69 | let input = CommandLine.arguments[safe: 1] ?? "20" 70 | let limit = Int(input)! 71 | 72 | let start = 2 73 | let curries = (start...limit+1).map { curryDefinitionGenerator(arguments: $0) } 74 | 75 | let output = curries.joined(separator: "\n\n") + "\n" 76 | 77 | let outputPath = "Source/Curry.swift" 78 | let currentPath = URL(fileURLWithPath: FileManager.default.currentDirectoryPath) 79 | let currySwiftPath = currentPath.appendingPathComponent(outputPath) 80 | do { 81 | try output.write(to: currySwiftPath, atomically: true, encoding: String.Encoding.utf8) 82 | print("Done, curry functions files written at \(outputPath) 👍") 83 | } catch let e as NSError { 84 | print("An error occurred while saving the generated functions. Error: \(e)") 85 | } 86 | --------------------------------------------------------------------------------