├── .gitignore ├── .gitmodules ├── Cartfile ├── Cartfile.resolved ├── README.markdown ├── ReactiveMarbles.playground ├── Pages │ ├── Intro.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── combineLatest.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── concat.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── delay.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── filter.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── map.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── merge.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── sampleOn.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── skip.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── skipRepeats.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ ├── throttle.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline │ └── zip.xcplaygroundpage │ │ ├── Contents.swift │ │ └── timeline.xctimeline ├── contents.xcplayground └── playground.xcworkspace │ └── contents.xcworkspacedata ├── ReactiveMarbles.xcworkspace ├── contents.xcworkspacedata └── xcshareddata │ └── ReactiveMarbles.xcscmblueprint └── ReactiveMarbles ├── ReactiveMarbles.xcodeproj ├── project.pbxproj ├── project.xcworkspace │ └── contents.xcworkspacedata └── xcshareddata │ └── xcschemes │ └── ReactiveMarbles-OSX.xcscheme ├── ReactiveMarbles ├── Info.plist ├── Marbles.swift ├── NSTimerExtensions.swift ├── PlaygroundSupport.swift └── ReactiveMarbles.h └── XCPlayground.framework ├── Modules ├── Resources ├── Versions ├── A │ ├── Modules │ │ └── XCPlayground.swiftmodule │ │ │ ├── x86_64.swiftdoc │ │ │ └── x86_64.swiftmodule │ ├── Resources │ │ ├── Info.plist │ │ └── version.plist │ ├── XCPlayground │ └── _CodeSignature │ │ └── CodeResources └── Current └── XCPlayground /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | # 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | *.xccheckout 14 | *.moved-aside 15 | DerivedData 16 | *.hmap 17 | *.ipa 18 | *.xcuserstate 19 | .DS_Store 20 | 21 | #Carthage 22 | Carthage/Build 23 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Carthage/Checkouts/Result"] 2 | url = https://github.com/antitypical/Result.git 3 | path = Carthage/Checkouts/Result 4 | [submodule "Carthage/Checkouts/ReactiveCocoa"] 5 | path = Carthage/Checkouts/ReactiveCocoa 6 | url = https://github.com/ReactiveCocoa/ReactiveCocoa.git 7 | -------------------------------------------------------------------------------- /Cartfile: -------------------------------------------------------------------------------- 1 | github "ReactiveCocoa/ReactiveCocoa" "swift2" -------------------------------------------------------------------------------- /Cartfile.resolved: -------------------------------------------------------------------------------- 1 | github "antitypical/Result" "0.6.0-beta.3" 2 | github "ReactiveCocoa/ReactiveCocoa" "50af8fec8d1825d65c81f13efee3bbfb808a1242" 3 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | # ReactiveMarbles 2 | 3 | ## SpriteKit marble animations demonstrating [ReactiveCocoa](https://github.com/ReactiveCocoa/ReactiveCocoa/tree/swift2) methods. 4 | 5 | [Marbles](http://rxmarbles.com) are a time-honoured method of teaching RX concepts. This repository includes a Swift 2 Playground with animated marble views to allow experimentation with ReactiveCocoa 4 signals. 6 | 7 | ### Getting Started: 8 | 9 | 1. Clone or download the repo 10 | 2. Run `carthage checkout`, or `git submodule init && git submodule update` 11 | 3. Open the workspace (not the playground!) 12 | 4. Build the 'ReactiveMarbles-OSX' scheme 13 | 5. Open one of the Playground pages, show the Assistant Editor (and choose 'Timeline' if necessary). 14 | 15 | ### TODO/Known Issues: 16 | 17 | * No iOS framework - iOS Playgrounds are limited to only one live view, which makes these somewhat less useful. 18 | * The private XCPlayground.framework is bundled in the repository. This may not work with different versions of Xcode (currently built for Xcode 7) 19 | * The frame rate is pretty awful on slower Macs. 20 | 21 | I’m also **not** a seasoned ReactiveCocoa expert, and some of this code may be incorrect/misleading/non-idiomatic/crap. I’d gratefully appreciate corrections and/or PRs. There’s probably also more work that can be done in the Playground support to make it a bit more useful & natural to experiment with. 22 | 23 | Licensed under the terms of the [ISC license](http://opensource.org/licenses/ISC). -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/Intro.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | /*: 2 | # ReactiveCocoa examples 3 | */ 4 | 5 | 6 | import ReactiveCocoa 7 | import ReactiveMarbles 8 | 9 | 10 | let signal = marbleSignal() 11 | display("Marbles", signal, showValue: false) 12 | 13 | //: [Next](@next) 14 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/Intro.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 9 | 10 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/combineLatest.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `combineLatestWith()` 5 | //: Sends a tuple of the latest events from each `SignalProducer`. 6 | //: Operates on a `SignalProducer>` 7 | 8 | let source1 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 9 | let source2 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 10 | let combined = source1.combineLatestWith(source2) 11 | display("Source1", source1) 12 | display("Source2", source2) 13 | display("Combined", combined) 14 | 15 | //: [Previous](@previous) | [Next](@next) 16 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/combineLatest.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/concat.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `flatten(.Concat)` 5 | //: Returns a single event producer that sends all the events from the inner producers sequentially. 6 | //: (ie all events from the first producer, then all events from the second producer) 7 | 8 | let source1 = marbleSignalProducer(.Red, count: 5) 9 | let source2 = marbleSignalProducer(.Blue, count: 3) 10 | let aggregateProducer = SignalProducer, NoError>(values: [source1, source2]) 11 | let flattened = aggregateProducer.flatten(.Concat) 12 | display("Source1", source1) 13 | display("Source2", source2) 14 | display("Flattened", flattened) 15 | 16 | //: [Previous](@previous) | [Next](@next) 17 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/concat.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/delay.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `delay()` 5 | //: Delays all events by a given interval 6 | 7 | let source = marbleSignalProducer(marbleSignal(colour: .Random)) 8 | let delayed = source.delay(1.5.seconds, onScheduler:QueueScheduler.mainQueueScheduler) 9 | display("Source", source) 10 | display("Delayed", delayed) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/delay.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/filter.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `filter()` 5 | //: Filters events with a predicate 6 | 7 | let signal = marbleSignal(colour: .Random) 8 | let filtered = signal.filter { m in m.colour == .Purple } 9 | display("Signal", signal) 10 | display("Filtered", filtered) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/filter.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/map.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `map()` 5 | //: Transforms event values with a transform function 6 | 7 | let source = marbleSignalProducer(marbleSignal(colour: .Random)) 8 | let doubled = source.map { m in Marble(colour: m.colour, value: m.value * 2) } 9 | display("Source", source) 10 | display("Doubled", doubled) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/map.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/merge.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `flatten(.Merge)` 5 | //: Returns a single event producer that sends all the events from the inner producers when they occur. 6 | 7 | let source1 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 8 | let source2 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 9 | let aggregateProducer = SignalProducer, NoError>(values: [source1, source2]) 10 | let flattened = aggregateProducer.flatten(.Merge) 11 | display("Source1", source1) 12 | display("Source2", source2) 13 | display("Flattened", flattened) 14 | 15 | //: [Previous](@previous) | [Next](@next) 16 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/merge.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/sampleOn.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `sampleOn()` 5 | //: Sends the latest event from the source every time an event is sent on the trigger 6 | //: Useful for using timers to sample irregular data & turn it into a regular event. 7 | 8 | let source1 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 9 | let source2 = marbleSignalProducer(marbleSignal(colour: .Single(.Red))) 10 | let combined = source1.sampleOn(source2.map { _ in }) 11 | display("Source1", source1) 12 | display("Source2", source2, showValue: false) 13 | display("Combined", combined, showValue: true) 14 | 15 | //: [Previous](@previous) | [Next](@next) 16 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/sampleOn.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/skip.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `skip()` & `take()` 5 | //: Skips or (or takes) as specified number of events 6 | 7 | let signal = marbleSignalProducer(marbleSignal(colour: .Random)) 8 | let filtered = signal.skip(4) 9 | display("Signal", signal) 10 | display("Filtered", filtered) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/skip.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/skipRepeats.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `skipRepeats()` 5 | //: Removes (consecutive) duplicates based on equality test 6 | 7 | let source = marbleSignalProducer(marbleSignal(colour: .Random)) 8 | let filtered = source.skipRepeats { a, b in a.colour == b.colour } 9 | display("Source", source) 10 | display("Filtered", filtered) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/skipRepeats.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/throttle.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `throttle()` 5 | //: Limits events to only one in a given interval 6 | 7 | let source = marbleSignalProducer(marbleSignal(colour: .Random)) 8 | let throttled = source.throttle(3.seconds, onScheduler: QueueScheduler.mainQueueScheduler) 9 | display("Source", source) 10 | display("Throttled", throttled) 11 | 12 | //: [Previous](@previous) | [Next](@next) 13 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/throttle.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/zip.xcplaygroundpage/Contents.swift: -------------------------------------------------------------------------------- 1 | import ReactiveCocoa 2 | import ReactiveMarbles 3 | 4 | //: ## `zipWith()` 5 | //: Sends a tuple like `combineLatest`, but matches up events by sequence number 6 | 7 | let source1 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 8 | let source2 = marbleSignalProducer(irregularMarbleSignal(colour: .Random)) 9 | let zipped = source1.zipWith(source2) 10 | display("Source1", source1) 11 | display("Source2", source2) 12 | display("Zipped", zipped) 13 | 14 | //: [Previous](@previous) | [Next](@next) 15 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/Pages/zip.xcplaygroundpage/timeline.xctimeline: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/contents.xcplayground: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ReactiveMarbles.playground/playground.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ReactiveMarbles.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ReactiveMarbles.xcworkspace/xcshareddata/ReactiveMarbles.xcscmblueprint: -------------------------------------------------------------------------------- 1 | { 2 | "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { 3 | 4 | }, 5 | "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { 6 | "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" : 0, 7 | "956D2B21DD155C49504BB67697A67F7C5351A353" : 0 8 | }, 9 | "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "7AF4EBDB-6E09-4543-8DDB-09D3DD5E9B20", 10 | "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { 11 | "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" : "ReactiveMarbles\/Carthage\/Checkouts\/ReactiveCocoa\/", 12 | "956D2B21DD155C49504BB67697A67F7C5351A353" : "ReactiveMarbles\/Carthage\/Checkouts\/Result\/" 13 | }, 14 | "DVTSourceControlWorkspaceBlueprintNameKey" : "ReactiveMarbles", 15 | "DVTSourceControlWorkspaceBlueprintVersion" : 204, 16 | "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "ReactiveMarbles.xcworkspace", 17 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ 18 | { 19 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/ReactiveCocoa\/ReactiveCocoa.git", 20 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 21 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "51B210D0D41486D3ADD6940D57E4480BBD4DE4C5" 22 | }, 23 | { 24 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/antitypical\/Result.git", 25 | "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", 26 | "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "956D2B21DD155C49504BB67697A67F7C5351A353" 27 | } 28 | ] 29 | } -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 225197971BB2D48C00DB634F /* XCPlayground.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 225197961BB2D48A00DB634F /* XCPlayground.framework */; settings = {ASSET_TAGS = (); }; }; 11 | 2279ADC31BA91B3C00DA39CB /* PlaygroundSupport.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2279ADC21BA91B3C00DA39CB /* PlaygroundSupport.swift */; settings = {ASSET_TAGS = (); }; }; 12 | 22D4B28E1BA65F50000825FF /* Marbles.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D4B2711BA3C030000825FF /* Marbles.swift */; }; 13 | 22D4B2921BA65FAE000825FF /* ReactiveMarbles.h in Headers */ = {isa = PBXBuildFile; fileRef = 22D4B2901BA65FAE000825FF /* ReactiveMarbles.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | 22D4B2951BA673FE000825FF /* NSTimerExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22D4B2931BA673FE000825FF /* NSTimerExtensions.swift */; settings = {ASSET_TAGS = (); }; }; 15 | /* End PBXBuildFile section */ 16 | 17 | /* Begin PBXContainerItemProxy section */ 18 | 225197A11BB2D80F00DB634F /* PBXContainerItemProxy */ = { 19 | isa = PBXContainerItemProxy; 20 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 21 | proxyType = 2; 22 | remoteGlobalIDString = D04725EA19E49ED7006002AA; 23 | remoteInfo = "ReactiveCocoa-Mac"; 24 | }; 25 | 225197A31BB2D80F00DB634F /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 28 | proxyType = 2; 29 | remoteGlobalIDString = D04725F519E49ED7006002AA; 30 | remoteInfo = "ReactiveCocoa-MacTests"; 31 | }; 32 | 225197A51BB2D80F00DB634F /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 35 | proxyType = 2; 36 | remoteGlobalIDString = D047260C19E49F82006002AA; 37 | remoteInfo = "ReactiveCocoa-iOS"; 38 | }; 39 | 225197A71BB2D80F00DB634F /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 42 | proxyType = 2; 43 | remoteGlobalIDString = D047261619E49F82006002AA; 44 | remoteInfo = "ReactiveCocoa-iOSTests"; 45 | }; 46 | 225197A91BB2D80F00DB634F /* PBXContainerItemProxy */ = { 47 | isa = PBXContainerItemProxy; 48 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 49 | proxyType = 2; 50 | remoteGlobalIDString = A9B315541B3940610001CB9C; 51 | remoteInfo = "ReactiveCocoa-watchOS"; 52 | }; 53 | 225197AB1BB2D80F00DB634F /* PBXContainerItemProxy */ = { 54 | isa = PBXContainerItemProxy; 55 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 56 | proxyType = 2; 57 | remoteGlobalIDString = 57A4D2411BA13D7A00F7D4B1; 58 | remoteInfo = "ReactiveCocoa-tvOS"; 59 | }; 60 | 225197AD1BB2D84300DB634F /* PBXContainerItemProxy */ = { 61 | isa = PBXContainerItemProxy; 62 | containerPortal = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 63 | proxyType = 1; 64 | remoteGlobalIDString = D04725E919E49ED7006002AA; 65 | remoteInfo = "ReactiveCocoa-Mac"; 66 | }; 67 | 225197BA1BB2D89E00DB634F /* PBXContainerItemProxy */ = { 68 | isa = PBXContainerItemProxy; 69 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 70 | proxyType = 2; 71 | remoteGlobalIDString = D45480571A9572F5009D7229; 72 | remoteInfo = "Result-Mac"; 73 | }; 74 | 225197BC1BB2D89E00DB634F /* PBXContainerItemProxy */ = { 75 | isa = PBXContainerItemProxy; 76 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 77 | proxyType = 2; 78 | remoteGlobalIDString = D45480671A9572F5009D7229; 79 | remoteInfo = "Result-MacTests"; 80 | }; 81 | 225197BE1BB2D89E00DB634F /* PBXContainerItemProxy */ = { 82 | isa = PBXContainerItemProxy; 83 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 84 | proxyType = 2; 85 | remoteGlobalIDString = D454807D1A957361009D7229; 86 | remoteInfo = "Result-iOS"; 87 | }; 88 | 225197C01BB2D89E00DB634F /* PBXContainerItemProxy */ = { 89 | isa = PBXContainerItemProxy; 90 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 91 | proxyType = 2; 92 | remoteGlobalIDString = D45480871A957362009D7229; 93 | remoteInfo = "Result-iOSTests"; 94 | }; 95 | 225197C21BB2D89E00DB634F /* PBXContainerItemProxy */ = { 96 | isa = PBXContainerItemProxy; 97 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 98 | proxyType = 2; 99 | remoteGlobalIDString = 57FCDE471BA280DC00130C48; 100 | remoteInfo = "Result-tvOS"; 101 | }; 102 | 225197C41BB2D89E00DB634F /* PBXContainerItemProxy */ = { 103 | isa = PBXContainerItemProxy; 104 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 105 | proxyType = 2; 106 | remoteGlobalIDString = 57FCDE541BA280E000130C48; 107 | remoteInfo = "Result-tvOSTests"; 108 | }; 109 | 225197C61BB2D89E00DB634F /* PBXContainerItemProxy */ = { 110 | isa = PBXContainerItemProxy; 111 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 112 | proxyType = 2; 113 | remoteGlobalIDString = D03579A31B2B788F005D26AE; 114 | remoteInfo = "Result-watchOS"; 115 | }; 116 | 225197C81BB2D89E00DB634F /* PBXContainerItemProxy */ = { 117 | isa = PBXContainerItemProxy; 118 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 119 | proxyType = 2; 120 | remoteGlobalIDString = D03579B01B2B78A1005D26AE; 121 | remoteInfo = "Result-watchOSTests"; 122 | }; 123 | 225197CA1BB2D8A600DB634F /* PBXContainerItemProxy */ = { 124 | isa = PBXContainerItemProxy; 125 | containerPortal = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 126 | proxyType = 1; 127 | remoteGlobalIDString = D45480561A9572F5009D7229; 128 | remoteInfo = "Result-Mac"; 129 | }; 130 | /* End PBXContainerItemProxy section */ 131 | 132 | /* Begin PBXFileReference section */ 133 | 225197961BB2D48A00DB634F /* XCPlayground.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = XCPlayground.framework; sourceTree = ""; }; 134 | 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = ReactiveCocoa.xcodeproj; path = ../Carthage/Checkouts/ReactiveCocoa/ReactiveCocoa.xcodeproj; sourceTree = ""; }; 135 | 225197AF1BB2D89E00DB634F /* Result.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Result.xcodeproj; path = ../Carthage/Checkouts/Result/Result.xcodeproj; sourceTree = ""; }; 136 | 2279ADC21BA91B3C00DA39CB /* PlaygroundSupport.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PlaygroundSupport.swift; sourceTree = ""; }; 137 | 22D4B2711BA3C030000825FF /* Marbles.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Marbles.swift; sourceTree = ""; }; 138 | 22D4B2861BA65F43000825FF /* ReactiveMarbles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ReactiveMarbles.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 139 | 22D4B28F1BA65FAE000825FF /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 140 | 22D4B2901BA65FAE000825FF /* ReactiveMarbles.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReactiveMarbles.h; sourceTree = ""; }; 141 | 22D4B2931BA673FE000825FF /* NSTimerExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NSTimerExtensions.swift; sourceTree = ""; }; 142 | /* End PBXFileReference section */ 143 | 144 | /* Begin PBXFrameworksBuildPhase section */ 145 | 22D4B2821BA65F43000825FF /* Frameworks */ = { 146 | isa = PBXFrameworksBuildPhase; 147 | buildActionMask = 2147483647; 148 | files = ( 149 | 225197971BB2D48C00DB634F /* XCPlayground.framework in Frameworks */, 150 | ); 151 | runOnlyForDeploymentPostprocessing = 0; 152 | }; 153 | /* End PBXFrameworksBuildPhase section */ 154 | 155 | /* Begin PBXGroup section */ 156 | 225197991BB2D80F00DB634F /* Products */ = { 157 | isa = PBXGroup; 158 | children = ( 159 | 225197A21BB2D80F00DB634F /* ReactiveCocoa.framework */, 160 | 225197A41BB2D80F00DB634F /* ReactiveCocoa-MacTests.xctest */, 161 | 225197A61BB2D80F00DB634F /* ReactiveCocoa.framework */, 162 | 225197A81BB2D80F00DB634F /* ReactiveCocoa-iOSTests.xctest */, 163 | 225197AA1BB2D80F00DB634F /* ReactiveCocoa.framework */, 164 | 225197AC1BB2D80F00DB634F /* ReactiveCocoa.framework */, 165 | ); 166 | name = Products; 167 | sourceTree = ""; 168 | }; 169 | 225197B01BB2D89E00DB634F /* Products */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | 225197BB1BB2D89E00DB634F /* Result.framework */, 173 | 225197BD1BB2D89E00DB634F /* Result-MacTests.xctest */, 174 | 225197BF1BB2D89E00DB634F /* Result.framework */, 175 | 225197C11BB2D89E00DB634F /* Result-iOSTests.xctest */, 176 | 225197C31BB2D89E00DB634F /* Result.framework */, 177 | 225197C51BB2D89E00DB634F /* Result-tvOSTests.xctest */, 178 | 225197C71BB2D89E00DB634F /* Result.framework */, 179 | 225197C91BB2D89E00DB634F /* Result-watchOSTests.xctest */, 180 | ); 181 | name = Products; 182 | sourceTree = ""; 183 | }; 184 | 22D4B25A1BA3BFC0000825FF = { 185 | isa = PBXGroup; 186 | children = ( 187 | 225197AF1BB2D89E00DB634F /* Result.xcodeproj */, 188 | 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */, 189 | 225197961BB2D48A00DB634F /* XCPlayground.framework */, 190 | 22D4B2661BA3BFC0000825FF /* ReactiveMarbles */, 191 | 22D4B2651BA3BFC0000825FF /* Products */, 192 | ); 193 | sourceTree = ""; 194 | }; 195 | 22D4B2651BA3BFC0000825FF /* Products */ = { 196 | isa = PBXGroup; 197 | children = ( 198 | 22D4B2861BA65F43000825FF /* ReactiveMarbles.framework */, 199 | ); 200 | name = Products; 201 | sourceTree = ""; 202 | }; 203 | 22D4B2661BA3BFC0000825FF /* ReactiveMarbles */ = { 204 | isa = PBXGroup; 205 | children = ( 206 | 22D4B28F1BA65FAE000825FF /* Info.plist */, 207 | 22D4B2901BA65FAE000825FF /* ReactiveMarbles.h */, 208 | 22D4B2711BA3C030000825FF /* Marbles.swift */, 209 | 22D4B2931BA673FE000825FF /* NSTimerExtensions.swift */, 210 | 2279ADC21BA91B3C00DA39CB /* PlaygroundSupport.swift */, 211 | ); 212 | path = ReactiveMarbles; 213 | sourceTree = ""; 214 | }; 215 | /* End PBXGroup section */ 216 | 217 | /* Begin PBXHeadersBuildPhase section */ 218 | 22D4B2831BA65F43000825FF /* Headers */ = { 219 | isa = PBXHeadersBuildPhase; 220 | buildActionMask = 2147483647; 221 | files = ( 222 | 22D4B2921BA65FAE000825FF /* ReactiveMarbles.h in Headers */, 223 | ); 224 | runOnlyForDeploymentPostprocessing = 0; 225 | }; 226 | /* End PBXHeadersBuildPhase section */ 227 | 228 | /* Begin PBXNativeTarget section */ 229 | 22D4B2851BA65F43000825FF /* ReactiveMarbles-OSX */ = { 230 | isa = PBXNativeTarget; 231 | buildConfigurationList = 22D4B28B1BA65F43000825FF /* Build configuration list for PBXNativeTarget "ReactiveMarbles-OSX" */; 232 | buildPhases = ( 233 | 22D4B2811BA65F43000825FF /* Sources */, 234 | 22D4B2821BA65F43000825FF /* Frameworks */, 235 | 22D4B2831BA65F43000825FF /* Headers */, 236 | 22D4B2841BA65F43000825FF /* Resources */, 237 | ); 238 | buildRules = ( 239 | ); 240 | dependencies = ( 241 | 225197CB1BB2D8A600DB634F /* PBXTargetDependency */, 242 | 225197AE1BB2D84300DB634F /* PBXTargetDependency */, 243 | ); 244 | name = "ReactiveMarbles-OSX"; 245 | productName = ReactiveMarbles; 246 | productReference = 22D4B2861BA65F43000825FF /* ReactiveMarbles.framework */; 247 | productType = "com.apple.product-type.framework"; 248 | }; 249 | /* End PBXNativeTarget section */ 250 | 251 | /* Begin PBXProject section */ 252 | 22D4B25B1BA3BFC0000825FF /* Project object */ = { 253 | isa = PBXProject; 254 | attributes = { 255 | LastSwiftUpdateCheck = 0700; 256 | LastUpgradeCheck = 0700; 257 | ORGANIZATIONNAME = "codesplice pty ltd"; 258 | TargetAttributes = { 259 | 22D4B2851BA65F43000825FF = { 260 | CreatedOnToolsVersion = 7.0; 261 | }; 262 | }; 263 | }; 264 | buildConfigurationList = 22D4B25E1BA3BFC0000825FF /* Build configuration list for PBXProject "ReactiveMarbles" */; 265 | compatibilityVersion = "Xcode 3.2"; 266 | developmentRegion = English; 267 | hasScannedForEncodings = 0; 268 | knownRegions = ( 269 | en, 270 | ); 271 | mainGroup = 22D4B25A1BA3BFC0000825FF; 272 | productRefGroup = 22D4B2651BA3BFC0000825FF /* Products */; 273 | projectDirPath = ""; 274 | projectReferences = ( 275 | { 276 | ProductGroup = 225197991BB2D80F00DB634F /* Products */; 277 | ProjectRef = 225197981BB2D80F00DB634F /* ReactiveCocoa.xcodeproj */; 278 | }, 279 | { 280 | ProductGroup = 225197B01BB2D89E00DB634F /* Products */; 281 | ProjectRef = 225197AF1BB2D89E00DB634F /* Result.xcodeproj */; 282 | }, 283 | ); 284 | projectRoot = ""; 285 | targets = ( 286 | 22D4B2851BA65F43000825FF /* ReactiveMarbles-OSX */, 287 | ); 288 | }; 289 | /* End PBXProject section */ 290 | 291 | /* Begin PBXReferenceProxy section */ 292 | 225197A21BB2D80F00DB634F /* ReactiveCocoa.framework */ = { 293 | isa = PBXReferenceProxy; 294 | fileType = wrapper.framework; 295 | path = ReactiveCocoa.framework; 296 | remoteRef = 225197A11BB2D80F00DB634F /* PBXContainerItemProxy */; 297 | sourceTree = BUILT_PRODUCTS_DIR; 298 | }; 299 | 225197A41BB2D80F00DB634F /* ReactiveCocoa-MacTests.xctest */ = { 300 | isa = PBXReferenceProxy; 301 | fileType = wrapper.cfbundle; 302 | path = "ReactiveCocoa-MacTests.xctest"; 303 | remoteRef = 225197A31BB2D80F00DB634F /* PBXContainerItemProxy */; 304 | sourceTree = BUILT_PRODUCTS_DIR; 305 | }; 306 | 225197A61BB2D80F00DB634F /* ReactiveCocoa.framework */ = { 307 | isa = PBXReferenceProxy; 308 | fileType = wrapper.framework; 309 | path = ReactiveCocoa.framework; 310 | remoteRef = 225197A51BB2D80F00DB634F /* PBXContainerItemProxy */; 311 | sourceTree = BUILT_PRODUCTS_DIR; 312 | }; 313 | 225197A81BB2D80F00DB634F /* ReactiveCocoa-iOSTests.xctest */ = { 314 | isa = PBXReferenceProxy; 315 | fileType = wrapper.cfbundle; 316 | path = "ReactiveCocoa-iOSTests.xctest"; 317 | remoteRef = 225197A71BB2D80F00DB634F /* PBXContainerItemProxy */; 318 | sourceTree = BUILT_PRODUCTS_DIR; 319 | }; 320 | 225197AA1BB2D80F00DB634F /* ReactiveCocoa.framework */ = { 321 | isa = PBXReferenceProxy; 322 | fileType = wrapper.framework; 323 | path = ReactiveCocoa.framework; 324 | remoteRef = 225197A91BB2D80F00DB634F /* PBXContainerItemProxy */; 325 | sourceTree = BUILT_PRODUCTS_DIR; 326 | }; 327 | 225197AC1BB2D80F00DB634F /* ReactiveCocoa.framework */ = { 328 | isa = PBXReferenceProxy; 329 | fileType = wrapper.framework; 330 | path = ReactiveCocoa.framework; 331 | remoteRef = 225197AB1BB2D80F00DB634F /* PBXContainerItemProxy */; 332 | sourceTree = BUILT_PRODUCTS_DIR; 333 | }; 334 | 225197BB1BB2D89E00DB634F /* Result.framework */ = { 335 | isa = PBXReferenceProxy; 336 | fileType = wrapper.framework; 337 | path = Result.framework; 338 | remoteRef = 225197BA1BB2D89E00DB634F /* PBXContainerItemProxy */; 339 | sourceTree = BUILT_PRODUCTS_DIR; 340 | }; 341 | 225197BD1BB2D89E00DB634F /* Result-MacTests.xctest */ = { 342 | isa = PBXReferenceProxy; 343 | fileType = wrapper.cfbundle; 344 | path = "Result-MacTests.xctest"; 345 | remoteRef = 225197BC1BB2D89E00DB634F /* PBXContainerItemProxy */; 346 | sourceTree = BUILT_PRODUCTS_DIR; 347 | }; 348 | 225197BF1BB2D89E00DB634F /* Result.framework */ = { 349 | isa = PBXReferenceProxy; 350 | fileType = wrapper.framework; 351 | path = Result.framework; 352 | remoteRef = 225197BE1BB2D89E00DB634F /* PBXContainerItemProxy */; 353 | sourceTree = BUILT_PRODUCTS_DIR; 354 | }; 355 | 225197C11BB2D89E00DB634F /* Result-iOSTests.xctest */ = { 356 | isa = PBXReferenceProxy; 357 | fileType = wrapper.cfbundle; 358 | path = "Result-iOSTests.xctest"; 359 | remoteRef = 225197C01BB2D89E00DB634F /* PBXContainerItemProxy */; 360 | sourceTree = BUILT_PRODUCTS_DIR; 361 | }; 362 | 225197C31BB2D89E00DB634F /* Result.framework */ = { 363 | isa = PBXReferenceProxy; 364 | fileType = wrapper.framework; 365 | path = Result.framework; 366 | remoteRef = 225197C21BB2D89E00DB634F /* PBXContainerItemProxy */; 367 | sourceTree = BUILT_PRODUCTS_DIR; 368 | }; 369 | 225197C51BB2D89E00DB634F /* Result-tvOSTests.xctest */ = { 370 | isa = PBXReferenceProxy; 371 | fileType = wrapper.cfbundle; 372 | path = "Result-tvOSTests.xctest"; 373 | remoteRef = 225197C41BB2D89E00DB634F /* PBXContainerItemProxy */; 374 | sourceTree = BUILT_PRODUCTS_DIR; 375 | }; 376 | 225197C71BB2D89E00DB634F /* Result.framework */ = { 377 | isa = PBXReferenceProxy; 378 | fileType = wrapper.framework; 379 | path = Result.framework; 380 | remoteRef = 225197C61BB2D89E00DB634F /* PBXContainerItemProxy */; 381 | sourceTree = BUILT_PRODUCTS_DIR; 382 | }; 383 | 225197C91BB2D89E00DB634F /* Result-watchOSTests.xctest */ = { 384 | isa = PBXReferenceProxy; 385 | fileType = wrapper.cfbundle; 386 | path = "Result-watchOSTests.xctest"; 387 | remoteRef = 225197C81BB2D89E00DB634F /* PBXContainerItemProxy */; 388 | sourceTree = BUILT_PRODUCTS_DIR; 389 | }; 390 | /* End PBXReferenceProxy section */ 391 | 392 | /* Begin PBXResourcesBuildPhase section */ 393 | 22D4B2841BA65F43000825FF /* Resources */ = { 394 | isa = PBXResourcesBuildPhase; 395 | buildActionMask = 2147483647; 396 | files = ( 397 | ); 398 | runOnlyForDeploymentPostprocessing = 0; 399 | }; 400 | /* End PBXResourcesBuildPhase section */ 401 | 402 | /* Begin PBXSourcesBuildPhase section */ 403 | 22D4B2811BA65F43000825FF /* Sources */ = { 404 | isa = PBXSourcesBuildPhase; 405 | buildActionMask = 2147483647; 406 | files = ( 407 | 2279ADC31BA91B3C00DA39CB /* PlaygroundSupport.swift in Sources */, 408 | 22D4B2951BA673FE000825FF /* NSTimerExtensions.swift in Sources */, 409 | 22D4B28E1BA65F50000825FF /* Marbles.swift in Sources */, 410 | ); 411 | runOnlyForDeploymentPostprocessing = 0; 412 | }; 413 | /* End PBXSourcesBuildPhase section */ 414 | 415 | /* Begin PBXTargetDependency section */ 416 | 225197AE1BB2D84300DB634F /* PBXTargetDependency */ = { 417 | isa = PBXTargetDependency; 418 | name = "ReactiveCocoa-Mac"; 419 | targetProxy = 225197AD1BB2D84300DB634F /* PBXContainerItemProxy */; 420 | }; 421 | 225197CB1BB2D8A600DB634F /* PBXTargetDependency */ = { 422 | isa = PBXTargetDependency; 423 | name = "Result-Mac"; 424 | targetProxy = 225197CA1BB2D8A600DB634F /* PBXContainerItemProxy */; 425 | }; 426 | /* End PBXTargetDependency section */ 427 | 428 | /* Begin XCBuildConfiguration section */ 429 | 22D4B26A1BA3BFC0000825FF /* Debug */ = { 430 | isa = XCBuildConfiguration; 431 | buildSettings = { 432 | ALWAYS_SEARCH_USER_PATHS = NO; 433 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 434 | CLANG_CXX_LIBRARY = "libc++"; 435 | CLANG_ENABLE_MODULES = YES; 436 | CLANG_ENABLE_OBJC_ARC = YES; 437 | CLANG_WARN_BOOL_CONVERSION = YES; 438 | CLANG_WARN_CONSTANT_CONVERSION = YES; 439 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 440 | CLANG_WARN_EMPTY_BODY = YES; 441 | CLANG_WARN_ENUM_CONVERSION = YES; 442 | CLANG_WARN_INT_CONVERSION = YES; 443 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 444 | CLANG_WARN_UNREACHABLE_CODE = YES; 445 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 446 | COPY_PHASE_STRIP = NO; 447 | CURRENT_PROJECT_VERSION = 1; 448 | DEBUG_INFORMATION_FORMAT = dwarf; 449 | ENABLE_STRICT_OBJC_MSGSEND = YES; 450 | ENABLE_TESTABILITY = YES; 451 | GCC_C_LANGUAGE_STANDARD = gnu99; 452 | GCC_DYNAMIC_NO_PIC = NO; 453 | GCC_NO_COMMON_BLOCKS = YES; 454 | GCC_OPTIMIZATION_LEVEL = 0; 455 | GCC_PREPROCESSOR_DEFINITIONS = ( 456 | "DEBUG=1", 457 | "$(inherited)", 458 | ); 459 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 460 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 461 | GCC_WARN_UNDECLARED_SELECTOR = YES; 462 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 463 | GCC_WARN_UNUSED_FUNCTION = YES; 464 | GCC_WARN_UNUSED_VARIABLE = YES; 465 | MACOSX_DEPLOYMENT_TARGET = 10.10; 466 | MTL_ENABLE_DEBUG_INFO = YES; 467 | ONLY_ACTIVE_ARCH = YES; 468 | SDKROOT = macosx; 469 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 470 | VERSIONING_SYSTEM = "apple-generic"; 471 | VERSION_INFO_PREFIX = ""; 472 | }; 473 | name = Debug; 474 | }; 475 | 22D4B26B1BA3BFC0000825FF /* Release */ = { 476 | isa = XCBuildConfiguration; 477 | buildSettings = { 478 | ALWAYS_SEARCH_USER_PATHS = NO; 479 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 480 | CLANG_CXX_LIBRARY = "libc++"; 481 | CLANG_ENABLE_MODULES = YES; 482 | CLANG_ENABLE_OBJC_ARC = YES; 483 | CLANG_WARN_BOOL_CONVERSION = YES; 484 | CLANG_WARN_CONSTANT_CONVERSION = YES; 485 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 486 | CLANG_WARN_EMPTY_BODY = YES; 487 | CLANG_WARN_ENUM_CONVERSION = YES; 488 | CLANG_WARN_INT_CONVERSION = YES; 489 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 490 | CLANG_WARN_UNREACHABLE_CODE = YES; 491 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 492 | COPY_PHASE_STRIP = NO; 493 | CURRENT_PROJECT_VERSION = 1; 494 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 495 | ENABLE_NS_ASSERTIONS = NO; 496 | ENABLE_STRICT_OBJC_MSGSEND = YES; 497 | GCC_C_LANGUAGE_STANDARD = gnu99; 498 | GCC_NO_COMMON_BLOCKS = YES; 499 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 500 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 501 | GCC_WARN_UNDECLARED_SELECTOR = YES; 502 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 503 | GCC_WARN_UNUSED_FUNCTION = YES; 504 | GCC_WARN_UNUSED_VARIABLE = YES; 505 | MACOSX_DEPLOYMENT_TARGET = 10.10; 506 | MTL_ENABLE_DEBUG_INFO = NO; 507 | SDKROOT = macosx; 508 | VERSIONING_SYSTEM = "apple-generic"; 509 | VERSION_INFO_PREFIX = ""; 510 | }; 511 | name = Release; 512 | }; 513 | 22D4B28C1BA65F43000825FF /* Debug */ = { 514 | isa = XCBuildConfiguration; 515 | buildSettings = { 516 | COMBINE_HIDPI_IMAGES = YES; 517 | DEFINES_MODULE = YES; 518 | DYLIB_COMPATIBILITY_VERSION = 1; 519 | DYLIB_CURRENT_VERSION = 1; 520 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 521 | FRAMEWORK_SEARCH_PATHS = ( 522 | "$(inherited)", 523 | "$(PROJECT_DIR)", 524 | ); 525 | FRAMEWORK_VERSION = A; 526 | INFOPLIST_FILE = ReactiveMarbles/Info.plist; 527 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 528 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 529 | MACOSX_DEPLOYMENT_TARGET = 10.10; 530 | PRODUCT_BUNDLE_IDENTIFIER = au.com.codesplice.ReactiveMarbles; 531 | PRODUCT_NAME = ReactiveMarbles; 532 | SKIP_INSTALL = YES; 533 | }; 534 | name = Debug; 535 | }; 536 | 22D4B28D1BA65F43000825FF /* Release */ = { 537 | isa = XCBuildConfiguration; 538 | buildSettings = { 539 | COMBINE_HIDPI_IMAGES = YES; 540 | DEFINES_MODULE = YES; 541 | DYLIB_COMPATIBILITY_VERSION = 1; 542 | DYLIB_CURRENT_VERSION = 1; 543 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 544 | FRAMEWORK_SEARCH_PATHS = ( 545 | "$(inherited)", 546 | "$(PROJECT_DIR)", 547 | ); 548 | FRAMEWORK_VERSION = A; 549 | INFOPLIST_FILE = ReactiveMarbles/Info.plist; 550 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 551 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 552 | MACOSX_DEPLOYMENT_TARGET = 10.10; 553 | PRODUCT_BUNDLE_IDENTIFIER = au.com.codesplice.ReactiveMarbles; 554 | PRODUCT_NAME = ReactiveMarbles; 555 | SKIP_INSTALL = YES; 556 | }; 557 | name = Release; 558 | }; 559 | /* End XCBuildConfiguration section */ 560 | 561 | /* Begin XCConfigurationList section */ 562 | 22D4B25E1BA3BFC0000825FF /* Build configuration list for PBXProject "ReactiveMarbles" */ = { 563 | isa = XCConfigurationList; 564 | buildConfigurations = ( 565 | 22D4B26A1BA3BFC0000825FF /* Debug */, 566 | 22D4B26B1BA3BFC0000825FF /* Release */, 567 | ); 568 | defaultConfigurationIsVisible = 0; 569 | defaultConfigurationName = Release; 570 | }; 571 | 22D4B28B1BA65F43000825FF /* Build configuration list for PBXNativeTarget "ReactiveMarbles-OSX" */ = { 572 | isa = XCConfigurationList; 573 | buildConfigurations = ( 574 | 22D4B28C1BA65F43000825FF /* Debug */, 575 | 22D4B28D1BA65F43000825FF /* Release */, 576 | ); 577 | defaultConfigurationIsVisible = 0; 578 | defaultConfigurationName = Release; 579 | }; 580 | /* End XCConfigurationList section */ 581 | }; 582 | rootObject = 22D4B25B1BA3BFC0000825FF /* Project object */; 583 | } 584 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles.xcodeproj/xcshareddata/xcschemes/ReactiveMarbles-OSX.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles/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 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | $(CURRENT_PROJECT_VERSION) 23 | NSHumanReadableCopyright 24 | Copyright © 2015 codesplice pty ltd. 25 | NSPrincipalClass 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles/Marbles.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Marbles.swift 3 | // ReactiveMarbles 4 | // 5 | // Created by Sam Ritchie on 12/09/2015. 6 | // Copyright © 2015 codesplice pty ltd. 7 | // 8 | // Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, 9 | // provided that the above copyright notice and this permission notice appear in all copies. 10 | // 11 | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 12 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 15 | // OF THIS SOFTWARE. 16 | 17 | import Foundation 18 | import ReactiveCocoa 19 | import SpriteKit 20 | 21 | public enum MarbleColour: String { 22 | case Red, Green, Blue, Yellow, Purple, Orange, Brown, Grey 23 | var skColor: SKColor { 24 | switch self { 25 | case .Red: 26 | return SKColor.redColor() 27 | case .Green: 28 | return SKColor.greenColor() 29 | case .Blue: 30 | return SKColor.blueColor() 31 | case .Yellow: 32 | return SKColor.yellowColor() 33 | case .Purple: 34 | return SKColor.purpleColor() 35 | case .Orange: 36 | return SKColor.orangeColor() 37 | case .Brown: 38 | return SKColor.brownColor() 39 | case .Grey: 40 | return SKColor.grayColor() 41 | } 42 | } 43 | static let allColours = [MarbleColour.Red, .Green, .Blue, .Yellow, .Purple, .Orange, .Brown, .Grey] 44 | 45 | static func random() -> MarbleColour { 46 | return MarbleColour.allColours[Int(arc4random()) % MarbleColour.allColours.count] 47 | } 48 | } 49 | 50 | public enum MarbleSignalColour { 51 | case Single(MarbleColour) 52 | case Random 53 | } 54 | 55 | public struct Marble: CustomDebugStringConvertible { 56 | public let colour: MarbleColour 57 | public let value: Int 58 | 59 | public init(colour: MarbleColour, value: Int) { 60 | self.colour = colour 61 | self.value = value 62 | } 63 | 64 | public var debugDescription: String { 65 | return "Marble(\(colour), \(value))" 66 | } 67 | } 68 | 69 | public func marbleSignal() -> Signal { 70 | return marbleSignal(colour: .Single(.Red)) 71 | } 72 | 73 | public func marbleSignal(colour colour: MarbleColour) -> Signal { 74 | return marbleSignal(colour: .Single(colour)) 75 | } 76 | 77 | public func marbleSignal(colour colour: MarbleSignalColour) -> Signal { 78 | return Signal { sink in 79 | NSTimer.schedule(repeatInterval: 1.second) { t in 80 | let value = Int(arc4random() % 20) 81 | switch colour { 82 | case let .Single(c): 83 | sendNext(sink, Marble(colour: c, value: value)) 84 | case .Random: 85 | sendNext(sink, Marble(colour: MarbleColour.random(), value: value)) 86 | } 87 | } 88 | return nil 89 | } 90 | } 91 | 92 | public func irregularMarbleSignal(colour colour: MarbleSignalColour) -> Signal { 93 | return Signal { sink in 94 | NSTimer.schedule(repeatInterval: 0.25.seconds) { t in 95 | if arc4random() % 12 == 0 { 96 | let value = Int(arc4random() % 20) 97 | switch colour { 98 | case let .Single(c): 99 | sendNext(sink, Marble(colour: c, value: value)) 100 | case .Random: 101 | sendNext(sink, Marble(colour: MarbleColour.random(), value: value)) 102 | } 103 | } 104 | } 105 | return nil 106 | } 107 | } 108 | 109 | public func marbleSignalProducer(signal: Signal) -> SignalProducer { 110 | return SignalProducer { sink, disp in 111 | signal.observe(sink) 112 | } 113 | } 114 | 115 | public func marbleSignalProducer(colour: MarbleColour, count: Int) -> SignalProducer { 116 | return SignalProducer { sink, disp in 117 | NSTimer.schedule(repeatInterval: 1.second) { t in 118 | sendNext(sink, Marble(colour: colour, value: 0)) 119 | } 120 | }.take(count) 121 | } 122 | 123 | public class MarbleScene: SKScene { 124 | let signal: SignalProducer 125 | let marbleWidth = CGFloat(50.0) 126 | let showValue: Bool 127 | var mostRecentNode: SKNode? 128 | 129 | public init(signal: Signal, size: CGSize, showValue: Bool = false) { 130 | self.signal = marbleSignalProducer(signal) 131 | self.showValue = showValue 132 | super.init(size: size) 133 | } 134 | 135 | public init(signalProducer: SignalProducer, size: CGSize, showValue: Bool = false) { 136 | self.signal = signalProducer 137 | self.showValue = showValue 138 | super.init(size: size) 139 | } 140 | 141 | required public init?(coder aDecoder: NSCoder) { 142 | signal = marbleSignalProducer(marbleSignal()) 143 | self.showValue = false 144 | super.init(coder: aDecoder) 145 | } 146 | 147 | public override func didMoveToView(view: SKView) { 148 | backgroundColor = SKColor.whiteColor() 149 | signal.startWithNext { m in 150 | let marble = SKShapeNode(circleOfRadius: self.marbleWidth/2.0) 151 | marble.fillColor = m.colour.skColor 152 | marble.lineWidth = 0; 153 | var x = self.size.width + (self.marbleWidth/2.0) 154 | if let last = self.mostRecentNode { x = max(x, last.position.x + 5) } 155 | marble.position = CGPoint(x: x, y: self.size.height - (self.marbleWidth)) 156 | if self.showValue { 157 | let value = SKLabelNode(text: m.value.description) 158 | value.fontColor = NSColor.blackColor() 159 | value.position = CGPoint(x: 0, y: -self.marbleWidth/4.0) 160 | marble.addChild(value) 161 | } 162 | self.addChild(marble) 163 | let actionMove = SKAction.moveTo(CGPoint(x: -self.marbleWidth, y: self.size.height - (self.marbleWidth)), duration: NSTimeInterval(self.size.width/self.marbleWidth / 2)) 164 | let actionMoveDone = SKAction.removeFromParent() 165 | marble.runAction(SKAction.sequence([actionMove, actionMoveDone])) 166 | self.mostRecentNode = marble 167 | } 168 | } 169 | } 170 | 171 | public class CombinedMarbleScene: SKScene { 172 | let signal: SignalProducer<(Marble, Marble), NoError> 173 | let marbleWidth = CGFloat(50.0) 174 | let showValue: Bool 175 | 176 | public init(signalProducer: SignalProducer<(Marble, Marble), NoError>, size: CGSize, showValue: Bool = false) { 177 | self.signal = signalProducer 178 | self.showValue = showValue 179 | super.init(size: size) 180 | } 181 | 182 | required public init?(coder aDecoder: NSCoder) { 183 | signal = SignalProducer<(Marble, Marble), NoError>.empty 184 | self.showValue = false 185 | super.init(coder: aDecoder) 186 | } 187 | 188 | public override func didMoveToView(view: SKView) { 189 | backgroundColor = SKColor.whiteColor() 190 | signal.startWithNext { (m1, m2) in 191 | self.addMarble(m1, height: self.frame.height - (self.marbleWidth/2.0)) 192 | self.addMarble(m2, height: self.marbleWidth/2.0) 193 | } 194 | } 195 | 196 | private func addMarble(m: Marble, height: CGFloat) { 197 | let marble = SKShapeNode(circleOfRadius: self.marbleWidth/2.0) 198 | marble.fillColor = m.colour.skColor 199 | marble.lineWidth = 0; 200 | marble.position = CGPoint(x: self.size.width + (self.marbleWidth/2.0), y: height) 201 | if self.showValue { 202 | let value = SKLabelNode(text: m.value.description) 203 | value.fontColor = NSColor.blackColor() 204 | value.position = CGPoint(x: 0, y: -self.marbleWidth/4.0) 205 | marble.addChild(value) 206 | } 207 | self.addChild(marble) 208 | let actionMove = SKAction.moveTo(CGPoint(x: -self.marbleWidth, y: height), duration: NSTimeInterval(self.size.width/self.marbleWidth / 2)) 209 | let actionMoveDone = SKAction.removeFromParent() 210 | marble.runAction(SKAction.sequence([actionMove, actionMoveDone])) 211 | } 212 | } 213 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles/NSTimerExtensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Thankyou, the githubs! https://gist.github.com/radex/41a1e75bb1290fb5d559 3 | // and https://gist.github.com/natecook1000/b0285b518576b22c4dc8 4 | 5 | import Foundation 6 | 7 | public extension Int { 8 | var second: NSTimeInterval { return NSTimeInterval(self) } 9 | var seconds: NSTimeInterval { return NSTimeInterval(self) } 10 | var minute: NSTimeInterval { return NSTimeInterval(self * 60) } 11 | var minutes: NSTimeInterval { return NSTimeInterval(self * 60) } 12 | var hour: NSTimeInterval { return NSTimeInterval(self * 3600) } 13 | var hours: NSTimeInterval { return NSTimeInterval(self * 3600) } 14 | } 15 | 16 | public extension Double { 17 | var second: NSTimeInterval { return self } 18 | var seconds: NSTimeInterval { return self } 19 | var minute: NSTimeInterval { return self * 60 } 20 | var minutes: NSTimeInterval { return self * 60 } 21 | var hour: NSTimeInterval { return self * 3600 } 22 | var hours: NSTimeInterval { return self * 3600 } 23 | } 24 | 25 | public extension NSTimer { 26 | /** 27 | Creates and schedules a one-time `NSTimer` instance. 28 | 29 | :param: delay The delay before execution. 30 | :param: handler A closure to execute after `delay`. 31 | 32 | :returns: The newly-created `NSTimer` instance. 33 | */ 34 | class func schedule(delay delay: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer { 35 | let fireDate = delay + CFAbsoluteTimeGetCurrent() 36 | let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, 0, 0, 0, handler) 37 | CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes) 38 | return timer 39 | } 40 | 41 | /** 42 | Creates and schedules a repeating `NSTimer` instance. 43 | 44 | :param: repeatInterval The interval between each execution of `handler`. Note that individual calls may be delayed; subsequent calls to `handler` will be based on the time the `NSTimer` was created. 45 | :param: handler A closure to execute after `delay`. 46 | 47 | :returns: The newly-created `NSTimer` instance. 48 | */ 49 | class func schedule(repeatInterval interval: NSTimeInterval, handler: NSTimer! -> Void) -> NSTimer { 50 | let fireDate = interval + CFAbsoluteTimeGetCurrent() 51 | let timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, fireDate, interval, 0, 0, handler) 52 | CFRunLoopAddTimer(CFRunLoopGetCurrent(), timer, kCFRunLoopCommonModes) 53 | return timer 54 | } 55 | } -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles/PlaygroundSupport.swift: -------------------------------------------------------------------------------- 1 | // 2 | // PlaygroundSupport.swift 3 | // ReactiveMarbles 4 | // 5 | // Created by Sam Ritchie on 16/09/2015. 6 | // Copyright © 2015 codesplice pty ltd. 7 | // 8 | // Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, 9 | // provided that the above copyright notice and this permission notice appear in all copies. 10 | // 11 | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 12 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 15 | // OF THIS SOFTWARE. 16 | 17 | import Foundation 18 | import SpriteKit 19 | import XCPlayground 20 | import ReactiveCocoa 21 | 22 | public func display(name: String, _ signal: Signal, showValue: Bool = true) { 23 | let container = SKView(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 24 | XCPShowView(name, view: container ) 25 | container.presentScene(MarbleScene(signal: signal, size: container.bounds.size, showValue: showValue)) 26 | } 27 | 28 | public func display(name: String, _ signal: SignalProducer, showValue: Bool = true) { 29 | let container = SKView(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 30 | XCPShowView(name, view: container ) 31 | container.presentScene(MarbleScene(signalProducer: signal, size: container.bounds.size, showValue: showValue)) 32 | } 33 | 34 | public func display(name: String, _ signal: SignalProducer<(Marble, Marble), NoError>, showValue: Bool = true) { 35 | let container = SKView(frame: CGRect(x: 0, y: 0, width: 500, height: 100)) 36 | XCPShowView(name, view: container ) 37 | container.presentScene(CombinedMarbleScene(signalProducer: signal, size: container.bounds.size, showValue: showValue)) 38 | } 39 | -------------------------------------------------------------------------------- /ReactiveMarbles/ReactiveMarbles/ReactiveMarbles.h: -------------------------------------------------------------------------------- 1 | // 2 | // ReactiveMarbles.h 3 | // ReactiveMarbles 4 | // 5 | // Created by Sam Ritchie on 14/09/2015. 6 | // Copyright © 2015 codesplice pty ltd. 7 | // 8 | // Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, 9 | // provided that the above copyright notice and this permission notice appear in all copies. 10 | // 11 | // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 12 | // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 13 | // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 | // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 15 | // OF THIS SOFTWARE. 16 | 17 | #import 18 | 19 | //! Project version number for ReactiveMarbles. 20 | FOUNDATION_EXPORT double ReactiveMarblesVersionNumber; 21 | 22 | //! Project version string for ReactiveMarbles. 23 | FOUNDATION_EXPORT const unsigned char ReactiveMarblesVersionString[]; 24 | 25 | // In this header, you should import all the public headers of your framework using statements like #import 26 | 27 | 28 | -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Modules: -------------------------------------------------------------------------------- 1 | Versions/Current/Modules -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/Modules/XCPlayground.swiftmodule/x86_64.swiftdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samritchie/ReactiveMarbles/dac9aaecbc4b2ddf13c8d7ea4440dd2b75e2eb86/ReactiveMarbles/XCPlayground.framework/Versions/A/Modules/XCPlayground.swiftmodule/x86_64.swiftdoc -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/Modules/XCPlayground.swiftmodule/x86_64.swiftmodule: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samritchie/ReactiveMarbles/dac9aaecbc4b2ddf13c8d7ea4440dd2b75e2eb86/ReactiveMarbles/XCPlayground.framework/Versions/A/Modules/XCPlayground.swiftmodule/x86_64.swiftmodule -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samritchie/ReactiveMarbles/dac9aaecbc4b2ddf13c8d7ea4440dd2b75e2eb86/ReactiveMarbles/XCPlayground.framework/Versions/A/Resources/Info.plist -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/Resources/version.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | BuildVersion 6 | 24 7 | CFBundleShortVersionString 8 | 1.0 9 | CFBundleVersion 10 | 8045 11 | ProjectName 12 | DVTPlaygroundSupport 13 | SourceVersion 14 | 8045000000000000 15 | 16 | 17 | -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/XCPlayground: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samritchie/ReactiveMarbles/dac9aaecbc4b2ddf13c8d7ea4440dd2b75e2eb86/ReactiveMarbles/XCPlayground.framework/Versions/A/XCPlayground -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/A/_CodeSignature/CodeResources: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | files 6 | 7 | Resources/Info.plist 8 | 9 | zTt/AdCW4SHDw8A4nI0LYxNepyM= 10 | 11 | Resources/version.plist 12 | 13 | +UlqQEmc4rRwg/KTLZ3egOnwCxA= 14 | 15 | 16 | files2 17 | 18 | Modules/XCPlayground.swiftmodule/x86_64.swiftdoc 19 | 20 | s+ctWPjDQta55MhGlC4g7wzon7A= 21 | 22 | Modules/XCPlayground.swiftmodule/x86_64.swiftmodule 23 | 24 | PP6iJnQXzIF499uUzr7ak0jXYDI= 25 | 26 | Resources/Info.plist 27 | 28 | zTt/AdCW4SHDw8A4nI0LYxNepyM= 29 | 30 | Resources/version.plist 31 | 32 | +UlqQEmc4rRwg/KTLZ3egOnwCxA= 33 | 34 | 35 | rules 36 | 37 | ^Resources/ 38 | 39 | ^Resources/.*\.lproj/ 40 | 41 | optional 42 | 43 | weight 44 | 1000 45 | 46 | ^Resources/.*\.lproj/locversion.plist$ 47 | 48 | omit 49 | 50 | weight 51 | 1100 52 | 53 | ^version.plist$ 54 | 55 | 56 | rules2 57 | 58 | .*\.dSYM($|/) 59 | 60 | weight 61 | 11 62 | 63 | ^(.*/)?\.DS_Store$ 64 | 65 | omit 66 | 67 | weight 68 | 2000 69 | 70 | ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ 71 | 72 | nested 73 | 74 | weight 75 | 10 76 | 77 | ^.* 78 | 79 | ^Info\.plist$ 80 | 81 | omit 82 | 83 | weight 84 | 20 85 | 86 | ^PkgInfo$ 87 | 88 | omit 89 | 90 | weight 91 | 20 92 | 93 | ^Resources/ 94 | 95 | weight 96 | 20 97 | 98 | ^Resources/.*\.lproj/ 99 | 100 | optional 101 | 102 | weight 103 | 1000 104 | 105 | ^Resources/.*\.lproj/locversion.plist$ 106 | 107 | omit 108 | 109 | weight 110 | 1100 111 | 112 | ^[^/]+$ 113 | 114 | nested 115 | 116 | weight 117 | 10 118 | 119 | ^embedded\.provisionprofile$ 120 | 121 | weight 122 | 20 123 | 124 | ^version\.plist$ 125 | 126 | weight 127 | 20 128 | 129 | 130 | 131 | 132 | -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /ReactiveMarbles/XCPlayground.framework/XCPlayground: -------------------------------------------------------------------------------- 1 | Versions/Current/XCPlayground --------------------------------------------------------------------------------