From e141ba9815123f28aef2fcec5bacdfb699500533 Mon Sep 17 00:00:00 2001 From: Lily Ballard Date: Sun, 26 Jul 2020 23:02:33 -0700 Subject: [PATCH] Rebuild docs --- docs/Enums.html | 4 +- docs/Enums/NoError.html | 4 +- docs/Enums/PromiseCallbackError.html | 4 +- docs/Enums/PromiseContext.html | 4 +- docs/Enums/PromiseResult.html | 4 +- docs/Enums/PromiseTimeoutError.html | 4 +- docs/Functions.html | 4 +- docs/Structs.html | 4 +- docs/Structs/DelayedPromise.html | 4 +- docs/Structs/Promise.html | 60 +++- docs/Structs/Promise/Resolver.html | 9 +- docs/Structs/PromiseCancellable.html | 4 +- docs/Structs/PromiseInvalidationToken.html | 4 +- docs/Structs/TokenPromise.html | 4 +- docs/Typealiases.html | 4 +- .../Contents/Resources/Documents/Enums.html | 4 +- .../Resources/Documents/Enums/NoError.html | 4 +- .../Documents/Enums/PromiseCallbackError.html | 4 +- .../Documents/Enums/PromiseContext.html | 4 +- .../Documents/Enums/PromiseResult.html | 4 +- .../Documents/Enums/PromiseTimeoutError.html | 4 +- .../Resources/Documents/Functions.html | 4 +- .../Contents/Resources/Documents/Structs.html | 4 +- .../Documents/Structs/DelayedPromise.html | 4 +- .../Resources/Documents/Structs/Promise.html | 60 +++- .../Documents/Structs/Promise/Resolver.html | 9 +- .../Documents/Structs/PromiseCancellable.html | 4 +- .../Structs/PromiseInvalidationToken.html | 4 +- .../Documents/Structs/TokenPromise.html | 4 +- .../Resources/Documents/Typealiases.html | 4 +- .../Contents/Resources/Documents/index.html | 280 ++++++------------ .../Contents/Resources/Documents/search.json | 2 +- .../Contents/Resources/docSet.dsidx | Bin 61440 -> 61440 bytes docs/docsets/Tomorrowland.tgz | Bin 110873 -> 111908 bytes docs/index.html | 280 ++++++------------ docs/search.json | 2 +- 36 files changed, 346 insertions(+), 460 deletions(-) diff --git a/docs/Enums.html b/docs/Enums.html index c048864..8b08a7b 100644 --- a/docs/Enums.html +++ b/docs/Enums.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -309,7 +309,7 @@

Declaration

diff --git a/docs/Enums/NoError.html b/docs/Enums/NoError.html index c370561..effe7e1 100644 --- a/docs/Enums/NoError.html +++ b/docs/Enums/NoError.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -274,7 +274,7 @@

Declaration

diff --git a/docs/Enums/PromiseCallbackError.html b/docs/Enums/PromiseCallbackError.html index 1c85117..0f99f32 100644 --- a/docs/Enums/PromiseCallbackError.html +++ b/docs/Enums/PromiseCallbackError.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -160,7 +160,7 @@

Declaration

diff --git a/docs/Enums/PromiseContext.html b/docs/Enums/PromiseContext.html index 9e421b7..ca5eeea 100644 --- a/docs/Enums/PromiseContext.html +++ b/docs/Enums/PromiseContext.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -597,7 +597,7 @@

Parameters

diff --git a/docs/Enums/PromiseResult.html b/docs/Enums/PromiseResult.html index d4679b2..16a82a3 100644 --- a/docs/Enums/PromiseResult.html +++ b/docs/Enums/PromiseResult.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -700,7 +700,7 @@

Declaration

diff --git a/docs/Enums/PromiseTimeoutError.html b/docs/Enums/PromiseTimeoutError.html index ce579bd..ed7616b 100644 --- a/docs/Enums/PromiseTimeoutError.html +++ b/docs/Enums/PromiseTimeoutError.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -395,7 +395,7 @@

Declaration

diff --git a/docs/Functions.html b/docs/Functions.html index 58cd39c..60db2e8 100644 --- a/docs/Functions.html +++ b/docs/Functions.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -927,7 +927,7 @@

Return Value

diff --git a/docs/Structs.html b/docs/Structs.html index 0e39430..250eebf 100644 --- a/docs/Structs.html +++ b/docs/Structs.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -347,7 +347,7 @@

Declaration

diff --git a/docs/Structs/DelayedPromise.html b/docs/Structs/DelayedPromise.html index aae5dd9..3e0765a 100644 --- a/docs/Structs/DelayedPromise.html +++ b/docs/Structs/DelayedPromise.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -304,7 +304,7 @@

Declaration

diff --git a/docs/Structs/Promise.html b/docs/Structs/Promise.html index 246c8b3..e2703fa 100644 --- a/docs/Structs/Promise.html +++ b/docs/Structs/Promise.html @@ -14,7 +14,7 @@
-

Tomorrowland 1.3.0 Docs (100% documented)

+

Tomorrowland 1.4.0 Docs (100% documented)

View on GitHub

@@ -1681,7 +1681,8 @@

Return Value

The returned Promise will always resolve with the same value that its receiver does, but it won’t affect the timing of any of the receiver’s other observers and it won’t affect -automatic cancellation propagation behavior.

+automatic cancellation propagation behavior. Requesting cancellation of the returned +Promise does nothing.

tap().always(on:token:_:) behaves the same as tap(on:token:_:) except it returns a new Promise whereas tap(on:token:_:) returns the receiver and can be inserted into any @@ -1731,6 +1732,16 @@

Return Value

Registers a callback that will be invoked when the promise is cancelled.

+
+

Note

+

Like tap, onCancel does not prevent automatic cancellation propagation if the +parent has multiple children and all other children have requested cancellation. Unlike +tap, requesting cancellation of onCancel will cancel the parent if the parent has no +other children. onCancel‘s behavior differs from the other standard obsrevers here as +attaching an onCancel observer to a promise that would otherwise be cancelled should not +prevent the cancellation.

+ +
@@ -1824,6 +1835,13 @@

Return Value

The intent of this method is to allow you to deduplicate requests for a long-lived resource (such as a network load) without preventing cancellation of the load in the event that no children care about it anymore.

+
+

Important

+

Do not give the returned promise directly to callers. Instead always hand back +a child, such as returned from makeChild. Otherwise automatic cancellation propagation +won’t work as expected.

+ +
@@ -1887,6 +1905,42 @@

Return Value

+
  • +
    + + + + makeChild() + +
    +
    +
    +
    +
    +
    +

    Returns a promise that adopts the same value as the receiver.

    + +

    This method is used in order to hand back child promises to callers so that they cannot +directly request cancellation of a shared parent promise. This is most useful in conjunction +with propagatingCancellation(on:cancelRequested:) but could also be used any time a shared +promise is given to multiple callers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeChild() -> Promise<Value, Error>
    + +
    +
    +
    +

    Return Value

    +

    A new promise that will resolve to the same value as the receiver.

    +
    +
    +
    +
  • @@ -3390,7 +3444,7 @@

    Return Value

    diff --git a/docs/Structs/Promise/Resolver.html b/docs/Structs/Promise/Resolver.html index e4217c7..ee9f9a4 100644 --- a/docs/Structs/Promise/Resolver.html +++ b/docs/Structs/Promise/Resolver.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -261,8 +261,9 @@

    Declaration

    Otherwise the receiver will wait until promise is resolved and resolve to the same result.

    -

    If the receiver is cancelled, it will also propagate the cancellation to promise. If -this is not desired, then either use resolve(with: promise.ignoringCancel()) or +

    If the receiver is cancelled, it will also propagate the cancellation to promise the +same way that a child promise does. If this is not desired, then either use +resolve(with: promise.ignoringCancel()) or promise.always(on: .immediate, resolver.resolve(with:)).

    @@ -526,7 +527,7 @@

    Declaration

    diff --git a/docs/Structs/PromiseCancellable.html b/docs/Structs/PromiseCancellable.html index ffe534b..227c542 100644 --- a/docs/Structs/PromiseCancellable.html +++ b/docs/Structs/PromiseCancellable.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -166,7 +166,7 @@

    Declaration

    diff --git a/docs/Structs/PromiseInvalidationToken.html b/docs/Structs/PromiseInvalidationToken.html index c129990..4a5eead 100644 --- a/docs/Structs/PromiseInvalidationToken.html +++ b/docs/Structs/PromiseInvalidationToken.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -537,7 +537,7 @@

    Declaration

    diff --git a/docs/Structs/TokenPromise.html b/docs/Structs/TokenPromise.html index de7d1a5..0eda09e 100644 --- a/docs/Structs/TokenPromise.html +++ b/docs/Structs/TokenPromise.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -2023,7 +2023,7 @@

    Return Value

    diff --git a/docs/Typealiases.html b/docs/Typealiases.html index 5f35535..36663ce 100644 --- a/docs/Typealiases.html +++ b/docs/Typealiases.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -179,7 +179,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums.html index c048864..8b08a7b 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -309,7 +309,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/NoError.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/NoError.html index c370561..effe7e1 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/NoError.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/NoError.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -274,7 +274,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseCallbackError.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseCallbackError.html index 1c85117..0f99f32 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseCallbackError.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseCallbackError.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -160,7 +160,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseContext.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseContext.html index 9e421b7..ca5eeea 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseContext.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseContext.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -597,7 +597,7 @@

    Parameters

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseResult.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseResult.html index d4679b2..16a82a3 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseResult.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseResult.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -700,7 +700,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseTimeoutError.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseTimeoutError.html index ce579bd..ed7616b 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseTimeoutError.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Enums/PromiseTimeoutError.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -395,7 +395,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Functions.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Functions.html index 58cd39c..60db2e8 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Functions.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Functions.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -927,7 +927,7 @@

    Return Value

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs.html index 0e39430..250eebf 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -347,7 +347,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/DelayedPromise.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/DelayedPromise.html index aae5dd9..3e0765a 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/DelayedPromise.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/DelayedPromise.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -304,7 +304,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise.html index 246c8b3..e2703fa 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -1681,7 +1681,8 @@

    Return Value

    The returned Promise will always resolve with the same value that its receiver does, but it won’t affect the timing of any of the receiver’s other observers and it won’t affect -automatic cancellation propagation behavior.

    +automatic cancellation propagation behavior. Requesting cancellation of the returned +Promise does nothing.

    tap().always(on:token:_:) behaves the same as tap(on:token:_:) except it returns a new Promise whereas tap(on:token:_:) returns the receiver and can be inserted into any @@ -1731,6 +1732,16 @@

    Return Value

    Registers a callback that will be invoked when the promise is cancelled.

    +
    +

    Note

    +

    Like tap, onCancel does not prevent automatic cancellation propagation if the +parent has multiple children and all other children have requested cancellation. Unlike +tap, requesting cancellation of onCancel will cancel the parent if the parent has no +other children. onCancel‘s behavior differs from the other standard obsrevers here as +attaching an onCancel observer to a promise that would otherwise be cancelled should not +prevent the cancellation.

    + +
    @@ -1824,6 +1835,13 @@

    Return Value

    The intent of this method is to allow you to deduplicate requests for a long-lived resource (such as a network load) without preventing cancellation of the load in the event that no children care about it anymore.

    +
    +

    Important

    +

    Do not give the returned promise directly to callers. Instead always hand back +a child, such as returned from makeChild. Otherwise automatic cancellation propagation +won’t work as expected.

    + +
    @@ -1887,6 +1905,42 @@

    Return Value

  • +
  • +
    + + + + makeChild() + +
    +
    +
    +
    +
    +
    +

    Returns a promise that adopts the same value as the receiver.

    + +

    This method is used in order to hand back child promises to callers so that they cannot +directly request cancellation of a shared parent promise. This is most useful in conjunction +with propagatingCancellation(on:cancelRequested:) but could also be used any time a shared +promise is given to multiple callers.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func makeChild() -> Promise<Value, Error>
    + +
    +
    +
    +

    Return Value

    +

    A new promise that will resolve to the same value as the receiver.

    +
    +
    +
    +
  • @@ -3390,7 +3444,7 @@

    Return Value

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise/Resolver.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise/Resolver.html index e4217c7..ee9f9a4 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise/Resolver.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/Promise/Resolver.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -261,8 +261,9 @@

    Declaration

    Otherwise the receiver will wait until promise is resolved and resolve to the same result.

    -

    If the receiver is cancelled, it will also propagate the cancellation to promise. If -this is not desired, then either use resolve(with: promise.ignoringCancel()) or +

    If the receiver is cancelled, it will also propagate the cancellation to promise the +same way that a child promise does. If this is not desired, then either use +resolve(with: promise.ignoringCancel()) or promise.always(on: .immediate, resolver.resolve(with:)).

    @@ -526,7 +527,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseCancellable.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseCancellable.html index ffe534b..227c542 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseCancellable.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseCancellable.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -166,7 +166,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseInvalidationToken.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseInvalidationToken.html index c129990..4a5eead 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseInvalidationToken.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/PromiseInvalidationToken.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -537,7 +537,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/TokenPromise.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/TokenPromise.html index de7d1a5..0eda09e 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/TokenPromise.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Structs/TokenPromise.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -2023,7 +2023,7 @@

    Return Value

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Typealiases.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Typealiases.html index 5f35535..36663ce 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Typealiases.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/Typealiases.html @@ -14,7 +14,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -179,7 +179,7 @@

    Declaration

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/index.html b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/index.html index 4ab3dfa..c964cb1 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/index.html +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/index.html @@ -13,7 +13,7 @@
    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -115,15 +115,14 @@

    Tomorrowland

    -

    Version +

    Version Platforms Languages License CocoaPods Carthage compatible

    -

    Tomorrowland is an implementation of Promises for Swift and Objective-C. A Promise is a wrapper around an -asynchronous task that provides a standard way of subscribing to task resolution as well as chaining promises together.

    +

    Tomorrowland is an implementation of Promises for Swift and Objective-C. A Promise is a wrapper around an asynchronous task that provides a standard way of subscribing to task resolution as well as chaining promises together.

    UIApplication.shared.isNetworkActivityIndicatorVisible = true
     MyAPI.requestFeed(for: user).then { (feedItems) in
         self.refreshUI(with: feedItems)
    @@ -138,18 +137,11 @@ 

    Tomorrowland

    • It uses atomics internally instead of creating a separate DispatchQueue for each promise. This means it’s faster and uses fewer resources.
    • -
    • It provides full support for cancellable promises. PromiseKit supports detection of “cancelled” errors but has no way to request cancellation of a promise. Hydra -supports cancelling a promise, but it can’t actually stop any work being done by the promise unless the promise body itself polls for the cancellation status (so e.g. -a promise wrapping a network task can’t reasonably cancel the network task). Tomorrowland improves on this by allowing the promise body to observe the -cancelled state, and allows linking cancellation of a child promise to its parent.
    • +
    • It provides full support for cancellable promises. PromiseKit supports detection of “cancelled” errors but has no way to request cancellation of a promise. Hydra supports cancelling a promise, but it can’t actually stop any work being done by the promise unless the promise body itself polls for the cancellation status (so e.g. a promise wrapping a network task can’t reasonably cancel the network task). Tomorrowland improves on this by allowing the promise body to observe the cancelled state, and allows linking cancellation of a child promise to its parent.
    • Its Obj-C support makes use of generics for improved type safety and better documentation.
    • -
    • Like Hydra but unlike PromiseKit, it provides a way to suppress a registered callback (e.g. because you don’t care about the result anymore and don’t want stale -data affecting your UI). This is distinct from promise cancellation.
    • -
    • Tomorrowland promises are fully generic over the error type, whereas both PromiseKit and Hydra only support using Error as the error type. This may result in -more typing to construct a promise but it allows for much more powerful error handling. Tomorrowland also has some affordances for working with promises that -use Error as the error type.
    • -
    • Tomorrowland is fully thread-safe. I have no reason to believe PromiseKit isn’t, but (at the time of this writing) there are parts of Hydra that are incorrectly -implemented in a non-thread-safe manner.
    • +
    • Like Hydra but unlike PromiseKit, it provides a way to suppress a registered callback (e.g. because you don’t care about the result anymore and don’t want stale data affecting your UI). This is distinct from promise cancellation.
    • +
    • Tomorrowland promises are fully generic over the error type, whereas both PromiseKit and Hydra only support using Error as the error type. This may result in more typing to construct a promise but it allows for much more powerful error handling. Tomorrowland also has some affordances for working with promises that use Error as the error type.
    • +
    • Tomorrowland is fully thread-safe. I have no reason to believe PromiseKit isn’t, but (at the time of this writing) there are parts of Hydra that are incorrectly implemented in a non-thread-safe manner.

    Installation

    Manually

    @@ -159,18 +151,15 @@

    Carthage

    github "lilyball/Tomorrowland" ~> 1.0
     
    -

    The project file is configured to use Swift 5. The code can be compiled against Swift 4.2 instead, but I’m not aware of any way to instruct Carthage to override the -swift version during compilation.

    +

    The project file is configured to use Swift 5. The code can be compiled against Swift 4.2 instead, but I’m not aware of any way to instruct Carthage to override the swift version during compilation.

    CocoaPods

    pod 'Tomorrowland', '~> 1.0'
     
    -

    The podspec declares support for both Swift 4.2 and Swift 5.0, but selecting the Swift version requires using CoocaPods 1.7.0 or later. When using CocoaPods 1.6 -or earlier the Swift version will default to 5.0.

    +

    The podspec declares support for both Swift 4.2 and Swift 5.0, but selecting the Swift version requires using CoocaPods 1.7.0 or later. When using CocoaPods 1.6 or earlier the Swift version will default to 5.0.

    SwiftPM

    -

    Tomorrowland currently relies on a private Obj-C module for its atomics. This arrangement means it is not compatible with Swift Package Manager (as adding -compatibility would necessitate publicly exposing the private Obj-C module).

    +

    Tomorrowland currently relies on a private Obj-C module for its atomics. This arrangement means it is not compatible with Swift Package Manager (as adding compatibility would necessitate publicly exposing the private Obj-C module).

    Usage

    Creating Promises

    @@ -181,18 +170,11 @@

    Creating Promises

    })
    -

    The body of this promise runs on the specified PromiseContext, which in this case is .utility (which means DispatchQueue.global(qos: .utility)). -Unlike callbacks, all created promises must specify a context, so as to avoid accidentally running expensive computations on the main thread. The available contexts -include .main, every Dispatch QoS, a specific DispatchQueue, a specific OperationQueue, or the value .immediate which means to run the block -synchronously. There’s also the special context .auto, which evaluates to .main on the main thread and .default otherwise.

    +

    The body of this promise runs on the specified PromiseContext, which in this case is .utility (which means DispatchQueue.global(qos: .utility)). Unlike callbacks, all created promises must specify a context, so as to avoid accidentally running expensive computations on the main thread. The available contexts include .main, every Dispatch QoS, a specific DispatchQueue, a specific OperationQueue, or the value .immediate which means to run the block synchronously. There’s also the special context .auto, which evaluates to .main on the main thread and .default otherwise.

    -

    Note: The .immediate context can be dangerous to use for callback handlers and should be avoided in most cases. It’s primarily intended for creating -promises, and whenever it’s used with a callback handler the handler must be prepared to execute on any thread. For callbacks it’s usually only useful for short -thread-agnostic callbacks, such as an .onRequestCancel that does nothing more than cancelling a URLSessionTask.

    +

    Note: The .immediate context can be dangerous to use for callback handlers and should be avoided in most cases. It’s primarily intended for creating promises, and whenever it’s used with a callback handler the handler must be prepared to execute on any thread. For callbacks it’s usually only useful for short thread-agnostic callbacks, such as an .onRequestCancel that does nothing more than cancelling a URLSessionTask.

    -

    The body of a Promise receives a “resolver”, which it must use to fulfill, reject, or cancel the promise. If the resolver goes out of scope without being used, the -promise is automatically cancelled. If the promise’s error type is Error, the promise body may also throw an error (as seen above), which is then used to reject the -promise. This resolver can also be used to observe cancellation requests using resolver.onRequestCancel, as seen here:

    +

    The body of a Promise receives a “resolver”, which it must use to fulfill, reject, or cancel the promise. If the resolver goes out of scope without being used, the promise is automatically cancelled. If the promise’s error type is Error, the promise body may also throw an error (as seen above), which is then used to reject the promise. This resolver can also be used to observe cancellation requests using resolver.onRequestCancel, as seen here:

    let promise = Promise<Data,Error>(on: .immediate, { (resolver) in
         let task = urlSession.dataTask(with: url, completionHandler: { (data, response, error) in
             if let data = data {
    @@ -210,24 +192,16 @@ 

    Creating Promises

    })
    -

    Resolvers also have a convenience method handleCallback() that is intended to make it easy to wrap framework callbacks in promises. This method returns a -closure that can be used as a callback directly. It also takes an optional isCancelError parameter that can be used to indicate when an error represents -cancellation. For example:

    +

    Resolvers also have a convenience method handleCallback() that is intended to make it easy to wrap framework callbacks in promises. This method returns a closure that can be used as a callback directly. It also takes an optional isCancelError parameter that can be used to indicate when an error represents cancellation. For example:

    geocoder.reverseGeocodeLocation(location, completionHandler: resolver.handleCallback(isCancelError: { CLError.geocodeCanceled ~= $0 }))
     

    Using Promises

    -

    Once you have a promise, you can register callbacks to be executed when the promise is resolved. Most callback methods require a context, but for some of them -(then, catch, always, and tryThen) you can omit the context and it will default to .auto, which means the main thread if the callback is registered from the -main thread, otherwise the dispatch queue with QoS .default.

    +

    Once you have a promise, you can register callbacks to be executed when the promise is resolved. Most callback methods require a context, but for some of them (then, catch, always, and tryThen) you can omit the context and it will default to .auto, which means the main thread if the callback is registered from the main thread, otherwise the dispatch queue with QoS .default.

    -

    When you register a callback, the method also returns a Promise. All callback registration methods return a new Promise even if the callback doesn’t affect the -value of the promise. The reason for this is so chained callbacks always guarantee that the previous callback finished executing before the new one starts, even -when using concurrent contexts (e.g. .utility), and so cancelling the returned promise doesn’t cancel the original one if any other callbacks were registered on -it.

    +

    When you register a callback, the method also returns a Promise. All callback registration methods return a new Promise even if the callback doesn’t affect the value of the promise. The reason for this is so chained callbacks always guarantee that the previous callback finished executing before the new one starts, even when using concurrent contexts (e.g. .utility), and so cancelling the returned promise doesn’t cancel the original one if any other callbacks were registered on it.

    -

    Most callback registration methods also have versions that allow you to return a Promise from your callback. In this event, the resulting Promise waits for the -promise you returned to resolve before adopting its value. This allows for easy composition of promises.

    +

    Most callback registration methods also have versions that allow you to return a Promise from your callback. In this event, the resulting Promise waits for the promise you returned to resolve before adopting its value. This allows for easy composition of promises.

    showLoadingIndicator()
     fetchUserCredentials().flatMap(on: .default) { (credentials) in
         // This returns a new promise
    @@ -247,25 +221,14 @@ 

    Using Promises

    }
    -

    When composing callbacks that return promises, you may run into issues with incompatible error types. There are convenience methods for working with promises -whose errors are compatible with Error, but they don’t cover all cases. If you find yourself hitting one of these cases, any Promise whose error type conforms to -Error has a property .upcast that will convert that error into an Error to allow for easier composition of promises.

    +

    When composing callbacks that return promises, you may run into issues with incompatible error types. There are convenience methods for working with promises whose errors are compatible with Error, but they don’t cover all cases. If you find yourself hitting one of these cases, any Promise whose error type conforms to Error has a property .upcast that will convert that error into an Error to allow for easier composition of promises.

    -

    Tomorrowland also offers a typealias StdPromise<Value> as shorthand for Promise<T,Error>. This is frequently useful to avoid having to repeat the types, -such as with StdPromise(fulfilled: someValue) instead of Promise<SomeValue,Error>(fulfilled: someValue).

    +

    Tomorrowland also offers a typealias StdPromise<Value> as shorthand for Promise<T,Error>. This is frequently useful to avoid having to repeat the types, such as with StdPromise(fulfilled: someValue) instead of Promise<SomeValue,Error>(fulfilled: someValue).

    Cancelling and Invalidation

    -

    All promises expose a method .requestCancel(). It is named such because this doesn’t actually guarantee that the promise will be cancelled. If the promise -supports cancellation, this method will trigger a callback that the promise can use to cancel its work. But promises that don’t support cancellation will ignore this -and will eventually fulfill or reject as normal. Naturally, requesting cancellation of a promise that has already been resolved does nothing, even if the callbacks have -not yet been invoked.

    - -

    In order to handle the issue of a promise being resolved after you no longer care about it, there is a separate mechanism called a PromiseInvalidationToken -that can be used to suppress callbacks. All callback methods have an optional token parameter that accepts a PromiseInvalidationToken. If provided, -calling invalidate() on the token prior to the callback being executed guarantees the callback will not fire. If the callback returns a value that is required in order -to resolve the Promise returned from the callback registration method, the resulting Promise is cancelled instead. PromiseInvalidationTokens can be used -with multiple callbacks at once, and a single token can be re-used as much as desired. It is recommended that you take advantage of both invalidation tokens and -cancellation. This may look like

    +

    All promises expose a method .requestCancel(). It is named such because this doesn’t actually guarantee that the promise will be cancelled. If the promise supports cancellation, this method will trigger a callback that the promise can use to cancel its work. But promises that don’t support cancellation will ignore this and will eventually fulfill or reject as normal. Naturally, requesting cancellation of a promise that has already been resolved does nothing, even if the callbacks have not yet been invoked.

    + +

    In order to handle the issue of a promise being resolved after you no longer care about it, there is a separate mechanism called a PromiseInvalidationToken that can be used to suppress callbacks. All callback methods have an optional token parameter that accepts a PromiseInvalidationToken. If provided, calling invalidate() on the token prior to the callback being executed guarantees the callback will not fire. If the callback returns a value that is required in order to resolve the Promise returned from the callback registration method, the resulting Promise is cancelled instead. PromiseInvalidationTokens can be used with multiple callbacks at once, and a single token can be re-used as much as desired. It is recommended that you take advantage of both invalidation tokens and cancellation. This may look like

    class URLImageView: UIImageView {
         private var promise: StdPromise<Void>?
         private let invalidationToken = PromiseInvalidationToken()
    @@ -294,19 +257,11 @@ 

    Cancelling and Invalidation }

    -

    PromiseInvalidationToken also has a method .requestCancelOnInvalidate(_:) that can register any number of Promises to be automatically -requested to cancel (using .requestCancel()) the next time the token is invalidated. Promise also has the same method (except it takes a token as the -argument) as a convenience for calling .requestCancelOnInvalidate(_:) on the token. This can be used to terminate a promise chain without ever assigning -the promise to a local variable. PromiseInvalidationToken also has a method .cancelWithoutInvalidating() which cancels any associated promises -without invalidating the token.

    +

    PromiseInvalidationToken also has a method .requestCancelOnInvalidate(_:) that can register any number of Promises to be automatically requested to cancel (using .requestCancel()) the next time the token is invalidated. Promise also has the same method (except it takes a token as the argument) as a convenience for calling .requestCancelOnInvalidate(_:) on the token. This can be used to terminate a promise chain without ever assigning the promise to a local variable. PromiseInvalidationToken also has a method .cancelWithoutInvalidating() which cancels any associated promises without invalidating the token.

    -

    By default PromiseInvalidationTokens will invalidate themselves automatically when deinitialized. This is primarily useful in conjunction with -requestCancelOnInvalidate(_:) as it allows you to automatically cancel your promises when object that owns the token deinits. This behavior can be -disabled with an optional parameter to init.

    +

    By default PromiseInvalidationTokens will invalidate themselves automatically when deinitialized. This is primarily useful in conjunction with requestCancelOnInvalidate(_:) as it allows you to automatically cancel your promises when object that owns the token deinits. This behavior can be disabled with an optional parameter to init.

    -

    Promise also has a convenience method requestCancelOnDeinit(_:) which can be used to request the Promise to be cancelled when a given object -deinits. This is equivalent to adding a PromiseInvalidationToken property to the object (configured to invalidate on deinit) and requesting cancellation when -the token invalidates, but can be used if the token would otherwise not be explicitly invalidated.

    +

    Promise also has a convenience method requestCancelOnDeinit(_:) which can be used to request the Promise to be cancelled when a given object deinits. This is equivalent to adding a PromiseInvalidationToken property to the object (configured to invalidate on deinit) and requesting cancellation when the token invalidates, but can be used if the token would otherwise not be explicitly invalidated.

    Using these methods, the above loadImage(from:) can be rewritten as the following including cancellation:

    class URLImageView: UIImageView {
    @@ -336,17 +291,10 @@ 

    Cancelling and Invalidation

    Invalidation token chaining

    -

    PromiseInvalidationTokens can be arranged in a tree such that invalidating one token will cascade this invalidation down to other tokens. This is -accomplished by calling childToken.chainInvalidation(from: parentToken). Practically speaking this is no different than just manually invalidating each -child token yourself after invalidating the parent token, but it’s provided as a convenience to make it easy to have fine-grained invalidation control while also having -a simple way to bulk-invalidate tokens. For example, you might have separate tokens for different view controllers that all chain invalidation from a single token that -gets invalidated when the user logs out, thus automatically invalidating all your user-dependent network requests at once while still allowing each view controller the -ability to invalidate just its own requests independently.

    +

    PromiseInvalidationTokens can be arranged in a tree such that invalidating one token will cascade this invalidation down to other tokens. This is accomplished by calling childToken.chainInvalidation(from: parentToken). Practically speaking this is no different than just manually invalidating each child token yourself after invalidating the parent token, but it’s provided as a convenience to make it easy to have fine-grained invalidation control while also having a simple way to bulk-invalidate tokens. For example, you might have separate tokens for different view controllers that all chain invalidation from a single token that gets invalidated when the user logs out, thus automatically invalidating all your user-dependent network requests at once while still allowing each view controller the ability to invalidate just its own requests independently.

    TokenPromise

    -

    In order to avoid the repetition of passing a PromiseInvalidationToken to multiple Promise methods as well as cancelling the resulting promise, a type -TokenPromise exists that handles this for you. You can create a TokenPromise with the Promise.withToken(_:) method. This allows you to take code like -the following:

    +

    In order to avoid the repetition of passing a PromiseInvalidationToken to multiple Promise methods as well as cancelling the resulting promise, a type TokenPromise exists that handles this for you. You can create a TokenPromise with the Promise.withToken(_:) method. This allows you to take code like the following:

    func loadModel() {
         promiseToken.invalidate()
         MyModel.fetchFromNetworkAsPromise()
    @@ -372,30 +320,16 @@ 

    PromiseInvalidationToken‘s -requestCancelOnInvalidate(_:) if you want to be able to cancel the promise later.

    +

    Nearly all callback registration methods will automatically propagate cancellation requests from the child to the parent if the parent has no other observers. If all observers for a promise request cancellation, the cancellation request will propagate upwards at this time. This means that a promise will not automatically cancel as long as there’s at least one interested observer. Do note that promises that have no observers do not get automatically cancelled, this only happens if there’s at least one observer (which then requests cancellation). Automatic cancellation propagation also requires that the promise itself no longer be in scope. For this reason you should avoid holding onto promises long-term and instead use the .cancellable property or PromiseInvalidationToken‘s requestCancelOnInvalidate(_:) if you want to be able to cancel the promise later.

    -

    Automatic cancellation propagation also works with the utility functions when(fulfilled:) and when(first:) as well as the convenience methods -timeout(on:delay:) and delay(on:_:).

    +

    Automatic cancellation propagation also works with the utility functions when(fulfilled:) and when(first:) as well as the convenience methods timeout(on:delay:) and delay(on:_:).

    -

    Promises have a couple of methods that do not participate in automatic cancellation propagation. You can use tap(on:token:_:) as an alternative to always in -order to register an observer that won’t interfere with the existing automatic cancellation propagation (this is suitable for inserting into the middle of a promise -chain). You can also use tap() as a more generic version of this.

    +

    Promises have a couple of methods that do not participate in automatic cancellation propagation. You can use tap(on:token:_:) as an alternative to always in order to register an observer that won’t interfere with the existing automatic cancellation propagation (this is suitable for inserting into the middle of a promise chain). You can also use tap() as a more generic version of this.

    Note that ignoringCancel() disables automatic cancellation propagation on the receiver. Once you invoke this on a promise, it will never automatically cancel.

    propagatingCancellation(on:cancelRequested:)
    -

    In some cases you may need to hold onto a promise without blocking cancellation propagation from its children. The primary use-case here is deduplicating access to -an asynchronous resource (such as a network load). In this scenario you may wish to hold onto a promise and return a new child for every client requesting the same -resource, without preventing cancellation of the resource load if all clients cancel their requests. This can be accomplished by holding onto the result of calling -.propagatingCancellation(on:cancelRequested:). The promise returned from this method will propagate cancellation to its parent as soon as all children -have requested cancellation even if the promise is still in scope. When cancellation is requested, the cancelRequested handler will be invoked immediately prior to -propagating cancellation upwards; this enables you to release your reference to the promise (so a new request by a client will create a brand new resource load). An -example of this might look like:

    +

    In some cases you may need to hold onto a promise without blocking cancellation propagation from its children. The primary use-case here is deduplicating access to an asynchronous resource (such as a network load). In this scenario you may wish to hold onto a promise and return a new child for every client requesting the same resource, without preventing cancellation of the resource load if all clients cancel their requests. This can be accomplished by holding onto the result of calling .propagatingCancellation(on:cancelRequested:). The promise returned from this method will propagate cancellation to its parent as soon as all children have requested cancellation even if the promise is still in scope. When cancellation is requested, the cancelRequested handler will be invoked immediately prior to propagating cancellation upwards; this enables you to release your reference to the promise (so a new request by a client will create a brand new resource load). Returning a new child to each client can be done using makeChild(). An example of this might look like:

    func loadResource(at url: URL) {
         let promise: StdPromise<Model>
         if let existingPromise = resourceLoads[url] {
    @@ -409,24 +343,16 @@ 
    resourceLoads[url] = promise } // Return a new child for each request so all clients have to cancel, not just one. - return promise.then(on: .immediate, { _ in }) + return promise.makeChild() }

    The special .nowOr(_:) context

    -

    There is a special context PromiseContext.nowOr(_:) that behaves a bit differently than other contexts. This context is special in that its callback executes -differently depending on whether the promise it’s being registered on has already resolved by the time the callback is registered. If the promise has already -resolved then .nowOr(context) behaves like .immediate, otherwise it behaves like the wrapped context. This context is intended to be used to replace -code that would otherwise check if the promise.result is non-nil prior to registering a callback.

    +

    There is a special context PromiseContext.nowOr(_:) that behaves a bit differently than other contexts. This context is special in that its callback executes differently depending on whether the promise it’s being registered on has already resolved by the time the callback is registered. If the promise has already resolved then .nowOr(context) behaves like .immediate, otherwise it behaves like the wrapped context. This context is intended to be used to replace code that would otherwise check if the promise.result is non-nil prior to registering a callback.

    -

    If this context is used in Promise.init(on:_:) it always behaves like .immediate, and if it’s used in DelayedPromise.init(on:_:) it always behaves -like the wrapped context.

    +

    If this context is used in Promise.init(on:_:) it always behaves like .immediate, and if it’s used in DelayedPromise.init(on:_:) it always behaves like the wrapped context.

    -

    There is a property PromiseContext.isExecutingNow that can be accessed from within a callback registered with .nowOr(_:) to determine if the callback -is executing synchronously or asynchronously. When accessed from any other context it returns false. When registering a callback with .immediate from -within a callback where PromiseContext.isExecutingNow is true, the nested callback will inherit the PromiseContext.isExecutingNow flag if and only -if the nested callback is also executing synchronously. This is a bit subtle but is intended to allow Promise(on: .immediate, { … }) to inherit the flag from -its surrounding scope.

    +

    There is a property PromiseContext.isExecutingNow that can be accessed from within a callback registered with .nowOr(_:) to determine if the callback is executing synchronously or asynchronously. When accessed from any other context it returns false. When registering a callback with .immediate from within a callback where PromiseContext.isExecutingNow is true, the nested callback will inherit the PromiseContext.isExecutingNow flag if and only if the nested callback is also executing synchronously. This is a bit subtle but is intended to allow Promise(on: .immediate, { … }) to inherit the flag from its surrounding scope.

    An example of how this context might be used is when populating an image view from a network request:

    createNetworkRequestAsPromise()
    @@ -445,41 +371,28 @@ 

    Promise Helpers

    There are a few helper functions that can be used to deal with multiple promises.

    when(fulfilled:)

    -

    when(fulfilled:) is a global function that takes either an array of promises or 2–6 promises as separate arguments, and returns a single promise that is -eventually fulfilled with the values of all input promises. With the array version all input promises must have the same type and the result is fulfilled with an array. -With the separate argument version the promises may have unique value types (but the same error type) and the result is fulfilled with a tuple.

    +

    when(fulfilled:) is a global function that takes either an array of promises or 2–6 promises as separate arguments, and returns a single promise that is eventually fulfilled with the values of all input promises. With the array version all input promises must have the same type and the result is fulfilled with an array. With the separate argument version the promises may have unique value types (but the same error type) and the result is fulfilled with a tuple.

    -

    If any of the input promises is rejected or cancelled, the resulting promise is immediately rejected or cancelled as well. If multiple input promises are rejected or -cancelled, the first such one affects the result.

    +

    If any of the input promises is rejected or cancelled, the resulting promise is immediately rejected or cancelled as well. If multiple input promises are rejected or cancelled, the first such one affects the result.

    This function has an optional parameter cancelOnFailure: that, if provided as true, will cancel all input promises if any of them are rejected.

    when(first:)

    -

    when(first:) is a global function that takes an array of promises of the same type, and returns a single promise that eventually adopts the same value or error as -the first input promise that gets fulfilled or rejected. Cancelled input promises are ignored, unless all input promsies are cancelled, at which point the resulting -promise will be cancelled as well.

    +

    when(first:) is a global function that takes an array of promises of the same type, and returns a single promise that eventually adopts the same value or error as the first input promise that gets fulfilled or rejected. Cancelled input promises are ignored, unless all input promsies are cancelled, at which point the resulting promise will be cancelled as well.

    -

    This function has an optional parameter cancelRemaining: that, if provided as true, will cancel the remaining input promises as soon as one of them is fulfilled -or rejected.

    +

    This function has an optional parameter cancelRemaining: that, if provided as true, will cancel the remaining input promises as soon as one of them is fulfilled or rejected.

    Promise.timeout(on:delay:)

    -

    Promise.timeout(on:delay:) is a method that returns a new promise that adopts the same value as the receiver, or is rejected with an error if the receiver isn’t -resolved within the given interval.

    +

    Promise.timeout(on:delay:) is a method that returns a new promise that adopts the same value as the receiver, or is rejected with an error if the receiver isn’t resolved within the given interval.

    Promise.delay(on:_:)

    -

    Promise.delay(on:_:) is a method that returns a new promise that adopts the same result as the receiver after the specified delay. It is intended primarily for -testing purposes.

    +

    Promise.delay(on:_:) is a method that returns a new promise that adopts the same result as the receiver after the specified delay. It is intended primarily for testing purposes.

    Objective-C

    -

    Tomorrowland has Obj-C compatibility in the form of TWLPromise<ValueType,ErrorType>. This is a parallel promise implementation that can be bridged to/from -Promise and supports all of the same functionality. Note that some of the method names are different (due to lack of overloading), and while TWLPromise is -generic over its types, the return values of callback registration methods that return new promises are not parameterized (due to inability to have generic methods).

    +

    Tomorrowland has Obj-C compatibility in the form of TWLPromise<ValueType,ErrorType>. This is a parallel promise implementation that can be bridged to/from Promise and supports all of the same functionality. Note that some of the method names are different (due to lack of overloading), and while TWLPromise is generic over its types, the return values of callback registration methods that return new promises are not parameterized (due to inability to have generic methods).

    Callback lifetimes

    -

    Callbacks registered on promises will be retained until the promise is resolved. If a callback is invoked (or would be invoked if the relevant invalidation token hadn’t -been invalidated), Tomorrowland guarantees that it will release the callback on the context it was invoked on. If the callback is not invoked (e.g. it’s a then(on:_:) -callback but the promise was rejected) then no guarantees are made as to the context the callback is released on. If you need to ensure it’s released on the -appropriate context (e.g. if it captures an object that must deallocate on the main thread) then you can use .always or one of the .mapResult variants.

    +

    Callbacks registered on promises will be retained until the promise is resolved. If a callback is invoked (or would be invoked if the relevant invalidation token hadn’t been invalidated), Tomorrowland guarantees that it will release the callback on the context it was invoked on. If the callback is not invoked (e.g. it’s a then(on:_:) callback but the promise was rejected) then no guarantees are made as to the context the callback is released on. If you need to ensure it’s released on the appropriate context (e.g. if it captures an object that must deallocate on the main thread) then you can use .always or one of the .mapResult variants.

    Requirements

    Requires a minimum of iOS 9, macOS 10.10, watchOS 2.0, or tvOS 9.0.

    @@ -497,25 +410,32 @@

    Contribution

    Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be dual licensed as above, without any additional terms or conditions.

    Version History

    +

    v1.4.0

    + +
      +
    • Fix the cancellation propagation behavior of Promise.Resolver.resolve(with:) and the flatMap family of methods. Previously, requesting cancellation of the promise associated with the resolver (for resolve(with:), or the returned promise for the flatMap family) would immediately request cancellation of the upstream promise even if the upstream promise had other children. The new behavior fixes this such that it participates in automatic cancellation propagation just like any other child promise (#54).
    • +
    • Slightly optimize stack usage when chaining one promise to another.
    • +
    • Avoid using stack space for chained promises that don’t involve a callback. For example, when the promise returned from a flatMap(on:token:_:) resolves it will resolve the outer promise without using additional stack frames. You can think of it like tail calling functions. This affects not just flatMap but also operations such as tap(), ignoringCancel(), and more. This also applies to Obj-C (with TWLPromise).
    • +
    + +

    Note: This does not affect the variants that implicitly upcast from some E: Swift.Error to Swift.Error such as tryFlatMap(on:token:_:).

    + +
      +
    • Change cancellation propagation behavior of onCancel. Like tap, it doesn’t prevent automatic cancellation propagation if the parent has other children and all other children request cancellation. Unlike tap, requesting cancellation of onCancel when there are no other children will propagate cancellation to the parent. The motivation here is attaching an onCancel observer shouldn’t prevent cancellation that would otherwise occur, but when it’s the only child it should behave like the other standard observers (#57).
    • +
    • Add method Promise.makeChild(). This returns a new child of the receiver that adopts the receiver’s value and propagates cancellation like any other observer. The purpose here is to be used when handing back multiple children of one parent to callers, as handing back the parent means any one caller can cancel it without the other callers’ participation. This is particularly useful in conjunction with propagatingCancellation(on:cancelRequested:) (#56).
    • +

    v1.3.0

      -
    • Add PromiseContext.isExecutingNow (TWLPromiseContext.isExecutingNow in Obj-C) that returns true if accessed from within a callback registered -with .nowOr(_:) and executing synchronously, or false otherwise. If accessed from within a callback (or Promise.init(on:_:)) registered with -.immediate and running synchronously, it inherits the surrounding scope’s PromiseContext.isExecutingNow flag. This is intended to allow -Promise(on: .immediate, { … }) to query the surrounding scope’s flag (#53).
    • +
    • Add PromiseContext.isExecutingNow (TWLPromiseContext.isExecutingNow in Obj-C) that returns true if accessed from within a callback registered with .nowOr(_:) and executing synchronously, or false otherwise. If accessed from within a callback (or Promise.init(on:_:)) registered with .immediate and running synchronously, it inherits the surrounding scope’s PromiseContext.isExecutingNow flag. This is intended to allow Promise(on: .immediate, { … }) to query the surrounding scope’s flag (#53).
    • Add convenience methods to Obj-C for doing then+catch together, as this is a common pattern and chaining Obj-C methods is a little awkward (#45).
    • -
    • Change Promise.timeout’s default context to .nowOr(.auto) for the Error overload as well.
    • -
    • Change the behavior of Promise.timeout(on:delay:) when the delay is less than or equal to zero, the context is .immediate or .nowOr(_:), and the -upstream promise hasn’t resolved yet. Previously the timeout would occur asynchronously and the upstream promise would get a chance to race the timeout. With -the new behavior the timeout occurs synchronously (#49).
    • +
    • Change Promise.timeout‘s default context to .nowOr(.auto) for the Error overload as well.
    • +
    • Change the behavior of Promise.timeout(on:delay:) when the delay is less than or equal to zero, the context is .immediate or .nowOr(_:), and the upstream promise hasn’t resolved yet. Previously the timeout would occur asynchronously and the upstream promise would get a chance to race the timeout. With the new behavior the timeout occurs synchronously (#49).

    v1.2.0

      -
    • Add PromiseContext.nowOr(context) (+[TWLContext nowOrContext:] in Obj-C) that runs the callback synchronously when registered if the promise -has already resolved, otherwise registers the callback to run on context. This can be used to replace code that previously would have required checking -promise.result prior to registering the callback (#34).
    • +
    • Add PromiseContext.nowOr(context) (+[TWLContext nowOrContext:] in Obj-C) that runs the callback synchronously when registered if the promise has already resolved, otherwise registers the callback to run on context. This can be used to replace code that previously would have required checking promise.result prior to registering the callback (#34).

    For example:

    @@ -525,30 +445,20 @@

    v1.2.0

      -
    • Add Promise.Resolver.hasRequestedCancel (TWLResolver.cancelRequested in Obj-C) that returns true if the promise has been requested to -cancel or is already cancelled, or false if it hasn’t been requested to cancel or is fulfilled or rejected. This can be used when a promise initializer takes -significant time in a manner not easily interrupted by an onRequestCancel handler (#47).
    • -
    • Change Promise.timeout’s default context from .auto to .nowOr(.auto). This behaves the same as .auto in most cases, except if the receiver has -already been resolved this will cause the returned promise to likewise already be resolved (#50).
    • -
    • Ensure when(first:cancelRemaining:) returns an already-cancelled promise if all input promises were previously cancelled, instead of cancelling the -returned promise asynchronously (#51).
    • -
    • Ensure when(fulfilled:qos:cancelOnFailure:) returns an already-resolved promise if either all input promises were previously fulfliled or any input -promise was previously rejected or cancelled (#52).
    • +
    • Add Promise.Resolver.hasRequestedCancel (TWLResolver.cancelRequested in Obj-C) that returns true if the promise has been requested to cancel or is already cancelled, or false if it hasn’t been requested to cancel or is fulfilled or rejected. This can be used when a promise initializer takes significant time in a manner not easily interrupted by an onRequestCancel handler (#47).
    • +
    • Change Promise.timeout’s default context from .auto to .nowOr(.auto). This behaves the same as .auto in most cases, except if the receiver has already been resolved this will cause the returned promise to likewise already be resolved (#50).
    • +
    • Ensure when(first:cancelRemaining:) returns an already-cancelled promise if all input promises were previously cancelled, instead of cancelling the returned promise asynchronously (#51).
    • +
    • Ensure when(fulfilled:qos:cancelOnFailure:) returns an already-resolved promise if either all input promises were previously fulfliled or any input promise was previously rejected or cancelled (#52).

    v1.1.1

    v1.1.0

      -
    • Add new method .propagatingCancellation(on:cancelRequested:) that can be used to create a long-lived promise that propagates cancellation from its -children to its parent while it’s still alive. Normally promises don’t propagate cancellation until they themselves are released, in case more children are going to be -added. This new method is intended to be used when deduplicating requests for an asynchronous resource (such as a network load) such that the resource request -can be cancelled in the event that no children care about it anymore (#46).
    • +
    • Add new method .propagatingCancellation(on:cancelRequested:) that can be used to create a long-lived promise that propagates cancellation from its children to its parent while it’s still alive. Normally promises don’t propagate cancellation until they themselves are released, in case more children are going to be added. This new method is intended to be used when deduplicating requests for an asynchronous resource (such as a network load) such that the resource request can be cancelled in the event that no children care about it anymore (#46).

    v1.0.1

    @@ -558,27 +468,18 @@

    v1.0.1

    v1.0.0

      -
    • Fix a rather serious bug where PromiseInvalidationTokens would not deinit as long as any promise whose callback was tied to the token was still unresolved. -This meant that the default invalidateOnDeinit behavior would not trigger and the callback would still fire even though there were no more external references -to the token, and this meant any promises configured to be cancelled when the promise invalidated would not cancel. Tokens used purely for -requestCancelOnInvalidate(_:) would still deallocate, and tokens would still deallocate after any associated promises had resolved.
    • -
    • Tweak the atomic memory ordering used in PromiseInvalidationTokens. After a careful re-reading I don’t believe I was issuing the correct fences previously, -making it possible for tokens whose associated promise callbacks were executing concurrently with a call to requestCancelOnInvalidate(_:) to read the -wrong generation value, and for tokens that had requestCancelOnInvalidate(_:) invoked concurrently on multiple threads to corrupt the generation.
    • -
    • Add PromiseInvalidationToken.chainInvalidation(from:) to invalidate a token whenever another token invalidates. This allows for building a tree of -tokens in order to have both fine-grained and bulk invalidation at the same time. Tokens chained together this way stay chained forever (#43).
    • -
    • Update project file to Swift 5.0. The source already supported this. This change should only affect people using Carthage or anyone adding building this -framework from source.
    • -
    • Update the podspec to list both Swift 4.2 and Swift 5.0. With CocoaPods 1.7.0 or later your Podfile can now declare which version of Swift it’s compatible with. -For anyone using CocoaPods 1.6 or earlier it will default to Swift 5.0.
    • +
    • Fix a rather serious bug where PromiseInvalidationTokens would not deinit as long as any promise whose callback was tied to the token was still unresolved. This meant that the default invalidateOnDeinit behavior would not trigger and the callback would still fire even though there were no more external references to the token, and this meant any promises configured to be cancelled when the promise invalidated would not cancel. Tokens used purely for requestCancelOnInvalidate(_:) would still deallocate, and tokens would still deallocate after any associated promises had resolved.
    • +
    • Tweak the atomic memory ordering used in PromiseInvalidationTokens. After a careful re-reading I don’t believe I was issuing the correct fences previously, making it possible for tokens whose associated promise callbacks were executing concurrently with a call to requestCancelOnInvalidate(_:) to read the wrong generation value, and for tokens that had requestCancelOnInvalidate(_:) invoked concurrently on multiple threads to corrupt the generation.
    • +
    • Add PromiseInvalidationToken.chainInvalidation(from:) to invalidate a token whenever another token invalidates. This allows for building a tree of tokens in order to have both fine-grained and bulk invalidation at the same time. Tokens chained together this way stay chained forever (#43).
    • +
    • Update project file to Swift 5.0. The source already supported this. This change should only affect people using Carthage or anyone adding building this framework from source.
    • +
    • Update the podspec to list both Swift 4.2 and Swift 5.0. With CocoaPods 1.7.0 or later your Podfile can now declare which version of Swift it’s compatible with. For anyone using CocoaPods 1.6 or earlier it will default to Swift 5.0.

    v0.6.0

    • Make DelayedPromise conform to Equatable (#37).
    • Add convenience functions for working with Swift.Result (#39).
    • -
    • Mark all the deprecated functions as unavailable instead. This restores the ability to write code like promise.then({ foo?($0) }) without it incorrectly -resolving to the deprecated form of map(_:) (#35).
    • +
    • Mark all the deprecated functions as unavailable instead. This restores the ability to write code like promise.then({ foo?($0) }) without it incorrectly resolving to the deprecated form of map(_:) (#35).
    • Rename Promise.init(result:) and Promise.init(on:result:after:) to Promise.init(with:) and Promise.init(on:with:after:) (#40).

    v0.5.1

    @@ -588,28 +489,23 @@

    v0.5.1

  • Ensure that if a user-supplied callback is invoked, it is also released on the context where it was invoked (#38).
  • -

    This guarantee is only made for callbacks that are invoked (ignoring tokens). What this means is when using e.g. .then(on:_:) if the promise is fulfilled, the - onSuccess block will be released on the provided context, but if the promise is rejected no such guarantee is made. If you rely on the context it’s released on - (e.g. it captures an object that must deallocate on the main thread) then you can use .always or one of the mapResult variants.

    +

    This guarantee is only made for callbacks that are invoked (ignoring tokens). What this means is when using e.g. .then(on:_:) if the promise is fulfilled, the onSuccess block will be released on the provided context, but if the promise is rejected no such guarantee is made. If you rely on the context it’s released on (e.g. it captures an object that must deallocate on the main thread) then you can use .always or one of the mapResult variants.

    v0.5.0

    -

    This gets rid of most overrides, leaving the only overridden methods to be ones that handle either Swift.Error or E: Swift.Error, and even these overrides - are removed in the Swift 5 compiler.

    +

    This gets rid of most overrides, leaving the only overridden methods to be ones that handle either Swift.Error or E: Swift.Error, and even these overrides are removed in the Swift 5 compiler.

    -

    then is now map or flatMap, recover’s override is now flatMapError, always’s override is now flatMapResult, and similar renames were made for - the try variants.

    +

    then is now map or flatMap, recover’s override is now flatMapError, always’s override is now flatMapResult, and similar renames were made for the try variants.

    • Add a new then method whose block returns Void. The returned promise resolves to the same result as the original promise.
    • Add new mapError and tryMapError methods.
    • Add new mapResult and tryMapResult methods.
    • Extend tryFlatMapError to be available on all Promises instead of just those whose error type is Swift.Error.
    • -
    • Remove the default .auto value for the on context: parameter to most calls. It’s now only provided for the “terminal” callbacks, the ones that don’t return a -value from the handler. This avoids the common problem of running trivial maps on the main thread unnecessarily (#33).
    • +
    • Remove the default .auto value for the on context: parameter to most calls. It’s now only provided for the “terminal” callbacks, the ones that don’t return a value from the handler. This avoids the common problem of running trivial maps on the main thread unnecessarily (#33).

    v0.4.3

    @@ -629,23 +525,16 @@

    v0.4.1

    v0.4

      -
    • Improve the behavior of .delay(on:_:) and .timeout(on:delay:) when using PromiseContext.operationQueue. The relevant operation is now added -to the queue immediately and only becomes ready once the delay/timeout has elapsed.
    • +
    • Improve the behavior of .delay(on:_:) and .timeout(on:delay:) when using PromiseContext.operationQueue. The relevant operation is now added to the queue immediately and only becomes ready once the delay/timeout has elapsed.
    • Add -[TWLPromise initCancelled] to construct a pre-cancelled promise.
    • -
    • Add Promise.init(on:fulfilled:after:), Promise.init(on:rejected:after:), and Promise.init(on:result:after:). These initializers produce -something akin to Promise(fulfilled: value).delay(after) except they respond to cancellation immediately. This makes them more suitable for use as -cancellable timers, as opposed to .delay(_:) which is more intended for debugging (#27).
    • -
    • Try to clean up the callback list when calling PromiseInvalidationToken.requestCancelOnInvalidate(_:). Any deallocated promises at the head of the -callback list will be removed. This will help keep the callback list from growing uncontrollably when a token is used merely to cancel all promises when the owner -deallocates as opposed to being periodically invalidated during its lifetime (#25).
    • -
    • Cancel the .delay(_:) timer if .requestCancel() is invoked and the upstream promise cancelled. This way requested cancels will skip the delay, but -unexpected cancels will still delay the result (#26).
    • +
    • Add Promise.init(on:fulfilled:after:), Promise.init(on:rejected:after:), and Promise.init(on:result:after:). These initializers produce something akin to Promise(fulfilled: value).delay(after) except they respond to cancellation immediately. This makes them more suitable for use as cancellable timers, as opposed to .delay(_:) which is more intended for debugging (#27).
    • +
    • Try to clean up the callback list when calling PromiseInvalidationToken.requestCancelOnInvalidate(_:). Any deallocated promises at the head of the callback list will be removed. This will help keep the callback list from growing uncontrollably when a token is used merely to cancel all promises when the owner deallocates as opposed to being periodically invalidated during its lifetime (#25).
    • +
    • Cancel the .delay(_:) timer if .requestCancel() is invoked and the upstream promise cancelled. This way requested cancels will skip the delay, but unexpected cancels will still delay the result (#26).

    v0.3.4

    v0.3.3

    @@ -676,8 +565,7 @@

    v0.3

    • Add Promise.requestCancelOnInvalidate(_:) as a convenience for token.requestCancelOnInvalidate(_:).
    • Add Promise.requestCancelOnDeinit(_:) as a convenience for adding a token property to an object that invalites on deinit.
    • -
    • Better support for OperationQueue with delay/timeout. Instead of using the OperationQueue’s underlying queue, we instead use a .userInitiated -queue for the timer and hop onto the OperationQueue to resolve the promise.
    • +
    • Better support for OperationQueue with delay/timeout. Instead of using the OperationQueue’s underlying queue, we instead use a .userInitiated queue for the timer and hop onto the OperationQueue to resolve the promise.

    v0.2

    @@ -693,7 +581,7 @@

    v0.1

    diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/search.json b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/search.json index 10637b2..3a649da 100644 --- a/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/search.json +++ b/docs/docsets/Tomorrowland.docset/Contents/Resources/Documents/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:12Tomorrowland17StdDelayedPromisea":{"name":"StdDelayedPromise","abstract":"

    StdDelayedPromise is an alias for a DelayedPromise whose error type is Swift.Error.

    "},"Typealiases.html#/s:12Tomorrowland10StdPromisea":{"name":"StdPromise","abstract":"

    StdPromise is an alias for a Promise whose error type is Swift.Error.

    "},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5innerAA0C0Vyxq_Gvp":{"name":"inner","abstract":"

    The wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5tokenAA0c12InvalidationB0Vvp":{"name":"token","abstract":"

    The PromiseInvalidationToken to use when invoking methods on the wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7promise5tokenACyxq_GAA0C0Vyxq_G_AA0c12InvalidationB0Vtcfc":{"name":"init(promise:token:)","abstract":"

    Returns a new TokenPromise that wraps the given promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4then2on_ACyxq_GAA0C7ContextO_yxctF":{"name":"then(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3map2on_ACyqd__q_GAA0C7ContextO_qd__xctlF":{"name":"map(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7flatMap2on_ACyqd__q_GAA0C7ContextO_AA0C0Vyqd__q_GxctlF":{"name":"flatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5catch2on_ACyxq_GAA0C7ContextO_yq_ctF":{"name":"catch(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7recover2on_ACyxAA7NoErrorOGAA0C7ContextO_xq_ctF":{"name":"recover(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8mapError2on_ACyxqd__GAA0C7ContextO_qd__q_ctlF":{"name":"mapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12flatMapError2on_ACyxqd__GAA0C7ContextO_AA0C0Vyxqd__Gq_ctlF":{"name":"flatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV11tryMapError2on_ACyxs0F0_pGAA0C7ContextO_qd__q_KctsAFRd__lF":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV15tryFlatMapError2on_ACyxs0G0_pGAA0C7ContextO_AA0C0Vyxqd__Gq_KctsAFRd__lF":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapError(on:_:)":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapError(on:_:)":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV6always2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"always(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV9mapResult2on0F8CompleteACyqd__qd_0_GAA0C7ContextO_AA0cE0Oyqd__qd_0_GAKyxq_Gctr0_lF":{"name":"mapResult(on:onComplete:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV13flatMapResult2on_ACyqd__qd_0_GAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cF0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12tryMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0cF0Oyqd__qd_0_GAKyxq_GKctsAFRd_0_r0_lF":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV16tryFlatMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cG0Oyxq_GKctsAFRd_0_r0_lF":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapResult(on:_:)":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapResult(on:_:)":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tap2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"tap(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new TokenPromise that adopts the result of the receiver without affecting its","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8onCancel0D0_ACyxq_GAA0C7ContextO_yyctF":{"name":"onCancel(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the TokenPromise to a block and then returns the TokenPromise for further","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new TokenPromise that adopts the value of the receiver but ignores cancel","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two TokenPromises compare as equal if they represent the same promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE7tryThen2on_ACyxsAD_pGAA0C7ContextO_yxKctF":{"name":"tryThen(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE6tryMap2on_ACyqd__sAD_pGAA0C7ContextO_qd__xKctlF":{"name":"tryMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMap(on:_:)":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryFlatMap2on_ACyqd__sAD_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryRecover2on_ACyxsAD_pGAA0C7ContextO_xsAD_pKctF":{"name":"tryRecover(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE010tryFlatMapD02on_ACyxsAD_pGAA0C7ContextO_AA0C0Vyxqd__GsAD_pKctsADRd__lF":{"name":"tryFlatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV18invalidateOnDeinitACSb_tcfc":{"name":"init(invalidateOnDeinit:)","abstract":"

    Creates and returns a new PromiseInvalidationToken.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV10invalidateyyF":{"name":"invalidate()","abstract":"

    Invalidates the token and cancels any associated promises.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25cancelWithoutInvalidatingyyF":{"name":"cancelWithoutInvalidating()","abstract":"

    Cancels any associated promises without invalidating the token.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyyAA0B0Vyxq_Gr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers a Promise to be requested to cancel automatically when the token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyySo10TWLPromiseCyxq_GRlzCRl_Cr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers an ObjCPromise to be requested to cancel automatically when the token is","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV05chainC04from34includingCancelWithoutInvalidatingyAC_SbtF":{"name":"chainInvalidation(from:includingCancelWithoutInvalidating:)","abstract":"

    Invalidates the token whenever another token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s28CustomDebugStringConvertibleP16debugDescriptionSSvp":{"name":"debugDescription","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseInvalidationToken"},"Structs/PromiseCancellable.html#/s:12Tomorrowland18PromiseCancellableV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests cancellation of the promise this PromiseCancellable was created from.

    ","parent_name":"PromiseCancellable"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7fulfill4withyx_tF":{"name":"fulfill(with:)","abstract":"

    Fulfills the promise with the given value.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6reject4withyq__tF":{"name":"reject(with:)","abstract":"

    Rejects the promise with the given error.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6cancelyyF":{"name":"cancel()","abstract":"

    Cancels the promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyAA0B6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyACyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with another promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV15onRequestCancel0D0_yAA0B7ContextO_yAEyxq__GctF":{"name":"onRequestCancel(on:_:)","abstract":"

    Registers a block that will be invoked if requestCancel() is invoked on the promise","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV18hasRequestedCancelSbvp":{"name":"hasRequestedCancel","abstract":"

    Returns whether the promise has already been requested to cancel.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE7resolve4withyAA0B6ResultOyxqd__G_tsAFRd__lF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE14handleCallback08isCancelD0yxSg_sAF_pSgtcSbsAF_pc_tF":{"name":"handleCallback(isCancelError:)","abstract":"

    Convenience method for handling framework callbacks.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5ErrorR_rlE7resolve4withys6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html":{"name":"Resolver","abstract":"

    A Resolver is used to fulfill, reject, or cancel its associated Promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultAA0B6ResultOyxq_GSgvp":{"name":"result","abstract":"

    Returns the result of the promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16makeWithResolverACyxq_G_AC0E0Vyxq__GtyFZ":{"name":"makeWithResolver()","abstract":"

    Returns a Promise and a Promise.Resolver that can be used to fulfill that promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on_ACyxq_GAA0B7ContextO_yAC8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9fulfilledACyxq_Gx_tcfc":{"name":"init(fulfilled:)","abstract":"

    Returns a Promise that is already fulfilled with the given value.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8rejectedACyxq_Gq__tcfc":{"name":"init(rejected:)","abstract":"

    Returns a Promise that is already rejected with the given error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4withACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4then2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyxctF":{"name":"then(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3map2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xctlF":{"name":"map(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7flatMap2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgAGxctlF":{"name":"flatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5catch2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyq_ctF":{"name":"catch(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7recover2on5token_ACyxAA7NoErrorOGAA0B7ContextO_AA0B17InvalidationTokenVSgxq_ctF":{"name":"recover(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8mapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_ctlF":{"name":"mapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12flatMapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgAGq_ctlF":{"name":"flatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11tryMapError2on5token_ACyxs0E0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_KctsAGRd__lF":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV15tryFlatMapError2on5token_ACyxs0F0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyxqd__Gq_KctsAGRd__lF":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryMapError(on:token:_:)":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapError(on:token:_:)":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6always2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"always(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9mapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bD0Oyqd__qd_0_GANyxq_Gctr0_lF":{"name":"mapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13flatMapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAgA0bE0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12tryMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bE0Oyqd__qd_0_GAOyxq_GKctsAGRd_0_r0_lF":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16tryFlatMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GAA0bF0Oyxq_GKctsAGRd_0_r0_lF":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryMapResult(on:token:_:)":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapResult(on:token:_:)":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tap2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"tap(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new Promise that adopts the result of the receiver without affecting its behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8onCancel0C05token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyyctF":{"name":"onCancel(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV23propagatingCancellation2on15cancelRequestedACyxq_GAA0B7ContextO_yAGctF":{"name":"propagatingCancellation(on:cancelRequested:)","abstract":"

    Returns a promise that adopts the same value as the receiver, and propagates cancellation","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the Promise to a block and then returns the Promise for further chaining.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests that the Promise should be cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV25requestCancelOnInvalidateyACyxq_GAA0B17InvalidationTokenVF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Requests that the Promise should be cancelled when the token is invalidated.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new Promise that adopts the value of the receiver but ignores cancel requests.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(result:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on6result5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:result:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV21requestCancelOnDeinityACyxq_GyXlF":{"name":"requestCancelOnDeinit(_:)","abstract":"

    Requests that the Promise should be cancelled when the object deinits.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two Promises compare as equal if they represent the same promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11cancellableAA0B11CancellableVvp":{"name":"cancellable","abstract":"

    Returns a value that can be used to cancel this promise without holding onto the full promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9withTokenyAA0dB0Vyxq_GAA0b12InvalidationD0VF":{"name":"withToken(_:)","abstract":"

    Returns a new TokenPromise that wraps the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on9fulfilled5afterACyxq_GAA0B7ContextO_xSdtcfc":{"name":"init(on:fulfilled:after:)","abstract":"

    Returns a Promise that fulfills with the given value after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on8rejected5afterACyxq_GAA0B7ContextO_q_Sdtcfc":{"name":"init(on:rejected:after:)","abstract":"

    Returns a Promise that rejects with the given error after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on4with5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:with:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5delay2on_ACyxq_GAA0B7ContextO_SdtF":{"name":"delay(on:_:)","abstract":"

    Returns a new Promise that adopts the receiver’s result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7timeout2on5delayACyxAA0B12TimeoutErrorOyq_GGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE6upcastACyxsAD_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVA2A7NoErrorORs_rlE6upcastACyxs0D0_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE2on_ACyxsAD_pGAA0B7ContextO_yAC8ResolverVyxsAD_p_GKctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7tryThen2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgyxKctF":{"name":"tryThen(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE6tryMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xKctlF":{"name":"tryMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMap(on:token:_:)":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryFlatMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryRecover2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgxsAD_pKctF":{"name":"tryRecover(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE4withACyxq_Gs6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7timeout2on5delayACyxsAD_pGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV8Resolvera":{"name":"Resolver","abstract":"

    The type of the promise resolver. See Promise<Value,Error>.Resolver.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2on_ACyxq_GAA0C7ContextO_yAA0C0V8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new DelayedPromise that can be resolved with the given block.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV7promiseAA0C0Vyxq_Gvp":{"name":"promise","abstract":"

    Returns a Promise that asynchronously contains the value of the computation.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two DelayedPromises compare as equal if they would produce equal Promises.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html":{"name":"DelayedPromise","abstract":"

    DelayedPromise is like a Promise but it doesn’t invoke its callback until the .promise"},"Structs/Promise.html":{"name":"Promise","abstract":"

    A Promise is a construct that will eventually hold a value or error, and can invoke callbacks"},"Structs/PromiseCancellable.html":{"name":"PromiseCancellable","abstract":"

    A type that can be used to cancel a promise without holding onto the full promise.

    "},"Structs/PromiseInvalidationToken.html":{"name":"PromiseInvalidationToken","abstract":"

    An invalidation token that can be used to cancel callbacks registered to a Promise.

    "},"Structs/TokenPromise.html":{"name":"TokenPromise","abstract":"

    A Promise adapter that automatically applies a PromiseInvalidationToken.

    "},"Functions.html#/s:12Tomorrowland4when9fulfilled3qos15cancelOnFailureAA7PromiseVySayxGq_GSayAGyxq_GG_8Dispatch0I3QoSV0J6SClassOSbtr0_lF":{"name":"when(fulfilled:qos:cancelOnFailure:)","abstract":"

    Waits on an array of Promises and returns a Promise that is fulfilled with an array of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_q3_tq4_GAGyxq4_G_AGyq_q4_GAGyq0_q4_GAGyq1_q4_GAGyq2_q4_GAGyq3_q4_G8Dispatch0I3QoSV0J6SClassOSbtr5_lF":{"name":"when(fulfilled:_:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_tq3_GAGyxq3_G_AGyq_q3_GAGyq0_q3_GAGyq1_q3_GAGyq2_q3_G8Dispatch0I3QoSV0J6SClassOSbtr4_lF":{"name":"when(fulfilled:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled___3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_tq2_GAGyxq2_G_AGyq_q2_GAGyq0_q2_GAGyq1_q2_G8Dispatch0I3QoSV0J6SClassOSbtr3_lF":{"name":"when(fulfilled:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled__3qos15cancelOnFailureAA7PromiseVyx_q_q0_tq1_GAGyxq1_G_AGyq_q1_GAGyq0_q1_G8Dispatch0I3QoSV0J6SClassOSbtr2_lF":{"name":"when(fulfilled:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_3qos15cancelOnFailureAA7PromiseVyx_q_tq0_GAGyxq0_G_AGyq_q0_G8Dispatch0I3QoSV0J6SClassOSbtr1_lF":{"name":"when(fulfilled:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when5first15cancelRemainingAA7PromiseVyxq_GSayAGG_Sbtr0_lF":{"name":"when(first:cancelRemaining:)","abstract":"

    Returns a Promise that is resolved with the result of the first resolved input Promise.

    "},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8timedOutyACyxGAEmlF":{"name":"timedOut","abstract":"

    The promise did not resolve within the given interval.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8rejectedyACyxGxcAEmlF":{"name":"rejected(_:)","abstract":"

    The promise was rejected with an error.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2eeoiySbACyxG_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2neoiySbACyxG_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseTimeoutError"},"Enums/NoError.html#/s:12Tomorrowland7NoErrorO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"NoError"},"Enums/NoError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"NoError"},"Enums/NoError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"NoError"},"Enums/NoError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"NoError"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valueyACyxq_GxcAEmr0_lF":{"name":"value(_:)","abstract":"

    The value the promise was fulfilled with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5erroryACyxq_Gq_cAEmr0_lF":{"name":"error(_:)","abstract":"

    The error the promise was rejected with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO9cancelledyACyxq_GAEmr0_lF":{"name":"cancelled","abstract":"

    The promise was cancelled.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valuexSgvp":{"name":"value","abstract":"

    Returns the contained value if the result is .value, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5errorq_Sgvp":{"name":"error","abstract":"

    Returns the contained error if the result is .error, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO11isCancelledSbvp":{"name":"isCancelled","abstract":"

    Returns true if the result is .cancelled, otherwise false.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO3mapyACyqd__q_Gqd__xKXEKlF":{"name":"map(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO8mapErroryACyxqd__Gqd__q_KXEKlF":{"name":"mapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO7flatMapyACyqd__q_GAExKXEKlF":{"name":"flatMap(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO12flatMapErroryACyxqd__GAEq_KXEKlF":{"name":"flatMapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2neoiySbACyxq_G_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAAs5ErrorR_rlEyACyxq_Gs0C0Oyxq_Gcfc":{"name":"init(_:)","abstract":"

    Returns a PromiseResult from a Result.

    ","parent_name":"PromiseResult"},"Enums/PromiseCallbackError.html#/c:@M@Tomorrowland@E@TWLPromiseCallbackError@TWLPromiseCallbackErrorAPIMismatch":{"name":"apiMismatch","abstract":"

    The callback did not conform to the expected API.

    ","parent_name":"PromiseCallbackError"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4mainyA2CmF":{"name":"main","abstract":"

    Execute on the main queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO10backgroundyA2CmF":{"name":"background","abstract":"

    Execute on a dispatch queue with the .background QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7utilityyA2CmF":{"name":"utility","abstract":"

    Execute on a dispatch queue with the .utility QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7defaultyA2CmF":{"name":"default","abstract":"

    Execute on a dispatch queue with the .default QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO13userInitiatedyA2CmF":{"name":"userInitiated","abstract":"

    Execute on a dispatch queue with the .userInitiated QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO15userInteractiveyA2CmF":{"name":"userInteractive","abstract":"

    Execute on a dispatch queue with the .userInteractive QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5queueyACSo012OS_dispatch_D0CcACmF":{"name":"queue(_:)","abstract":"

    Execute on the specified dispatch queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14operationQueueyACSo011NSOperationE0CcACmF":{"name":"operationQueue(_:)","abstract":"

    Execute on the specified operation queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO9immediateyA2CmF":{"name":"immediate","abstract":"

    Execute synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5nowOryA2CcACmF":{"name":"nowOr(_:)","abstract":"

    Execute synchronously if the promise is already resolved, otherwise use another context.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4autoACvpZ":{"name":"auto","abstract":"

    Returns .main when accessed from the main thread, otherwise .default.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14isExecutingNowSbvpZ":{"name":"isExecutingNow","abstract":"

    Returns whether a .nowOr(_:) context is executing synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO3qosAC8Dispatch0E3QoSV0F6SClassO_tcfc":{"name":"init(qos:)","abstract":"

    Returns the PromiseContext that corresponds to a given Dispatch QoS class.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html":{"name":"PromiseContext","abstract":"

    The context in which a Promise body or callback is evaluated.

    "},"Enums/PromiseCallbackError.html":{"name":"PromiseCallbackError","abstract":"

    An error potentially returned from Promise.Resolver.handleCallback(isCancelError:).

    "},"Enums/PromiseResult.html":{"name":"PromiseResult","abstract":"

    The result of a resolved promise.

    "},"Enums/NoError.html":{"name":"NoError","abstract":"

    NoError is a type that cannot be constructed.

    "},"Enums/PromiseTimeoutError.html":{"name":"PromiseTimeoutError","abstract":"

    The error type returned from Promise.timeout.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Functions.html":{"name":"Functions","abstract":"

    The following functions are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/s:12Tomorrowland17StdDelayedPromisea":{"name":"StdDelayedPromise","abstract":"

    StdDelayedPromise is an alias for a DelayedPromise whose error type is Swift.Error.

    "},"Typealiases.html#/s:12Tomorrowland10StdPromisea":{"name":"StdPromise","abstract":"

    StdPromise is an alias for a Promise whose error type is Swift.Error.

    "},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5innerAA0C0Vyxq_Gvp":{"name":"inner","abstract":"

    The wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5tokenAA0c12InvalidationB0Vvp":{"name":"token","abstract":"

    The PromiseInvalidationToken to use when invoking methods on the wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7promise5tokenACyxq_GAA0C0Vyxq_G_AA0c12InvalidationB0Vtcfc":{"name":"init(promise:token:)","abstract":"

    Returns a new TokenPromise that wraps the given promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4then2on_ACyxq_GAA0C7ContextO_yxctF":{"name":"then(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3map2on_ACyqd__q_GAA0C7ContextO_qd__xctlF":{"name":"map(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7flatMap2on_ACyqd__q_GAA0C7ContextO_AA0C0Vyqd__q_GxctlF":{"name":"flatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5catch2on_ACyxq_GAA0C7ContextO_yq_ctF":{"name":"catch(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7recover2on_ACyxAA7NoErrorOGAA0C7ContextO_xq_ctF":{"name":"recover(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8mapError2on_ACyxqd__GAA0C7ContextO_qd__q_ctlF":{"name":"mapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12flatMapError2on_ACyxqd__GAA0C7ContextO_AA0C0Vyxqd__Gq_ctlF":{"name":"flatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV11tryMapError2on_ACyxs0F0_pGAA0C7ContextO_qd__q_KctsAFRd__lF":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV15tryFlatMapError2on_ACyxs0G0_pGAA0C7ContextO_AA0C0Vyxqd__Gq_KctsAFRd__lF":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapError(on:_:)":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapError(on:_:)":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV6always2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"always(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV9mapResult2on0F8CompleteACyqd__qd_0_GAA0C7ContextO_AA0cE0Oyqd__qd_0_GAKyxq_Gctr0_lF":{"name":"mapResult(on:onComplete:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV13flatMapResult2on_ACyqd__qd_0_GAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cF0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12tryMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0cF0Oyqd__qd_0_GAKyxq_GKctsAFRd_0_r0_lF":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV16tryFlatMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cG0Oyxq_GKctsAFRd_0_r0_lF":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapResult(on:_:)":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapResult(on:_:)":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tap2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"tap(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new TokenPromise that adopts the result of the receiver without affecting its","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8onCancel0D0_ACyxq_GAA0C7ContextO_yyctF":{"name":"onCancel(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the TokenPromise to a block and then returns the TokenPromise for further","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new TokenPromise that adopts the value of the receiver but ignores cancel","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two TokenPromises compare as equal if they represent the same promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE7tryThen2on_ACyxsAD_pGAA0C7ContextO_yxKctF":{"name":"tryThen(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE6tryMap2on_ACyqd__sAD_pGAA0C7ContextO_qd__xKctlF":{"name":"tryMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMap(on:_:)":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryFlatMap2on_ACyqd__sAD_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryRecover2on_ACyxsAD_pGAA0C7ContextO_xsAD_pKctF":{"name":"tryRecover(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE010tryFlatMapD02on_ACyxsAD_pGAA0C7ContextO_AA0C0Vyxqd__GsAD_pKctsADRd__lF":{"name":"tryFlatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV18invalidateOnDeinitACSb_tcfc":{"name":"init(invalidateOnDeinit:)","abstract":"

    Creates and returns a new PromiseInvalidationToken.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV10invalidateyyF":{"name":"invalidate()","abstract":"

    Invalidates the token and cancels any associated promises.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25cancelWithoutInvalidatingyyF":{"name":"cancelWithoutInvalidating()","abstract":"

    Cancels any associated promises without invalidating the token.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyyAA0B0Vyxq_Gr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers a Promise to be requested to cancel automatically when the token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyySo10TWLPromiseCyxq_GRlzCRl_Cr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers an ObjCPromise to be requested to cancel automatically when the token is","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV05chainC04from34includingCancelWithoutInvalidatingyAC_SbtF":{"name":"chainInvalidation(from:includingCancelWithoutInvalidating:)","abstract":"

    Invalidates the token whenever another token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s28CustomDebugStringConvertibleP16debugDescriptionSSvp":{"name":"debugDescription","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseInvalidationToken"},"Structs/PromiseCancellable.html#/s:12Tomorrowland18PromiseCancellableV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests cancellation of the promise this PromiseCancellable was created from.

    ","parent_name":"PromiseCancellable"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7fulfill4withyx_tF":{"name":"fulfill(with:)","abstract":"

    Fulfills the promise with the given value.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6reject4withyq__tF":{"name":"reject(with:)","abstract":"

    Rejects the promise with the given error.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6cancelyyF":{"name":"cancel()","abstract":"

    Cancels the promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyAA0B6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyACyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with another promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV15onRequestCancel0D0_yAA0B7ContextO_yAEyxq__GctF":{"name":"onRequestCancel(on:_:)","abstract":"

    Registers a block that will be invoked if requestCancel() is invoked on the promise","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV18hasRequestedCancelSbvp":{"name":"hasRequestedCancel","abstract":"

    Returns whether the promise has already been requested to cancel.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE7resolve4withyAA0B6ResultOyxqd__G_tsAFRd__lF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE14handleCallback08isCancelD0yxSg_sAF_pSgtcSbsAF_pc_tF":{"name":"handleCallback(isCancelError:)","abstract":"

    Convenience method for handling framework callbacks.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5ErrorR_rlE7resolve4withys6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html":{"name":"Resolver","abstract":"

    A Resolver is used to fulfill, reject, or cancel its associated Promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultAA0B6ResultOyxq_GSgvp":{"name":"result","abstract":"

    Returns the result of the promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16makeWithResolverACyxq_G_AC0E0Vyxq__GtyFZ":{"name":"makeWithResolver()","abstract":"

    Returns a Promise and a Promise.Resolver that can be used to fulfill that promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on_ACyxq_GAA0B7ContextO_yAC8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9fulfilledACyxq_Gx_tcfc":{"name":"init(fulfilled:)","abstract":"

    Returns a Promise that is already fulfilled with the given value.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8rejectedACyxq_Gq__tcfc":{"name":"init(rejected:)","abstract":"

    Returns a Promise that is already rejected with the given error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4withACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4then2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyxctF":{"name":"then(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3map2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xctlF":{"name":"map(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7flatMap2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgAGxctlF":{"name":"flatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5catch2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyq_ctF":{"name":"catch(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7recover2on5token_ACyxAA7NoErrorOGAA0B7ContextO_AA0B17InvalidationTokenVSgxq_ctF":{"name":"recover(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8mapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_ctlF":{"name":"mapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12flatMapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgAGq_ctlF":{"name":"flatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11tryMapError2on5token_ACyxs0E0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_KctsAGRd__lF":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV15tryFlatMapError2on5token_ACyxs0F0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyxqd__Gq_KctsAGRd__lF":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryMapError(on:token:_:)":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapError(on:token:_:)":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6always2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"always(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9mapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bD0Oyqd__qd_0_GANyxq_Gctr0_lF":{"name":"mapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13flatMapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAgA0bE0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12tryMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bE0Oyqd__qd_0_GAOyxq_GKctsAGRd_0_r0_lF":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16tryFlatMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GAA0bF0Oyxq_GKctsAGRd_0_r0_lF":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryMapResult(on:token:_:)":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapResult(on:token:_:)":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tap2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"tap(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new Promise that adopts the result of the receiver without affecting its behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8onCancel0C05token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyyctF":{"name":"onCancel(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV23propagatingCancellation2on15cancelRequestedACyxq_GAA0B7ContextO_yAGctF":{"name":"propagatingCancellation(on:cancelRequested:)","abstract":"

    Returns a promise that adopts the same value as the receiver, and propagates cancellation","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9makeChildACyxq_GyF":{"name":"makeChild()","abstract":"

    Returns a promise that adopts the same value as the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the Promise to a block and then returns the Promise for further chaining.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests that the Promise should be cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV25requestCancelOnInvalidateyACyxq_GAA0B17InvalidationTokenVF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Requests that the Promise should be cancelled when the token is invalidated.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new Promise that adopts the value of the receiver but ignores cancel requests.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(result:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on6result5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:result:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV21requestCancelOnDeinityACyxq_GyXlF":{"name":"requestCancelOnDeinit(_:)","abstract":"

    Requests that the Promise should be cancelled when the object deinits.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two Promises compare as equal if they represent the same promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11cancellableAA0B11CancellableVvp":{"name":"cancellable","abstract":"

    Returns a value that can be used to cancel this promise without holding onto the full promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9withTokenyAA0dB0Vyxq_GAA0b12InvalidationD0VF":{"name":"withToken(_:)","abstract":"

    Returns a new TokenPromise that wraps the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on9fulfilled5afterACyxq_GAA0B7ContextO_xSdtcfc":{"name":"init(on:fulfilled:after:)","abstract":"

    Returns a Promise that fulfills with the given value after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on8rejected5afterACyxq_GAA0B7ContextO_q_Sdtcfc":{"name":"init(on:rejected:after:)","abstract":"

    Returns a Promise that rejects with the given error after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on4with5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:with:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5delay2on_ACyxq_GAA0B7ContextO_SdtF":{"name":"delay(on:_:)","abstract":"

    Returns a new Promise that adopts the receiver’s result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7timeout2on5delayACyxAA0B12TimeoutErrorOyq_GGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE6upcastACyxsAD_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVA2A7NoErrorORs_rlE6upcastACyxs0D0_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE2on_ACyxsAD_pGAA0B7ContextO_yAC8ResolverVyxsAD_p_GKctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7tryThen2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgyxKctF":{"name":"tryThen(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE6tryMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xKctlF":{"name":"tryMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMap(on:token:_:)":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryFlatMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryRecover2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgxsAD_pKctF":{"name":"tryRecover(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE4withACyxq_Gs6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7timeout2on5delayACyxsAD_pGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV8Resolvera":{"name":"Resolver","abstract":"

    The type of the promise resolver. See Promise<Value,Error>.Resolver.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2on_ACyxq_GAA0C7ContextO_yAA0C0V8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new DelayedPromise that can be resolved with the given block.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV7promiseAA0C0Vyxq_Gvp":{"name":"promise","abstract":"

    Returns a Promise that asynchronously contains the value of the computation.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two DelayedPromises compare as equal if they would produce equal Promises.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html":{"name":"DelayedPromise","abstract":"

    DelayedPromise is like a Promise but it doesn’t invoke its callback until the .promise"},"Structs/Promise.html":{"name":"Promise","abstract":"

    A Promise is a construct that will eventually hold a value or error, and can invoke callbacks"},"Structs/PromiseCancellable.html":{"name":"PromiseCancellable","abstract":"

    A type that can be used to cancel a promise without holding onto the full promise.

    "},"Structs/PromiseInvalidationToken.html":{"name":"PromiseInvalidationToken","abstract":"

    An invalidation token that can be used to cancel callbacks registered to a Promise.

    "},"Structs/TokenPromise.html":{"name":"TokenPromise","abstract":"

    A Promise adapter that automatically applies a PromiseInvalidationToken.

    "},"Functions.html#/s:12Tomorrowland4when9fulfilled3qos15cancelOnFailureAA7PromiseVySayxGq_GSayAGyxq_GG_8Dispatch0I3QoSV0J6SClassOSbtr0_lF":{"name":"when(fulfilled:qos:cancelOnFailure:)","abstract":"

    Waits on an array of Promises and returns a Promise that is fulfilled with an array of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_q3_tq4_GAGyxq4_G_AGyq_q4_GAGyq0_q4_GAGyq1_q4_GAGyq2_q4_GAGyq3_q4_G8Dispatch0I3QoSV0J6SClassOSbtr5_lF":{"name":"when(fulfilled:_:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_tq3_GAGyxq3_G_AGyq_q3_GAGyq0_q3_GAGyq1_q3_GAGyq2_q3_G8Dispatch0I3QoSV0J6SClassOSbtr4_lF":{"name":"when(fulfilled:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled___3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_tq2_GAGyxq2_G_AGyq_q2_GAGyq0_q2_GAGyq1_q2_G8Dispatch0I3QoSV0J6SClassOSbtr3_lF":{"name":"when(fulfilled:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled__3qos15cancelOnFailureAA7PromiseVyx_q_q0_tq1_GAGyxq1_G_AGyq_q1_GAGyq0_q1_G8Dispatch0I3QoSV0J6SClassOSbtr2_lF":{"name":"when(fulfilled:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_3qos15cancelOnFailureAA7PromiseVyx_q_tq0_GAGyxq0_G_AGyq_q0_G8Dispatch0I3QoSV0J6SClassOSbtr1_lF":{"name":"when(fulfilled:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when5first15cancelRemainingAA7PromiseVyxq_GSayAGG_Sbtr0_lF":{"name":"when(first:cancelRemaining:)","abstract":"

    Returns a Promise that is resolved with the result of the first resolved input Promise.

    "},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8timedOutyACyxGAEmlF":{"name":"timedOut","abstract":"

    The promise did not resolve within the given interval.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8rejectedyACyxGxcAEmlF":{"name":"rejected(_:)","abstract":"

    The promise was rejected with an error.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2eeoiySbACyxG_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2neoiySbACyxG_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseTimeoutError"},"Enums/NoError.html#/s:12Tomorrowland7NoErrorO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"NoError"},"Enums/NoError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"NoError"},"Enums/NoError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"NoError"},"Enums/NoError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"NoError"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valueyACyxq_GxcAEmr0_lF":{"name":"value(_:)","abstract":"

    The value the promise was fulfilled with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5erroryACyxq_Gq_cAEmr0_lF":{"name":"error(_:)","abstract":"

    The error the promise was rejected with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO9cancelledyACyxq_GAEmr0_lF":{"name":"cancelled","abstract":"

    The promise was cancelled.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valuexSgvp":{"name":"value","abstract":"

    Returns the contained value if the result is .value, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5errorq_Sgvp":{"name":"error","abstract":"

    Returns the contained error if the result is .error, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO11isCancelledSbvp":{"name":"isCancelled","abstract":"

    Returns true if the result is .cancelled, otherwise false.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO3mapyACyqd__q_Gqd__xKXEKlF":{"name":"map(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO8mapErroryACyxqd__Gqd__q_KXEKlF":{"name":"mapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO7flatMapyACyqd__q_GAExKXEKlF":{"name":"flatMap(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO12flatMapErroryACyxqd__GAEq_KXEKlF":{"name":"flatMapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2neoiySbACyxq_G_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAAs5ErrorR_rlEyACyxq_Gs0C0Oyxq_Gcfc":{"name":"init(_:)","abstract":"

    Returns a PromiseResult from a Result.

    ","parent_name":"PromiseResult"},"Enums/PromiseCallbackError.html#/c:@M@Tomorrowland@E@TWLPromiseCallbackError@TWLPromiseCallbackErrorAPIMismatch":{"name":"apiMismatch","abstract":"

    The callback did not conform to the expected API.

    ","parent_name":"PromiseCallbackError"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4mainyA2CmF":{"name":"main","abstract":"

    Execute on the main queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO10backgroundyA2CmF":{"name":"background","abstract":"

    Execute on a dispatch queue with the .background QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7utilityyA2CmF":{"name":"utility","abstract":"

    Execute on a dispatch queue with the .utility QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7defaultyA2CmF":{"name":"default","abstract":"

    Execute on a dispatch queue with the .default QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO13userInitiatedyA2CmF":{"name":"userInitiated","abstract":"

    Execute on a dispatch queue with the .userInitiated QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO15userInteractiveyA2CmF":{"name":"userInteractive","abstract":"

    Execute on a dispatch queue with the .userInteractive QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5queueyACSo012OS_dispatch_D0CcACmF":{"name":"queue(_:)","abstract":"

    Execute on the specified dispatch queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14operationQueueyACSo011NSOperationE0CcACmF":{"name":"operationQueue(_:)","abstract":"

    Execute on the specified operation queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO9immediateyA2CmF":{"name":"immediate","abstract":"

    Execute synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5nowOryA2CcACmF":{"name":"nowOr(_:)","abstract":"

    Execute synchronously if the promise is already resolved, otherwise use another context.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4autoACvpZ":{"name":"auto","abstract":"

    Returns .main when accessed from the main thread, otherwise .default.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14isExecutingNowSbvpZ":{"name":"isExecutingNow","abstract":"

    Returns whether a .nowOr(_:) context is executing synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO3qosAC8Dispatch0E3QoSV0F6SClassO_tcfc":{"name":"init(qos:)","abstract":"

    Returns the PromiseContext that corresponds to a given Dispatch QoS class.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html":{"name":"PromiseContext","abstract":"

    The context in which a Promise body or callback is evaluated.

    "},"Enums/PromiseCallbackError.html":{"name":"PromiseCallbackError","abstract":"

    An error potentially returned from Promise.Resolver.handleCallback(isCancelError:).

    "},"Enums/PromiseResult.html":{"name":"PromiseResult","abstract":"

    The result of a resolved promise.

    "},"Enums/NoError.html":{"name":"NoError","abstract":"

    NoError is a type that cannot be constructed.

    "},"Enums/PromiseTimeoutError.html":{"name":"PromiseTimeoutError","abstract":"

    The error type returned from Promise.timeout.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Functions.html":{"name":"Functions","abstract":"

    The following functions are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file diff --git a/docs/docsets/Tomorrowland.docset/Contents/Resources/docSet.dsidx b/docs/docsets/Tomorrowland.docset/Contents/Resources/docSet.dsidx index 9cfae1ada0eba0ec8c3d0922274056eff06e2c08..1f85035c25b180ef04365fbed985606cbb30399d 100644 GIT binary patch delta 2370 zcmZWqX;4*H5@X_K1 zZpj#9G|AwNqDDd7aW^qqI#r`i)zplrL8s=&WSpwZ!I;!c&HZt1b)Qq!-CuuScl{H# z{t3I)3aZm{mRTi1v(6g`A&e=Am^PV$R3DdKqZ(v7>oUQUy0z=*Atup7h@=Pa%@{fe zr|$!5=#5c^9@9qSH~PMA`KTU`PyAkEiX*;G*#}PtZiI9-Du@Rzi$0BX$_{J}u7m^a zAzo3sD%}!YppMgC);4RGX?4;gX^#{o8O1YVrMN`&CbH1M5Am72#2w&fXbx(^*_-TA zrVsuGxge4*XY>e^L&iflnkVH$Ce}_$g}v&ZCf#9R3w|A%2Pvw@`xyXTSQnNA2k~Lp zCfKcJPE7})%8&E0`ZKuUnN1{rh~a$P^8t%eB2gFqR4AU#O?I2ZpgDd7ZXYz`qXDx> zz6{|4+#C!p9vsJzBlt3W4pd@)$Rs$7VG$0fzyy1w@I?S;wS)rhpXP>JBlJSKA7^#5 zGdOY3#*m}<-0lxwV^@eDe1&@=LWQzS-eyrIpo_y@eHCE=SdCgoj!;@T>|Thk9iBAy zOnl%Nfm>#X_;*J>Y{S)&>F_!BM}8oF^vgR2`v!^_(ul1yO6GTHDa^hkg_w?;GEJhf z%NStjF^to1(VKPE+Phj`DTe}lSezy_3L@Xf7xNxmFPEtKtENF?WG}N-tSeIsub`6r zg`^Avyl3V{DNS+VM_ZIyz}vf8#GI;OWB#xah5w$_3$prcOgz9&)WpU?GtP@G6?bLw zqpS)A7+$Vq$ftNN_C6%xj<{~vh;!l>@Z00L(UwA75I+(ZUNvJ-yazO?PvcV0veIQvfIqWZW5`(A-?p@rvetqNWAd5gVzhUxf+B3|*h2C1++I$J)4sh23NT^E zO+KF^5tcQ$Xvbt+w9^84n76YVa?x|wQOLo8U0Y!dChg7>vUy^$DS?=}I}%-Xi>N`*Z-6VJ-SKrsd#Rhha%ZJlC4*11HKaki z(+$scUxD@5eC!`kqt>bv#C6#4&1njy<9H8OsP!h}o$?qQb)pG2;Gq*o#oRoe<{kz# z`3zc4Ur!cQoBzoQNL9N|N*wIR&(0RYK6LF(g*{l_n*^`E|qV!k4Ti zCY^DNVKJRB8eO~2LwisgC>@tlB%OF(Tqgz#7llMh`>p&G?k1O^8PaUfXjmuf#oT7< zm=HJvc5FqGH8I=aK~v+BU0_k59uCR#q%{uD_HY$x(Gy z;+fg8rUi=ouu+?}HlrvrYb-*%JKkwDVRe+JI8XWA@Le@7jE|Fw6}PtnpG~Kwl|Bi? z;tPJF>n}bBo*VFZ=QLt`q^ne=jCeaSX5;JmCB{PKy|?U{mR*omHXl=(V)5QZFTug8m?z!NH0cU<4Qgw0d*ICQxHbhz?L zK4|gkl{}De^3?UdFAS$#NKrYT-r`)M49=i%^S8Z{8Eu^JJJZ?-;`>B{gWg z{m-DsM4T%e7Q*@Sd?q)$Erw4G?)n;ysPZB`|k!OrWsT2fCz3brURpkYIc z`oqI&6WDR#v+)pu>z?^RFz$Qi4?%e8nI9j>5xRu`dk3?=%0vtp^n(dFZ!iSLW9?uh zjKed7lVB_k4W^p{D1GSO%w3yXHdZbw#i!@pus$*vgEslIg~}Mb@w^E9ar%oS!H*|& zJ&ndEN-~>H|8HJofiI@LYz7}3d|3hBnD(PAjN(avRSCu~&t|c!6)%h)N)>Fh$yUV& It-Xo=0UZVjN&o-= delta 2215 zcmZWqYfuzd7QUx@`Z+I&A`auIBOp-(2IFW12Si>mpeU{pK@{X6&p?AXpdvQP@(=^V z5fKC*$wm`mOrU)wu7irGs7b6f(Xuw>n*Eby#7AmV~KNLX4Lu1)0^dSgi&=O$}V6 z8rWHszL_w(0a{IThGqH-#(Kk9-9W!|Oo!Lz-)9quF@XfTr1|)5a6M!x%R*RSa@5U{ zF3Ew7p-wp7Zkw@;^uSZ{yS5VE*DfYk#b;oGCb3Q2B(k>n5vBtDYc=e1^el=?fbZ=4gi?#sg zjAg7oMS!K7Bk|I^zd$K!!&ks|Yz%imB{C6#unl`7>|8|-Yca_|ILYCoyo@jbWT5EC z=gOVqOJ}tU7z-~Hd_2utP|f7GWcKk!~6>FpIj#w#$F+v zY!a(s&NC^ROPUb+9PLN-;<@Da`NkY}rdd|8f@d4O$;T?4lhyZsAIwQ!4TrF2RS`5J zpPUW{FmTm2ka6>}dLdJu#QK@!8o;csCVp$xc(QUlS%&UtHTt^+}u5#G~A2Z0z054+RlmiN>88?LSDUOA10~Q!At+*IW%JQEo1UPnC81X9KfEWv*M*l+>pa_3H^c@spU*{Sqz&D-!kdJ2$pN6fN-qi+qIM!7NxwyVN4|34m zeL$V@q$9;8i|?UGDLMTbm=9HSXSx zqdO99-2v)F1~25Q7YVqy9X2aH7X=26;mOM-a1^JwGoc47-D%K*_uPfhgb{<+SJsSs z`)pE5j9SAS{Tf}1PNPMwSv)C*2_+qbxD47u53o>%2x2jM_1B0lM0ksF2dqPGA+r|aPVpc>%*wDIdOMP zJiSVuit@G9toL}S8m;j&&=zaNhJ0VTOrC<)p>lrm1n+SU931gg7en!Jln!4GO@+6R zyS{_-n$W-!bg$ehN~(>J0FxY5f|jI2j2*U$Mpo64Z2#{pOa}wr8_whOEb+0(CNw6m z6;fs0MCOCL+$nUSti|Uyib2Hmn?)et&6|ZRKi-~%my%=XIGMwmTL~;XUMf*L_L(rF zXYnR_jm)57WG$zeXo*qRR??L+jTc9pK%won697NEy$uLj?reuz?6@PTG;((vpaxs- zUWZ-yhwpymcCutb4s8S8<8q+o@*QaS;a?$72%p6DaS`kgo6EdpoSG-bb%rj3N&ku7 zN4HbwtG%O@#4#~Rcp${`_xq*O8vNUjhxpVgHp(Q20lJP#szzV@^cU5%u03$V9wq$Y zVNhqtVwR%;kK8E`YE}F~O|k^2uWeF(dQ@!$8zzs=gHYTt>JK4!Y&3ukW=Me9in}8$ zbhtbpJ)=t@2m?L-Fb|VFHkgYwo=A8b|Lj=+f%w9+g`2|?>-fLQ&@9mALZ~u_eBLDyZ diff --git a/docs/docsets/Tomorrowland.tgz b/docs/docsets/Tomorrowland.tgz index 2f88f80c37354ba2b7ea2eb1dec914b1ba16a720..1a62290624b9e9c6291f4af464bdcb730623331d 100644 GIT binary patch delta 109787 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 aXCVLc=n}6POqnv}g7OEt6qzLe@D2d^^DqMd delta 108751 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%0DLa!lta3O& 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ⅇsjmx>}<9v?|? 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 diff --git a/docs/index.html b/docs/index.html index 4ab3dfa..c964cb1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -13,7 +13,7 @@

    -

    Tomorrowland 1.3.0 Docs (100% documented)

    +

    Tomorrowland 1.4.0 Docs (100% documented)

    View on GitHub

    @@ -115,15 +115,14 @@

    Tomorrowland

    -

    Version +

    Version Platforms Languages License CocoaPods Carthage compatible

    -

    Tomorrowland is an implementation of Promises for Swift and Objective-C. A Promise is a wrapper around an -asynchronous task that provides a standard way of subscribing to task resolution as well as chaining promises together.

    +

    Tomorrowland is an implementation of Promises for Swift and Objective-C. A Promise is a wrapper around an asynchronous task that provides a standard way of subscribing to task resolution as well as chaining promises together.

    UIApplication.shared.isNetworkActivityIndicatorVisible = true
     MyAPI.requestFeed(for: user).then { (feedItems) in
         self.refreshUI(with: feedItems)
    @@ -138,18 +137,11 @@ 

    Tomorrowland

    • It uses atomics internally instead of creating a separate DispatchQueue for each promise. This means it’s faster and uses fewer resources.
    • -
    • It provides full support for cancellable promises. PromiseKit supports detection of “cancelled” errors but has no way to request cancellation of a promise. Hydra -supports cancelling a promise, but it can’t actually stop any work being done by the promise unless the promise body itself polls for the cancellation status (so e.g. -a promise wrapping a network task can’t reasonably cancel the network task). Tomorrowland improves on this by allowing the promise body to observe the -cancelled state, and allows linking cancellation of a child promise to its parent.
    • +
    • It provides full support for cancellable promises. PromiseKit supports detection of “cancelled” errors but has no way to request cancellation of a promise. Hydra supports cancelling a promise, but it can’t actually stop any work being done by the promise unless the promise body itself polls for the cancellation status (so e.g. a promise wrapping a network task can’t reasonably cancel the network task). Tomorrowland improves on this by allowing the promise body to observe the cancelled state, and allows linking cancellation of a child promise to its parent.
    • Its Obj-C support makes use of generics for improved type safety and better documentation.
    • -
    • Like Hydra but unlike PromiseKit, it provides a way to suppress a registered callback (e.g. because you don’t care about the result anymore and don’t want stale -data affecting your UI). This is distinct from promise cancellation.
    • -
    • Tomorrowland promises are fully generic over the error type, whereas both PromiseKit and Hydra only support using Error as the error type. This may result in -more typing to construct a promise but it allows for much more powerful error handling. Tomorrowland also has some affordances for working with promises that -use Error as the error type.
    • -
    • Tomorrowland is fully thread-safe. I have no reason to believe PromiseKit isn’t, but (at the time of this writing) there are parts of Hydra that are incorrectly -implemented in a non-thread-safe manner.
    • +
    • Like Hydra but unlike PromiseKit, it provides a way to suppress a registered callback (e.g. because you don’t care about the result anymore and don’t want stale data affecting your UI). This is distinct from promise cancellation.
    • +
    • Tomorrowland promises are fully generic over the error type, whereas both PromiseKit and Hydra only support using Error as the error type. This may result in more typing to construct a promise but it allows for much more powerful error handling. Tomorrowland also has some affordances for working with promises that use Error as the error type.
    • +
    • Tomorrowland is fully thread-safe. I have no reason to believe PromiseKit isn’t, but (at the time of this writing) there are parts of Hydra that are incorrectly implemented in a non-thread-safe manner.

    Installation

    Manually

    @@ -159,18 +151,15 @@

    Carthage

    github "lilyball/Tomorrowland" ~> 1.0
     
    -

    The project file is configured to use Swift 5. The code can be compiled against Swift 4.2 instead, but I’m not aware of any way to instruct Carthage to override the -swift version during compilation.

    +

    The project file is configured to use Swift 5. The code can be compiled against Swift 4.2 instead, but I’m not aware of any way to instruct Carthage to override the swift version during compilation.

    CocoaPods

    pod 'Tomorrowland', '~> 1.0'
     
    -

    The podspec declares support for both Swift 4.2 and Swift 5.0, but selecting the Swift version requires using CoocaPods 1.7.0 or later. When using CocoaPods 1.6 -or earlier the Swift version will default to 5.0.

    +

    The podspec declares support for both Swift 4.2 and Swift 5.0, but selecting the Swift version requires using CoocaPods 1.7.0 or later. When using CocoaPods 1.6 or earlier the Swift version will default to 5.0.

    SwiftPM

    -

    Tomorrowland currently relies on a private Obj-C module for its atomics. This arrangement means it is not compatible with Swift Package Manager (as adding -compatibility would necessitate publicly exposing the private Obj-C module).

    +

    Tomorrowland currently relies on a private Obj-C module for its atomics. This arrangement means it is not compatible with Swift Package Manager (as adding compatibility would necessitate publicly exposing the private Obj-C module).

    Usage

    Creating Promises

    @@ -181,18 +170,11 @@

    Creating Promises

    })
    -

    The body of this promise runs on the specified PromiseContext, which in this case is .utility (which means DispatchQueue.global(qos: .utility)). -Unlike callbacks, all created promises must specify a context, so as to avoid accidentally running expensive computations on the main thread. The available contexts -include .main, every Dispatch QoS, a specific DispatchQueue, a specific OperationQueue, or the value .immediate which means to run the block -synchronously. There’s also the special context .auto, which evaluates to .main on the main thread and .default otherwise.

    +

    The body of this promise runs on the specified PromiseContext, which in this case is .utility (which means DispatchQueue.global(qos: .utility)). Unlike callbacks, all created promises must specify a context, so as to avoid accidentally running expensive computations on the main thread. The available contexts include .main, every Dispatch QoS, a specific DispatchQueue, a specific OperationQueue, or the value .immediate which means to run the block synchronously. There’s also the special context .auto, which evaluates to .main on the main thread and .default otherwise.

    -

    Note: The .immediate context can be dangerous to use for callback handlers and should be avoided in most cases. It’s primarily intended for creating -promises, and whenever it’s used with a callback handler the handler must be prepared to execute on any thread. For callbacks it’s usually only useful for short -thread-agnostic callbacks, such as an .onRequestCancel that does nothing more than cancelling a URLSessionTask.

    +

    Note: The .immediate context can be dangerous to use for callback handlers and should be avoided in most cases. It’s primarily intended for creating promises, and whenever it’s used with a callback handler the handler must be prepared to execute on any thread. For callbacks it’s usually only useful for short thread-agnostic callbacks, such as an .onRequestCancel that does nothing more than cancelling a URLSessionTask.

    -

    The body of a Promise receives a “resolver”, which it must use to fulfill, reject, or cancel the promise. If the resolver goes out of scope without being used, the -promise is automatically cancelled. If the promise’s error type is Error, the promise body may also throw an error (as seen above), which is then used to reject the -promise. This resolver can also be used to observe cancellation requests using resolver.onRequestCancel, as seen here:

    +

    The body of a Promise receives a “resolver”, which it must use to fulfill, reject, or cancel the promise. If the resolver goes out of scope without being used, the promise is automatically cancelled. If the promise’s error type is Error, the promise body may also throw an error (as seen above), which is then used to reject the promise. This resolver can also be used to observe cancellation requests using resolver.onRequestCancel, as seen here:

    let promise = Promise<Data,Error>(on: .immediate, { (resolver) in
         let task = urlSession.dataTask(with: url, completionHandler: { (data, response, error) in
             if let data = data {
    @@ -210,24 +192,16 @@ 

    Creating Promises

    })
    -

    Resolvers also have a convenience method handleCallback() that is intended to make it easy to wrap framework callbacks in promises. This method returns a -closure that can be used as a callback directly. It also takes an optional isCancelError parameter that can be used to indicate when an error represents -cancellation. For example:

    +

    Resolvers also have a convenience method handleCallback() that is intended to make it easy to wrap framework callbacks in promises. This method returns a closure that can be used as a callback directly. It also takes an optional isCancelError parameter that can be used to indicate when an error represents cancellation. For example:

    geocoder.reverseGeocodeLocation(location, completionHandler: resolver.handleCallback(isCancelError: { CLError.geocodeCanceled ~= $0 }))
     

    Using Promises

    -

    Once you have a promise, you can register callbacks to be executed when the promise is resolved. Most callback methods require a context, but for some of them -(then, catch, always, and tryThen) you can omit the context and it will default to .auto, which means the main thread if the callback is registered from the -main thread, otherwise the dispatch queue with QoS .default.

    +

    Once you have a promise, you can register callbacks to be executed when the promise is resolved. Most callback methods require a context, but for some of them (then, catch, always, and tryThen) you can omit the context and it will default to .auto, which means the main thread if the callback is registered from the main thread, otherwise the dispatch queue with QoS .default.

    -

    When you register a callback, the method also returns a Promise. All callback registration methods return a new Promise even if the callback doesn’t affect the -value of the promise. The reason for this is so chained callbacks always guarantee that the previous callback finished executing before the new one starts, even -when using concurrent contexts (e.g. .utility), and so cancelling the returned promise doesn’t cancel the original one if any other callbacks were registered on -it.

    +

    When you register a callback, the method also returns a Promise. All callback registration methods return a new Promise even if the callback doesn’t affect the value of the promise. The reason for this is so chained callbacks always guarantee that the previous callback finished executing before the new one starts, even when using concurrent contexts (e.g. .utility), and so cancelling the returned promise doesn’t cancel the original one if any other callbacks were registered on it.

    -

    Most callback registration methods also have versions that allow you to return a Promise from your callback. In this event, the resulting Promise waits for the -promise you returned to resolve before adopting its value. This allows for easy composition of promises.

    +

    Most callback registration methods also have versions that allow you to return a Promise from your callback. In this event, the resulting Promise waits for the promise you returned to resolve before adopting its value. This allows for easy composition of promises.

    showLoadingIndicator()
     fetchUserCredentials().flatMap(on: .default) { (credentials) in
         // This returns a new promise
    @@ -247,25 +221,14 @@ 

    Using Promises

    }
    -

    When composing callbacks that return promises, you may run into issues with incompatible error types. There are convenience methods for working with promises -whose errors are compatible with Error, but they don’t cover all cases. If you find yourself hitting one of these cases, any Promise whose error type conforms to -Error has a property .upcast that will convert that error into an Error to allow for easier composition of promises.

    +

    When composing callbacks that return promises, you may run into issues with incompatible error types. There are convenience methods for working with promises whose errors are compatible with Error, but they don’t cover all cases. If you find yourself hitting one of these cases, any Promise whose error type conforms to Error has a property .upcast that will convert that error into an Error to allow for easier composition of promises.

    -

    Tomorrowland also offers a typealias StdPromise<Value> as shorthand for Promise<T,Error>. This is frequently useful to avoid having to repeat the types, -such as with StdPromise(fulfilled: someValue) instead of Promise<SomeValue,Error>(fulfilled: someValue).

    +

    Tomorrowland also offers a typealias StdPromise<Value> as shorthand for Promise<T,Error>. This is frequently useful to avoid having to repeat the types, such as with StdPromise(fulfilled: someValue) instead of Promise<SomeValue,Error>(fulfilled: someValue).

    Cancelling and Invalidation

    -

    All promises expose a method .requestCancel(). It is named such because this doesn’t actually guarantee that the promise will be cancelled. If the promise -supports cancellation, this method will trigger a callback that the promise can use to cancel its work. But promises that don’t support cancellation will ignore this -and will eventually fulfill or reject as normal. Naturally, requesting cancellation of a promise that has already been resolved does nothing, even if the callbacks have -not yet been invoked.

    - -

    In order to handle the issue of a promise being resolved after you no longer care about it, there is a separate mechanism called a PromiseInvalidationToken -that can be used to suppress callbacks. All callback methods have an optional token parameter that accepts a PromiseInvalidationToken. If provided, -calling invalidate() on the token prior to the callback being executed guarantees the callback will not fire. If the callback returns a value that is required in order -to resolve the Promise returned from the callback registration method, the resulting Promise is cancelled instead. PromiseInvalidationTokens can be used -with multiple callbacks at once, and a single token can be re-used as much as desired. It is recommended that you take advantage of both invalidation tokens and -cancellation. This may look like

    +

    All promises expose a method .requestCancel(). It is named such because this doesn’t actually guarantee that the promise will be cancelled. If the promise supports cancellation, this method will trigger a callback that the promise can use to cancel its work. But promises that don’t support cancellation will ignore this and will eventually fulfill or reject as normal. Naturally, requesting cancellation of a promise that has already been resolved does nothing, even if the callbacks have not yet been invoked.

    + +

    In order to handle the issue of a promise being resolved after you no longer care about it, there is a separate mechanism called a PromiseInvalidationToken that can be used to suppress callbacks. All callback methods have an optional token parameter that accepts a PromiseInvalidationToken. If provided, calling invalidate() on the token prior to the callback being executed guarantees the callback will not fire. If the callback returns a value that is required in order to resolve the Promise returned from the callback registration method, the resulting Promise is cancelled instead. PromiseInvalidationTokens can be used with multiple callbacks at once, and a single token can be re-used as much as desired. It is recommended that you take advantage of both invalidation tokens and cancellation. This may look like

    class URLImageView: UIImageView {
         private var promise: StdPromise<Void>?
         private let invalidationToken = PromiseInvalidationToken()
    @@ -294,19 +257,11 @@ 

    Cancelling and Invalidation }

    -

    PromiseInvalidationToken also has a method .requestCancelOnInvalidate(_:) that can register any number of Promises to be automatically -requested to cancel (using .requestCancel()) the next time the token is invalidated. Promise also has the same method (except it takes a token as the -argument) as a convenience for calling .requestCancelOnInvalidate(_:) on the token. This can be used to terminate a promise chain without ever assigning -the promise to a local variable. PromiseInvalidationToken also has a method .cancelWithoutInvalidating() which cancels any associated promises -without invalidating the token.

    +

    PromiseInvalidationToken also has a method .requestCancelOnInvalidate(_:) that can register any number of Promises to be automatically requested to cancel (using .requestCancel()) the next time the token is invalidated. Promise also has the same method (except it takes a token as the argument) as a convenience for calling .requestCancelOnInvalidate(_:) on the token. This can be used to terminate a promise chain without ever assigning the promise to a local variable. PromiseInvalidationToken also has a method .cancelWithoutInvalidating() which cancels any associated promises without invalidating the token.

    -

    By default PromiseInvalidationTokens will invalidate themselves automatically when deinitialized. This is primarily useful in conjunction with -requestCancelOnInvalidate(_:) as it allows you to automatically cancel your promises when object that owns the token deinits. This behavior can be -disabled with an optional parameter to init.

    +

    By default PromiseInvalidationTokens will invalidate themselves automatically when deinitialized. This is primarily useful in conjunction with requestCancelOnInvalidate(_:) as it allows you to automatically cancel your promises when object that owns the token deinits. This behavior can be disabled with an optional parameter to init.

    -

    Promise also has a convenience method requestCancelOnDeinit(_:) which can be used to request the Promise to be cancelled when a given object -deinits. This is equivalent to adding a PromiseInvalidationToken property to the object (configured to invalidate on deinit) and requesting cancellation when -the token invalidates, but can be used if the token would otherwise not be explicitly invalidated.

    +

    Promise also has a convenience method requestCancelOnDeinit(_:) which can be used to request the Promise to be cancelled when a given object deinits. This is equivalent to adding a PromiseInvalidationToken property to the object (configured to invalidate on deinit) and requesting cancellation when the token invalidates, but can be used if the token would otherwise not be explicitly invalidated.

    Using these methods, the above loadImage(from:) can be rewritten as the following including cancellation:

    class URLImageView: UIImageView {
    @@ -336,17 +291,10 @@ 

    Cancelling and Invalidation

    Invalidation token chaining

    -

    PromiseInvalidationTokens can be arranged in a tree such that invalidating one token will cascade this invalidation down to other tokens. This is -accomplished by calling childToken.chainInvalidation(from: parentToken). Practically speaking this is no different than just manually invalidating each -child token yourself after invalidating the parent token, but it’s provided as a convenience to make it easy to have fine-grained invalidation control while also having -a simple way to bulk-invalidate tokens. For example, you might have separate tokens for different view controllers that all chain invalidation from a single token that -gets invalidated when the user logs out, thus automatically invalidating all your user-dependent network requests at once while still allowing each view controller the -ability to invalidate just its own requests independently.

    +

    PromiseInvalidationTokens can be arranged in a tree such that invalidating one token will cascade this invalidation down to other tokens. This is accomplished by calling childToken.chainInvalidation(from: parentToken). Practically speaking this is no different than just manually invalidating each child token yourself after invalidating the parent token, but it’s provided as a convenience to make it easy to have fine-grained invalidation control while also having a simple way to bulk-invalidate tokens. For example, you might have separate tokens for different view controllers that all chain invalidation from a single token that gets invalidated when the user logs out, thus automatically invalidating all your user-dependent network requests at once while still allowing each view controller the ability to invalidate just its own requests independently.

    TokenPromise

    -

    In order to avoid the repetition of passing a PromiseInvalidationToken to multiple Promise methods as well as cancelling the resulting promise, a type -TokenPromise exists that handles this for you. You can create a TokenPromise with the Promise.withToken(_:) method. This allows you to take code like -the following:

    +

    In order to avoid the repetition of passing a PromiseInvalidationToken to multiple Promise methods as well as cancelling the resulting promise, a type TokenPromise exists that handles this for you. You can create a TokenPromise with the Promise.withToken(_:) method. This allows you to take code like the following:

    func loadModel() {
         promiseToken.invalidate()
         MyModel.fetchFromNetworkAsPromise()
    @@ -372,30 +320,16 @@ 

    PromiseInvalidationToken‘s -requestCancelOnInvalidate(_:) if you want to be able to cancel the promise later.

    +

    Nearly all callback registration methods will automatically propagate cancellation requests from the child to the parent if the parent has no other observers. If all observers for a promise request cancellation, the cancellation request will propagate upwards at this time. This means that a promise will not automatically cancel as long as there’s at least one interested observer. Do note that promises that have no observers do not get automatically cancelled, this only happens if there’s at least one observer (which then requests cancellation). Automatic cancellation propagation also requires that the promise itself no longer be in scope. For this reason you should avoid holding onto promises long-term and instead use the .cancellable property or PromiseInvalidationToken‘s requestCancelOnInvalidate(_:) if you want to be able to cancel the promise later.

    -

    Automatic cancellation propagation also works with the utility functions when(fulfilled:) and when(first:) as well as the convenience methods -timeout(on:delay:) and delay(on:_:).

    +

    Automatic cancellation propagation also works with the utility functions when(fulfilled:) and when(first:) as well as the convenience methods timeout(on:delay:) and delay(on:_:).

    -

    Promises have a couple of methods that do not participate in automatic cancellation propagation. You can use tap(on:token:_:) as an alternative to always in -order to register an observer that won’t interfere with the existing automatic cancellation propagation (this is suitable for inserting into the middle of a promise -chain). You can also use tap() as a more generic version of this.

    +

    Promises have a couple of methods that do not participate in automatic cancellation propagation. You can use tap(on:token:_:) as an alternative to always in order to register an observer that won’t interfere with the existing automatic cancellation propagation (this is suitable for inserting into the middle of a promise chain). You can also use tap() as a more generic version of this.

    Note that ignoringCancel() disables automatic cancellation propagation on the receiver. Once you invoke this on a promise, it will never automatically cancel.

    propagatingCancellation(on:cancelRequested:)
    -

    In some cases you may need to hold onto a promise without blocking cancellation propagation from its children. The primary use-case here is deduplicating access to -an asynchronous resource (such as a network load). In this scenario you may wish to hold onto a promise and return a new child for every client requesting the same -resource, without preventing cancellation of the resource load if all clients cancel their requests. This can be accomplished by holding onto the result of calling -.propagatingCancellation(on:cancelRequested:). The promise returned from this method will propagate cancellation to its parent as soon as all children -have requested cancellation even if the promise is still in scope. When cancellation is requested, the cancelRequested handler will be invoked immediately prior to -propagating cancellation upwards; this enables you to release your reference to the promise (so a new request by a client will create a brand new resource load). An -example of this might look like:

    +

    In some cases you may need to hold onto a promise without blocking cancellation propagation from its children. The primary use-case here is deduplicating access to an asynchronous resource (such as a network load). In this scenario you may wish to hold onto a promise and return a new child for every client requesting the same resource, without preventing cancellation of the resource load if all clients cancel their requests. This can be accomplished by holding onto the result of calling .propagatingCancellation(on:cancelRequested:). The promise returned from this method will propagate cancellation to its parent as soon as all children have requested cancellation even if the promise is still in scope. When cancellation is requested, the cancelRequested handler will be invoked immediately prior to propagating cancellation upwards; this enables you to release your reference to the promise (so a new request by a client will create a brand new resource load). Returning a new child to each client can be done using makeChild(). An example of this might look like:

    func loadResource(at url: URL) {
         let promise: StdPromise<Model>
         if let existingPromise = resourceLoads[url] {
    @@ -409,24 +343,16 @@ 
    resourceLoads[url] = promise } // Return a new child for each request so all clients have to cancel, not just one. - return promise.then(on: .immediate, { _ in }) + return promise.makeChild() }

    The special .nowOr(_:) context

    -

    There is a special context PromiseContext.nowOr(_:) that behaves a bit differently than other contexts. This context is special in that its callback executes -differently depending on whether the promise it’s being registered on has already resolved by the time the callback is registered. If the promise has already -resolved then .nowOr(context) behaves like .immediate, otherwise it behaves like the wrapped context. This context is intended to be used to replace -code that would otherwise check if the promise.result is non-nil prior to registering a callback.

    +

    There is a special context PromiseContext.nowOr(_:) that behaves a bit differently than other contexts. This context is special in that its callback executes differently depending on whether the promise it’s being registered on has already resolved by the time the callback is registered. If the promise has already resolved then .nowOr(context) behaves like .immediate, otherwise it behaves like the wrapped context. This context is intended to be used to replace code that would otherwise check if the promise.result is non-nil prior to registering a callback.

    -

    If this context is used in Promise.init(on:_:) it always behaves like .immediate, and if it’s used in DelayedPromise.init(on:_:) it always behaves -like the wrapped context.

    +

    If this context is used in Promise.init(on:_:) it always behaves like .immediate, and if it’s used in DelayedPromise.init(on:_:) it always behaves like the wrapped context.

    -

    There is a property PromiseContext.isExecutingNow that can be accessed from within a callback registered with .nowOr(_:) to determine if the callback -is executing synchronously or asynchronously. When accessed from any other context it returns false. When registering a callback with .immediate from -within a callback where PromiseContext.isExecutingNow is true, the nested callback will inherit the PromiseContext.isExecutingNow flag if and only -if the nested callback is also executing synchronously. This is a bit subtle but is intended to allow Promise(on: .immediate, { … }) to inherit the flag from -its surrounding scope.

    +

    There is a property PromiseContext.isExecutingNow that can be accessed from within a callback registered with .nowOr(_:) to determine if the callback is executing synchronously or asynchronously. When accessed from any other context it returns false. When registering a callback with .immediate from within a callback where PromiseContext.isExecutingNow is true, the nested callback will inherit the PromiseContext.isExecutingNow flag if and only if the nested callback is also executing synchronously. This is a bit subtle but is intended to allow Promise(on: .immediate, { … }) to inherit the flag from its surrounding scope.

    An example of how this context might be used is when populating an image view from a network request:

    createNetworkRequestAsPromise()
    @@ -445,41 +371,28 @@ 

    Promise Helpers

    There are a few helper functions that can be used to deal with multiple promises.

    when(fulfilled:)

    -

    when(fulfilled:) is a global function that takes either an array of promises or 2–6 promises as separate arguments, and returns a single promise that is -eventually fulfilled with the values of all input promises. With the array version all input promises must have the same type and the result is fulfilled with an array. -With the separate argument version the promises may have unique value types (but the same error type) and the result is fulfilled with a tuple.

    +

    when(fulfilled:) is a global function that takes either an array of promises or 2–6 promises as separate arguments, and returns a single promise that is eventually fulfilled with the values of all input promises. With the array version all input promises must have the same type and the result is fulfilled with an array. With the separate argument version the promises may have unique value types (but the same error type) and the result is fulfilled with a tuple.

    -

    If any of the input promises is rejected or cancelled, the resulting promise is immediately rejected or cancelled as well. If multiple input promises are rejected or -cancelled, the first such one affects the result.

    +

    If any of the input promises is rejected or cancelled, the resulting promise is immediately rejected or cancelled as well. If multiple input promises are rejected or cancelled, the first such one affects the result.

    This function has an optional parameter cancelOnFailure: that, if provided as true, will cancel all input promises if any of them are rejected.

    when(first:)

    -

    when(first:) is a global function that takes an array of promises of the same type, and returns a single promise that eventually adopts the same value or error as -the first input promise that gets fulfilled or rejected. Cancelled input promises are ignored, unless all input promsies are cancelled, at which point the resulting -promise will be cancelled as well.

    +

    when(first:) is a global function that takes an array of promises of the same type, and returns a single promise that eventually adopts the same value or error as the first input promise that gets fulfilled or rejected. Cancelled input promises are ignored, unless all input promsies are cancelled, at which point the resulting promise will be cancelled as well.

    -

    This function has an optional parameter cancelRemaining: that, if provided as true, will cancel the remaining input promises as soon as one of them is fulfilled -or rejected.

    +

    This function has an optional parameter cancelRemaining: that, if provided as true, will cancel the remaining input promises as soon as one of them is fulfilled or rejected.

    Promise.timeout(on:delay:)

    -

    Promise.timeout(on:delay:) is a method that returns a new promise that adopts the same value as the receiver, or is rejected with an error if the receiver isn’t -resolved within the given interval.

    +

    Promise.timeout(on:delay:) is a method that returns a new promise that adopts the same value as the receiver, or is rejected with an error if the receiver isn’t resolved within the given interval.

    Promise.delay(on:_:)

    -

    Promise.delay(on:_:) is a method that returns a new promise that adopts the same result as the receiver after the specified delay. It is intended primarily for -testing purposes.

    +

    Promise.delay(on:_:) is a method that returns a new promise that adopts the same result as the receiver after the specified delay. It is intended primarily for testing purposes.

    Objective-C

    -

    Tomorrowland has Obj-C compatibility in the form of TWLPromise<ValueType,ErrorType>. This is a parallel promise implementation that can be bridged to/from -Promise and supports all of the same functionality. Note that some of the method names are different (due to lack of overloading), and while TWLPromise is -generic over its types, the return values of callback registration methods that return new promises are not parameterized (due to inability to have generic methods).

    +

    Tomorrowland has Obj-C compatibility in the form of TWLPromise<ValueType,ErrorType>. This is a parallel promise implementation that can be bridged to/from Promise and supports all of the same functionality. Note that some of the method names are different (due to lack of overloading), and while TWLPromise is generic over its types, the return values of callback registration methods that return new promises are not parameterized (due to inability to have generic methods).

    Callback lifetimes

    -

    Callbacks registered on promises will be retained until the promise is resolved. If a callback is invoked (or would be invoked if the relevant invalidation token hadn’t -been invalidated), Tomorrowland guarantees that it will release the callback on the context it was invoked on. If the callback is not invoked (e.g. it’s a then(on:_:) -callback but the promise was rejected) then no guarantees are made as to the context the callback is released on. If you need to ensure it’s released on the -appropriate context (e.g. if it captures an object that must deallocate on the main thread) then you can use .always or one of the .mapResult variants.

    +

    Callbacks registered on promises will be retained until the promise is resolved. If a callback is invoked (or would be invoked if the relevant invalidation token hadn’t been invalidated), Tomorrowland guarantees that it will release the callback on the context it was invoked on. If the callback is not invoked (e.g. it’s a then(on:_:) callback but the promise was rejected) then no guarantees are made as to the context the callback is released on. If you need to ensure it’s released on the appropriate context (e.g. if it captures an object that must deallocate on the main thread) then you can use .always or one of the .mapResult variants.

    Requirements

    Requires a minimum of iOS 9, macOS 10.10, watchOS 2.0, or tvOS 9.0.

    @@ -497,25 +410,32 @@

    Contribution

    Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you shall be dual licensed as above, without any additional terms or conditions.

    Version History

    +

    v1.4.0

    + +
      +
    • Fix the cancellation propagation behavior of Promise.Resolver.resolve(with:) and the flatMap family of methods. Previously, requesting cancellation of the promise associated with the resolver (for resolve(with:), or the returned promise for the flatMap family) would immediately request cancellation of the upstream promise even if the upstream promise had other children. The new behavior fixes this such that it participates in automatic cancellation propagation just like any other child promise (#54).
    • +
    • Slightly optimize stack usage when chaining one promise to another.
    • +
    • Avoid using stack space for chained promises that don’t involve a callback. For example, when the promise returned from a flatMap(on:token:_:) resolves it will resolve the outer promise without using additional stack frames. You can think of it like tail calling functions. This affects not just flatMap but also operations such as tap(), ignoringCancel(), and more. This also applies to Obj-C (with TWLPromise).
    • +
    + +

    Note: This does not affect the variants that implicitly upcast from some E: Swift.Error to Swift.Error such as tryFlatMap(on:token:_:).

    + +
      +
    • Change cancellation propagation behavior of onCancel. Like tap, it doesn’t prevent automatic cancellation propagation if the parent has other children and all other children request cancellation. Unlike tap, requesting cancellation of onCancel when there are no other children will propagate cancellation to the parent. The motivation here is attaching an onCancel observer shouldn’t prevent cancellation that would otherwise occur, but when it’s the only child it should behave like the other standard observers (#57).
    • +
    • Add method Promise.makeChild(). This returns a new child of the receiver that adopts the receiver’s value and propagates cancellation like any other observer. The purpose here is to be used when handing back multiple children of one parent to callers, as handing back the parent means any one caller can cancel it without the other callers’ participation. This is particularly useful in conjunction with propagatingCancellation(on:cancelRequested:) (#56).
    • +

    v1.3.0

      -
    • Add PromiseContext.isExecutingNow (TWLPromiseContext.isExecutingNow in Obj-C) that returns true if accessed from within a callback registered -with .nowOr(_:) and executing synchronously, or false otherwise. If accessed from within a callback (or Promise.init(on:_:)) registered with -.immediate and running synchronously, it inherits the surrounding scope’s PromiseContext.isExecutingNow flag. This is intended to allow -Promise(on: .immediate, { … }) to query the surrounding scope’s flag (#53).
    • +
    • Add PromiseContext.isExecutingNow (TWLPromiseContext.isExecutingNow in Obj-C) that returns true if accessed from within a callback registered with .nowOr(_:) and executing synchronously, or false otherwise. If accessed from within a callback (or Promise.init(on:_:)) registered with .immediate and running synchronously, it inherits the surrounding scope’s PromiseContext.isExecutingNow flag. This is intended to allow Promise(on: .immediate, { … }) to query the surrounding scope’s flag (#53).
    • Add convenience methods to Obj-C for doing then+catch together, as this is a common pattern and chaining Obj-C methods is a little awkward (#45).
    • -
    • Change Promise.timeout’s default context to .nowOr(.auto) for the Error overload as well.
    • -
    • Change the behavior of Promise.timeout(on:delay:) when the delay is less than or equal to zero, the context is .immediate or .nowOr(_:), and the -upstream promise hasn’t resolved yet. Previously the timeout would occur asynchronously and the upstream promise would get a chance to race the timeout. With -the new behavior the timeout occurs synchronously (#49).
    • +
    • Change Promise.timeout‘s default context to .nowOr(.auto) for the Error overload as well.
    • +
    • Change the behavior of Promise.timeout(on:delay:) when the delay is less than or equal to zero, the context is .immediate or .nowOr(_:), and the upstream promise hasn’t resolved yet. Previously the timeout would occur asynchronously and the upstream promise would get a chance to race the timeout. With the new behavior the timeout occurs synchronously (#49).

    v1.2.0

      -
    • Add PromiseContext.nowOr(context) (+[TWLContext nowOrContext:] in Obj-C) that runs the callback synchronously when registered if the promise -has already resolved, otherwise registers the callback to run on context. This can be used to replace code that previously would have required checking -promise.result prior to registering the callback (#34).
    • +
    • Add PromiseContext.nowOr(context) (+[TWLContext nowOrContext:] in Obj-C) that runs the callback synchronously when registered if the promise has already resolved, otherwise registers the callback to run on context. This can be used to replace code that previously would have required checking promise.result prior to registering the callback (#34).

    For example:

    @@ -525,30 +445,20 @@

    v1.2.0

      -
    • Add Promise.Resolver.hasRequestedCancel (TWLResolver.cancelRequested in Obj-C) that returns true if the promise has been requested to -cancel or is already cancelled, or false if it hasn’t been requested to cancel or is fulfilled or rejected. This can be used when a promise initializer takes -significant time in a manner not easily interrupted by an onRequestCancel handler (#47).
    • -
    • Change Promise.timeout’s default context from .auto to .nowOr(.auto). This behaves the same as .auto in most cases, except if the receiver has -already been resolved this will cause the returned promise to likewise already be resolved (#50).
    • -
    • Ensure when(first:cancelRemaining:) returns an already-cancelled promise if all input promises were previously cancelled, instead of cancelling the -returned promise asynchronously (#51).
    • -
    • Ensure when(fulfilled:qos:cancelOnFailure:) returns an already-resolved promise if either all input promises were previously fulfliled or any input -promise was previously rejected or cancelled (#52).
    • +
    • Add Promise.Resolver.hasRequestedCancel (TWLResolver.cancelRequested in Obj-C) that returns true if the promise has been requested to cancel or is already cancelled, or false if it hasn’t been requested to cancel or is fulfilled or rejected. This can be used when a promise initializer takes significant time in a manner not easily interrupted by an onRequestCancel handler (#47).
    • +
    • Change Promise.timeout’s default context from .auto to .nowOr(.auto). This behaves the same as .auto in most cases, except if the receiver has already been resolved this will cause the returned promise to likewise already be resolved (#50).
    • +
    • Ensure when(first:cancelRemaining:) returns an already-cancelled promise if all input promises were previously cancelled, instead of cancelling the returned promise asynchronously (#51).
    • +
    • Ensure when(fulfilled:qos:cancelOnFailure:) returns an already-resolved promise if either all input promises were previously fulfliled or any input promise was previously rejected or cancelled (#52).

    v1.1.1

    v1.1.0

      -
    • Add new method .propagatingCancellation(on:cancelRequested:) that can be used to create a long-lived promise that propagates cancellation from its -children to its parent while it’s still alive. Normally promises don’t propagate cancellation until they themselves are released, in case more children are going to be -added. This new method is intended to be used when deduplicating requests for an asynchronous resource (such as a network load) such that the resource request -can be cancelled in the event that no children care about it anymore (#46).
    • +
    • Add new method .propagatingCancellation(on:cancelRequested:) that can be used to create a long-lived promise that propagates cancellation from its children to its parent while it’s still alive. Normally promises don’t propagate cancellation until they themselves are released, in case more children are going to be added. This new method is intended to be used when deduplicating requests for an asynchronous resource (such as a network load) such that the resource request can be cancelled in the event that no children care about it anymore (#46).

    v1.0.1

    @@ -558,27 +468,18 @@

    v1.0.1

    v1.0.0

      -
    • Fix a rather serious bug where PromiseInvalidationTokens would not deinit as long as any promise whose callback was tied to the token was still unresolved. -This meant that the default invalidateOnDeinit behavior would not trigger and the callback would still fire even though there were no more external references -to the token, and this meant any promises configured to be cancelled when the promise invalidated would not cancel. Tokens used purely for -requestCancelOnInvalidate(_:) would still deallocate, and tokens would still deallocate after any associated promises had resolved.
    • -
    • Tweak the atomic memory ordering used in PromiseInvalidationTokens. After a careful re-reading I don’t believe I was issuing the correct fences previously, -making it possible for tokens whose associated promise callbacks were executing concurrently with a call to requestCancelOnInvalidate(_:) to read the -wrong generation value, and for tokens that had requestCancelOnInvalidate(_:) invoked concurrently on multiple threads to corrupt the generation.
    • -
    • Add PromiseInvalidationToken.chainInvalidation(from:) to invalidate a token whenever another token invalidates. This allows for building a tree of -tokens in order to have both fine-grained and bulk invalidation at the same time. Tokens chained together this way stay chained forever (#43).
    • -
    • Update project file to Swift 5.0. The source already supported this. This change should only affect people using Carthage or anyone adding building this -framework from source.
    • -
    • Update the podspec to list both Swift 4.2 and Swift 5.0. With CocoaPods 1.7.0 or later your Podfile can now declare which version of Swift it’s compatible with. -For anyone using CocoaPods 1.6 or earlier it will default to Swift 5.0.
    • +
    • Fix a rather serious bug where PromiseInvalidationTokens would not deinit as long as any promise whose callback was tied to the token was still unresolved. This meant that the default invalidateOnDeinit behavior would not trigger and the callback would still fire even though there were no more external references to the token, and this meant any promises configured to be cancelled when the promise invalidated would not cancel. Tokens used purely for requestCancelOnInvalidate(_:) would still deallocate, and tokens would still deallocate after any associated promises had resolved.
    • +
    • Tweak the atomic memory ordering used in PromiseInvalidationTokens. After a careful re-reading I don’t believe I was issuing the correct fences previously, making it possible for tokens whose associated promise callbacks were executing concurrently with a call to requestCancelOnInvalidate(_:) to read the wrong generation value, and for tokens that had requestCancelOnInvalidate(_:) invoked concurrently on multiple threads to corrupt the generation.
    • +
    • Add PromiseInvalidationToken.chainInvalidation(from:) to invalidate a token whenever another token invalidates. This allows for building a tree of tokens in order to have both fine-grained and bulk invalidation at the same time. Tokens chained together this way stay chained forever (#43).
    • +
    • Update project file to Swift 5.0. The source already supported this. This change should only affect people using Carthage or anyone adding building this framework from source.
    • +
    • Update the podspec to list both Swift 4.2 and Swift 5.0. With CocoaPods 1.7.0 or later your Podfile can now declare which version of Swift it’s compatible with. For anyone using CocoaPods 1.6 or earlier it will default to Swift 5.0.

    v0.6.0

    • Make DelayedPromise conform to Equatable (#37).
    • Add convenience functions for working with Swift.Result (#39).
    • -
    • Mark all the deprecated functions as unavailable instead. This restores the ability to write code like promise.then({ foo?($0) }) without it incorrectly -resolving to the deprecated form of map(_:) (#35).
    • +
    • Mark all the deprecated functions as unavailable instead. This restores the ability to write code like promise.then({ foo?($0) }) without it incorrectly resolving to the deprecated form of map(_:) (#35).
    • Rename Promise.init(result:) and Promise.init(on:result:after:) to Promise.init(with:) and Promise.init(on:with:after:) (#40).

    v0.5.1

    @@ -588,28 +489,23 @@

    v0.5.1

  • Ensure that if a user-supplied callback is invoked, it is also released on the context where it was invoked (#38).
  • -

    This guarantee is only made for callbacks that are invoked (ignoring tokens). What this means is when using e.g. .then(on:_:) if the promise is fulfilled, the - onSuccess block will be released on the provided context, but if the promise is rejected no such guarantee is made. If you rely on the context it’s released on - (e.g. it captures an object that must deallocate on the main thread) then you can use .always or one of the mapResult variants.

    +

    This guarantee is only made for callbacks that are invoked (ignoring tokens). What this means is when using e.g. .then(on:_:) if the promise is fulfilled, the onSuccess block will be released on the provided context, but if the promise is rejected no such guarantee is made. If you rely on the context it’s released on (e.g. it captures an object that must deallocate on the main thread) then you can use .always or one of the mapResult variants.

    v0.5.0

    -

    This gets rid of most overrides, leaving the only overridden methods to be ones that handle either Swift.Error or E: Swift.Error, and even these overrides - are removed in the Swift 5 compiler.

    +

    This gets rid of most overrides, leaving the only overridden methods to be ones that handle either Swift.Error or E: Swift.Error, and even these overrides are removed in the Swift 5 compiler.

    -

    then is now map or flatMap, recover’s override is now flatMapError, always’s override is now flatMapResult, and similar renames were made for - the try variants.

    +

    then is now map or flatMap, recover’s override is now flatMapError, always’s override is now flatMapResult, and similar renames were made for the try variants.

    • Add a new then method whose block returns Void. The returned promise resolves to the same result as the original promise.
    • Add new mapError and tryMapError methods.
    • Add new mapResult and tryMapResult methods.
    • Extend tryFlatMapError to be available on all Promises instead of just those whose error type is Swift.Error.
    • -
    • Remove the default .auto value for the on context: parameter to most calls. It’s now only provided for the “terminal” callbacks, the ones that don’t return a -value from the handler. This avoids the common problem of running trivial maps on the main thread unnecessarily (#33).
    • +
    • Remove the default .auto value for the on context: parameter to most calls. It’s now only provided for the “terminal” callbacks, the ones that don’t return a value from the handler. This avoids the common problem of running trivial maps on the main thread unnecessarily (#33).

    v0.4.3

    @@ -629,23 +525,16 @@

    v0.4.1

    v0.4

      -
    • Improve the behavior of .delay(on:_:) and .timeout(on:delay:) when using PromiseContext.operationQueue. The relevant operation is now added -to the queue immediately and only becomes ready once the delay/timeout has elapsed.
    • +
    • Improve the behavior of .delay(on:_:) and .timeout(on:delay:) when using PromiseContext.operationQueue. The relevant operation is now added to the queue immediately and only becomes ready once the delay/timeout has elapsed.
    • Add -[TWLPromise initCancelled] to construct a pre-cancelled promise.
    • -
    • Add Promise.init(on:fulfilled:after:), Promise.init(on:rejected:after:), and Promise.init(on:result:after:). These initializers produce -something akin to Promise(fulfilled: value).delay(after) except they respond to cancellation immediately. This makes them more suitable for use as -cancellable timers, as opposed to .delay(_:) which is more intended for debugging (#27).
    • -
    • Try to clean up the callback list when calling PromiseInvalidationToken.requestCancelOnInvalidate(_:). Any deallocated promises at the head of the -callback list will be removed. This will help keep the callback list from growing uncontrollably when a token is used merely to cancel all promises when the owner -deallocates as opposed to being periodically invalidated during its lifetime (#25).
    • -
    • Cancel the .delay(_:) timer if .requestCancel() is invoked and the upstream promise cancelled. This way requested cancels will skip the delay, but -unexpected cancels will still delay the result (#26).
    • +
    • Add Promise.init(on:fulfilled:after:), Promise.init(on:rejected:after:), and Promise.init(on:result:after:). These initializers produce something akin to Promise(fulfilled: value).delay(after) except they respond to cancellation immediately. This makes them more suitable for use as cancellable timers, as opposed to .delay(_:) which is more intended for debugging (#27).
    • +
    • Try to clean up the callback list when calling PromiseInvalidationToken.requestCancelOnInvalidate(_:). Any deallocated promises at the head of the callback list will be removed. This will help keep the callback list from growing uncontrollably when a token is used merely to cancel all promises when the owner deallocates as opposed to being periodically invalidated during its lifetime (#25).
    • +
    • Cancel the .delay(_:) timer if .requestCancel() is invoked and the upstream promise cancelled. This way requested cancels will skip the delay, but unexpected cancels will still delay the result (#26).

    v0.3.4

    v0.3.3

    @@ -676,8 +565,7 @@

    v0.3

    • Add Promise.requestCancelOnInvalidate(_:) as a convenience for token.requestCancelOnInvalidate(_:).
    • Add Promise.requestCancelOnDeinit(_:) as a convenience for adding a token property to an object that invalites on deinit.
    • -
    • Better support for OperationQueue with delay/timeout. Instead of using the OperationQueue’s underlying queue, we instead use a .userInitiated -queue for the timer and hop onto the OperationQueue to resolve the promise.
    • +
    • Better support for OperationQueue with delay/timeout. Instead of using the OperationQueue’s underlying queue, we instead use a .userInitiated queue for the timer and hop onto the OperationQueue to resolve the promise.

    v0.2

    @@ -693,7 +581,7 @@

    v0.1

    diff --git a/docs/search.json b/docs/search.json index 10637b2..3a649da 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -{"Typealiases.html#/s:12Tomorrowland17StdDelayedPromisea":{"name":"StdDelayedPromise","abstract":"

    StdDelayedPromise is an alias for a DelayedPromise whose error type is Swift.Error.

    "},"Typealiases.html#/s:12Tomorrowland10StdPromisea":{"name":"StdPromise","abstract":"

    StdPromise is an alias for a Promise whose error type is Swift.Error.

    "},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5innerAA0C0Vyxq_Gvp":{"name":"inner","abstract":"

    The wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5tokenAA0c12InvalidationB0Vvp":{"name":"token","abstract":"

    The PromiseInvalidationToken to use when invoking methods on the wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7promise5tokenACyxq_GAA0C0Vyxq_G_AA0c12InvalidationB0Vtcfc":{"name":"init(promise:token:)","abstract":"

    Returns a new TokenPromise that wraps the given promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4then2on_ACyxq_GAA0C7ContextO_yxctF":{"name":"then(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3map2on_ACyqd__q_GAA0C7ContextO_qd__xctlF":{"name":"map(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7flatMap2on_ACyqd__q_GAA0C7ContextO_AA0C0Vyqd__q_GxctlF":{"name":"flatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5catch2on_ACyxq_GAA0C7ContextO_yq_ctF":{"name":"catch(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7recover2on_ACyxAA7NoErrorOGAA0C7ContextO_xq_ctF":{"name":"recover(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8mapError2on_ACyxqd__GAA0C7ContextO_qd__q_ctlF":{"name":"mapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12flatMapError2on_ACyxqd__GAA0C7ContextO_AA0C0Vyxqd__Gq_ctlF":{"name":"flatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV11tryMapError2on_ACyxs0F0_pGAA0C7ContextO_qd__q_KctsAFRd__lF":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV15tryFlatMapError2on_ACyxs0G0_pGAA0C7ContextO_AA0C0Vyxqd__Gq_KctsAFRd__lF":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapError(on:_:)":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapError(on:_:)":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV6always2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"always(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV9mapResult2on0F8CompleteACyqd__qd_0_GAA0C7ContextO_AA0cE0Oyqd__qd_0_GAKyxq_Gctr0_lF":{"name":"mapResult(on:onComplete:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV13flatMapResult2on_ACyqd__qd_0_GAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cF0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12tryMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0cF0Oyqd__qd_0_GAKyxq_GKctsAFRd_0_r0_lF":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV16tryFlatMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cG0Oyxq_GKctsAFRd_0_r0_lF":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapResult(on:_:)":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapResult(on:_:)":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tap2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"tap(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new TokenPromise that adopts the result of the receiver without affecting its","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8onCancel0D0_ACyxq_GAA0C7ContextO_yyctF":{"name":"onCancel(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the TokenPromise to a block and then returns the TokenPromise for further","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new TokenPromise that adopts the value of the receiver but ignores cancel","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two TokenPromises compare as equal if they represent the same promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE7tryThen2on_ACyxsAD_pGAA0C7ContextO_yxKctF":{"name":"tryThen(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE6tryMap2on_ACyqd__sAD_pGAA0C7ContextO_qd__xKctlF":{"name":"tryMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMap(on:_:)":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryFlatMap2on_ACyqd__sAD_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryRecover2on_ACyxsAD_pGAA0C7ContextO_xsAD_pKctF":{"name":"tryRecover(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE010tryFlatMapD02on_ACyxsAD_pGAA0C7ContextO_AA0C0Vyxqd__GsAD_pKctsADRd__lF":{"name":"tryFlatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV18invalidateOnDeinitACSb_tcfc":{"name":"init(invalidateOnDeinit:)","abstract":"

    Creates and returns a new PromiseInvalidationToken.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV10invalidateyyF":{"name":"invalidate()","abstract":"

    Invalidates the token and cancels any associated promises.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25cancelWithoutInvalidatingyyF":{"name":"cancelWithoutInvalidating()","abstract":"

    Cancels any associated promises without invalidating the token.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyyAA0B0Vyxq_Gr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers a Promise to be requested to cancel automatically when the token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyySo10TWLPromiseCyxq_GRlzCRl_Cr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers an ObjCPromise to be requested to cancel automatically when the token is","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV05chainC04from34includingCancelWithoutInvalidatingyAC_SbtF":{"name":"chainInvalidation(from:includingCancelWithoutInvalidating:)","abstract":"

    Invalidates the token whenever another token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s28CustomDebugStringConvertibleP16debugDescriptionSSvp":{"name":"debugDescription","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseInvalidationToken"},"Structs/PromiseCancellable.html#/s:12Tomorrowland18PromiseCancellableV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests cancellation of the promise this PromiseCancellable was created from.

    ","parent_name":"PromiseCancellable"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7fulfill4withyx_tF":{"name":"fulfill(with:)","abstract":"

    Fulfills the promise with the given value.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6reject4withyq__tF":{"name":"reject(with:)","abstract":"

    Rejects the promise with the given error.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6cancelyyF":{"name":"cancel()","abstract":"

    Cancels the promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyAA0B6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyACyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with another promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV15onRequestCancel0D0_yAA0B7ContextO_yAEyxq__GctF":{"name":"onRequestCancel(on:_:)","abstract":"

    Registers a block that will be invoked if requestCancel() is invoked on the promise","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV18hasRequestedCancelSbvp":{"name":"hasRequestedCancel","abstract":"

    Returns whether the promise has already been requested to cancel.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE7resolve4withyAA0B6ResultOyxqd__G_tsAFRd__lF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE14handleCallback08isCancelD0yxSg_sAF_pSgtcSbsAF_pc_tF":{"name":"handleCallback(isCancelError:)","abstract":"

    Convenience method for handling framework callbacks.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5ErrorR_rlE7resolve4withys6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html":{"name":"Resolver","abstract":"

    A Resolver is used to fulfill, reject, or cancel its associated Promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultAA0B6ResultOyxq_GSgvp":{"name":"result","abstract":"

    Returns the result of the promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16makeWithResolverACyxq_G_AC0E0Vyxq__GtyFZ":{"name":"makeWithResolver()","abstract":"

    Returns a Promise and a Promise.Resolver that can be used to fulfill that promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on_ACyxq_GAA0B7ContextO_yAC8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9fulfilledACyxq_Gx_tcfc":{"name":"init(fulfilled:)","abstract":"

    Returns a Promise that is already fulfilled with the given value.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8rejectedACyxq_Gq__tcfc":{"name":"init(rejected:)","abstract":"

    Returns a Promise that is already rejected with the given error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4withACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4then2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyxctF":{"name":"then(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3map2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xctlF":{"name":"map(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7flatMap2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgAGxctlF":{"name":"flatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5catch2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyq_ctF":{"name":"catch(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7recover2on5token_ACyxAA7NoErrorOGAA0B7ContextO_AA0B17InvalidationTokenVSgxq_ctF":{"name":"recover(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8mapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_ctlF":{"name":"mapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12flatMapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgAGq_ctlF":{"name":"flatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11tryMapError2on5token_ACyxs0E0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_KctsAGRd__lF":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV15tryFlatMapError2on5token_ACyxs0F0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyxqd__Gq_KctsAGRd__lF":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryMapError(on:token:_:)":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapError(on:token:_:)":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6always2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"always(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9mapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bD0Oyqd__qd_0_GANyxq_Gctr0_lF":{"name":"mapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13flatMapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAgA0bE0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12tryMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bE0Oyqd__qd_0_GAOyxq_GKctsAGRd_0_r0_lF":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16tryFlatMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GAA0bF0Oyxq_GKctsAGRd_0_r0_lF":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryMapResult(on:token:_:)":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapResult(on:token:_:)":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tap2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"tap(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new Promise that adopts the result of the receiver without affecting its behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8onCancel0C05token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyyctF":{"name":"onCancel(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV23propagatingCancellation2on15cancelRequestedACyxq_GAA0B7ContextO_yAGctF":{"name":"propagatingCancellation(on:cancelRequested:)","abstract":"

    Returns a promise that adopts the same value as the receiver, and propagates cancellation","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the Promise to a block and then returns the Promise for further chaining.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests that the Promise should be cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV25requestCancelOnInvalidateyACyxq_GAA0B17InvalidationTokenVF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Requests that the Promise should be cancelled when the token is invalidated.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new Promise that adopts the value of the receiver but ignores cancel requests.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(result:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on6result5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:result:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV21requestCancelOnDeinityACyxq_GyXlF":{"name":"requestCancelOnDeinit(_:)","abstract":"

    Requests that the Promise should be cancelled when the object deinits.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two Promises compare as equal if they represent the same promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11cancellableAA0B11CancellableVvp":{"name":"cancellable","abstract":"

    Returns a value that can be used to cancel this promise without holding onto the full promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9withTokenyAA0dB0Vyxq_GAA0b12InvalidationD0VF":{"name":"withToken(_:)","abstract":"

    Returns a new TokenPromise that wraps the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on9fulfilled5afterACyxq_GAA0B7ContextO_xSdtcfc":{"name":"init(on:fulfilled:after:)","abstract":"

    Returns a Promise that fulfills with the given value after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on8rejected5afterACyxq_GAA0B7ContextO_q_Sdtcfc":{"name":"init(on:rejected:after:)","abstract":"

    Returns a Promise that rejects with the given error after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on4with5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:with:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5delay2on_ACyxq_GAA0B7ContextO_SdtF":{"name":"delay(on:_:)","abstract":"

    Returns a new Promise that adopts the receiver’s result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7timeout2on5delayACyxAA0B12TimeoutErrorOyq_GGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE6upcastACyxsAD_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVA2A7NoErrorORs_rlE6upcastACyxs0D0_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE2on_ACyxsAD_pGAA0B7ContextO_yAC8ResolverVyxsAD_p_GKctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7tryThen2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgyxKctF":{"name":"tryThen(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE6tryMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xKctlF":{"name":"tryMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMap(on:token:_:)":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryFlatMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryRecover2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgxsAD_pKctF":{"name":"tryRecover(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE4withACyxq_Gs6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7timeout2on5delayACyxsAD_pGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV8Resolvera":{"name":"Resolver","abstract":"

    The type of the promise resolver. See Promise<Value,Error>.Resolver.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2on_ACyxq_GAA0C7ContextO_yAA0C0V8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new DelayedPromise that can be resolved with the given block.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV7promiseAA0C0Vyxq_Gvp":{"name":"promise","abstract":"

    Returns a Promise that asynchronously contains the value of the computation.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two DelayedPromises compare as equal if they would produce equal Promises.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html":{"name":"DelayedPromise","abstract":"

    DelayedPromise is like a Promise but it doesn’t invoke its callback until the .promise"},"Structs/Promise.html":{"name":"Promise","abstract":"

    A Promise is a construct that will eventually hold a value or error, and can invoke callbacks"},"Structs/PromiseCancellable.html":{"name":"PromiseCancellable","abstract":"

    A type that can be used to cancel a promise without holding onto the full promise.

    "},"Structs/PromiseInvalidationToken.html":{"name":"PromiseInvalidationToken","abstract":"

    An invalidation token that can be used to cancel callbacks registered to a Promise.

    "},"Structs/TokenPromise.html":{"name":"TokenPromise","abstract":"

    A Promise adapter that automatically applies a PromiseInvalidationToken.

    "},"Functions.html#/s:12Tomorrowland4when9fulfilled3qos15cancelOnFailureAA7PromiseVySayxGq_GSayAGyxq_GG_8Dispatch0I3QoSV0J6SClassOSbtr0_lF":{"name":"when(fulfilled:qos:cancelOnFailure:)","abstract":"

    Waits on an array of Promises and returns a Promise that is fulfilled with an array of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_q3_tq4_GAGyxq4_G_AGyq_q4_GAGyq0_q4_GAGyq1_q4_GAGyq2_q4_GAGyq3_q4_G8Dispatch0I3QoSV0J6SClassOSbtr5_lF":{"name":"when(fulfilled:_:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_tq3_GAGyxq3_G_AGyq_q3_GAGyq0_q3_GAGyq1_q3_GAGyq2_q3_G8Dispatch0I3QoSV0J6SClassOSbtr4_lF":{"name":"when(fulfilled:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled___3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_tq2_GAGyxq2_G_AGyq_q2_GAGyq0_q2_GAGyq1_q2_G8Dispatch0I3QoSV0J6SClassOSbtr3_lF":{"name":"when(fulfilled:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled__3qos15cancelOnFailureAA7PromiseVyx_q_q0_tq1_GAGyxq1_G_AGyq_q1_GAGyq0_q1_G8Dispatch0I3QoSV0J6SClassOSbtr2_lF":{"name":"when(fulfilled:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_3qos15cancelOnFailureAA7PromiseVyx_q_tq0_GAGyxq0_G_AGyq_q0_G8Dispatch0I3QoSV0J6SClassOSbtr1_lF":{"name":"when(fulfilled:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when5first15cancelRemainingAA7PromiseVyxq_GSayAGG_Sbtr0_lF":{"name":"when(first:cancelRemaining:)","abstract":"

    Returns a Promise that is resolved with the result of the first resolved input Promise.

    "},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8timedOutyACyxGAEmlF":{"name":"timedOut","abstract":"

    The promise did not resolve within the given interval.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8rejectedyACyxGxcAEmlF":{"name":"rejected(_:)","abstract":"

    The promise was rejected with an error.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2eeoiySbACyxG_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2neoiySbACyxG_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseTimeoutError"},"Enums/NoError.html#/s:12Tomorrowland7NoErrorO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"NoError"},"Enums/NoError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"NoError"},"Enums/NoError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"NoError"},"Enums/NoError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"NoError"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valueyACyxq_GxcAEmr0_lF":{"name":"value(_:)","abstract":"

    The value the promise was fulfilled with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5erroryACyxq_Gq_cAEmr0_lF":{"name":"error(_:)","abstract":"

    The error the promise was rejected with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO9cancelledyACyxq_GAEmr0_lF":{"name":"cancelled","abstract":"

    The promise was cancelled.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valuexSgvp":{"name":"value","abstract":"

    Returns the contained value if the result is .value, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5errorq_Sgvp":{"name":"error","abstract":"

    Returns the contained error if the result is .error, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO11isCancelledSbvp":{"name":"isCancelled","abstract":"

    Returns true if the result is .cancelled, otherwise false.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO3mapyACyqd__q_Gqd__xKXEKlF":{"name":"map(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO8mapErroryACyxqd__Gqd__q_KXEKlF":{"name":"mapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO7flatMapyACyqd__q_GAExKXEKlF":{"name":"flatMap(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO12flatMapErroryACyxqd__GAEq_KXEKlF":{"name":"flatMapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2neoiySbACyxq_G_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAAs5ErrorR_rlEyACyxq_Gs0C0Oyxq_Gcfc":{"name":"init(_:)","abstract":"

    Returns a PromiseResult from a Result.

    ","parent_name":"PromiseResult"},"Enums/PromiseCallbackError.html#/c:@M@Tomorrowland@E@TWLPromiseCallbackError@TWLPromiseCallbackErrorAPIMismatch":{"name":"apiMismatch","abstract":"

    The callback did not conform to the expected API.

    ","parent_name":"PromiseCallbackError"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4mainyA2CmF":{"name":"main","abstract":"

    Execute on the main queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO10backgroundyA2CmF":{"name":"background","abstract":"

    Execute on a dispatch queue with the .background QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7utilityyA2CmF":{"name":"utility","abstract":"

    Execute on a dispatch queue with the .utility QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7defaultyA2CmF":{"name":"default","abstract":"

    Execute on a dispatch queue with the .default QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO13userInitiatedyA2CmF":{"name":"userInitiated","abstract":"

    Execute on a dispatch queue with the .userInitiated QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO15userInteractiveyA2CmF":{"name":"userInteractive","abstract":"

    Execute on a dispatch queue with the .userInteractive QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5queueyACSo012OS_dispatch_D0CcACmF":{"name":"queue(_:)","abstract":"

    Execute on the specified dispatch queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14operationQueueyACSo011NSOperationE0CcACmF":{"name":"operationQueue(_:)","abstract":"

    Execute on the specified operation queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO9immediateyA2CmF":{"name":"immediate","abstract":"

    Execute synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5nowOryA2CcACmF":{"name":"nowOr(_:)","abstract":"

    Execute synchronously if the promise is already resolved, otherwise use another context.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4autoACvpZ":{"name":"auto","abstract":"

    Returns .main when accessed from the main thread, otherwise .default.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14isExecutingNowSbvpZ":{"name":"isExecutingNow","abstract":"

    Returns whether a .nowOr(_:) context is executing synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO3qosAC8Dispatch0E3QoSV0F6SClassO_tcfc":{"name":"init(qos:)","abstract":"

    Returns the PromiseContext that corresponds to a given Dispatch QoS class.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html":{"name":"PromiseContext","abstract":"

    The context in which a Promise body or callback is evaluated.

    "},"Enums/PromiseCallbackError.html":{"name":"PromiseCallbackError","abstract":"

    An error potentially returned from Promise.Resolver.handleCallback(isCancelError:).

    "},"Enums/PromiseResult.html":{"name":"PromiseResult","abstract":"

    The result of a resolved promise.

    "},"Enums/NoError.html":{"name":"NoError","abstract":"

    NoError is a type that cannot be constructed.

    "},"Enums/PromiseTimeoutError.html":{"name":"PromiseTimeoutError","abstract":"

    The error type returned from Promise.timeout.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Functions.html":{"name":"Functions","abstract":"

    The following functions are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file +{"Typealiases.html#/s:12Tomorrowland17StdDelayedPromisea":{"name":"StdDelayedPromise","abstract":"

    StdDelayedPromise is an alias for a DelayedPromise whose error type is Swift.Error.

    "},"Typealiases.html#/s:12Tomorrowland10StdPromisea":{"name":"StdPromise","abstract":"

    StdPromise is an alias for a Promise whose error type is Swift.Error.

    "},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5innerAA0C0Vyxq_Gvp":{"name":"inner","abstract":"

    The wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5tokenAA0c12InvalidationB0Vvp":{"name":"token","abstract":"

    The PromiseInvalidationToken to use when invoking methods on the wrapped Promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7promise5tokenACyxq_GAA0C0Vyxq_G_AA0c12InvalidationB0Vtcfc":{"name":"init(promise:token:)","abstract":"

    Returns a new TokenPromise that wraps the given promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4then2on_ACyxq_GAA0C7ContextO_yxctF":{"name":"then(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3map2on_ACyqd__q_GAA0C7ContextO_qd__xctlF":{"name":"map(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7flatMap2on_ACyqd__q_GAA0C7ContextO_AA0C0Vyqd__q_GxctlF":{"name":"flatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV5catch2on_ACyxq_GAA0C7ContextO_yq_ctF":{"name":"catch(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV7recover2on_ACyxAA7NoErrorOGAA0C7ContextO_xq_ctF":{"name":"recover(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8mapError2on_ACyxqd__GAA0C7ContextO_qd__q_ctlF":{"name":"mapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12flatMapError2on_ACyxqd__GAA0C7ContextO_AA0C0Vyxqd__Gq_ctlF":{"name":"flatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV11tryMapError2on_ACyxs0F0_pGAA0C7ContextO_qd__q_KctsAFRd__lF":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV15tryFlatMapError2on_ACyxs0G0_pGAA0C7ContextO_AA0C0Vyxqd__Gq_KctsAFRd__lF":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapError(on:_:)":{"name":"tryMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapError(on:_:)":{"name":"tryFlatMapError(on:_:)","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV6always2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"always(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV9mapResult2on0F8CompleteACyqd__qd_0_GAA0C7ContextO_AA0cE0Oyqd__qd_0_GAKyxq_Gctr0_lF":{"name":"mapResult(on:onComplete:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV13flatMapResult2on_ACyqd__qd_0_GAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cF0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV12tryMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0cF0Oyqd__qd_0_GAKyxq_GKctsAFRd_0_r0_lF":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV16tryFlatMapResult2on_ACyqd__s5Error_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GAA0cG0Oyxq_GKctsAFRd_0_r0_lF":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryMapResult(on:_:)":{"name":"tryMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMapResult(on:_:)":{"name":"tryFlatMapResult(on:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tap2on_ACyxq_GAA0C7ContextO_yAA0C6ResultOyxq_GctF":{"name":"tap(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new TokenPromise that adopts the result of the receiver without affecting its","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV8onCancel0D0_ACyxq_GAA0C7ContextO_yyctF":{"name":"onCancel(on:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the TokenPromise to a block and then returns the TokenPromise for further","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new TokenPromise that adopts the value of the receiver but ignores cancel","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two TokenPromises compare as equal if they represent the same promise.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE7tryThen2on_ACyxsAD_pGAA0C7ContextO_yxKctF":{"name":"tryThen(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE6tryMap2on_ACyqd__sAD_pGAA0C7ContextO_qd__xKctlF":{"name":"tryMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/tryFlatMap(on:_:)":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryFlatMap2on_ACyqd__sAD_pGAA0C7ContextO_AA0C0Vyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE10tryRecover2on_ACyxsAD_pGAA0C7ContextO_xsAD_pKctF":{"name":"tryRecover(on:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"TokenPromise"},"Structs/TokenPromise.html#/s:12Tomorrowland12TokenPromiseVAAs5Error_pRs_rlE010tryFlatMapD02on_ACyxsAD_pGAA0C7ContextO_AA0C0Vyxqd__GsAD_pKctsADRd__lF":{"name":"tryFlatMapError(on:_:)","abstract":"
    ","parent_name":"TokenPromise"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV18invalidateOnDeinitACSb_tcfc":{"name":"init(invalidateOnDeinit:)","abstract":"

    Creates and returns a new PromiseInvalidationToken.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV10invalidateyyF":{"name":"invalidate()","abstract":"

    Invalidates the token and cancels any associated promises.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25cancelWithoutInvalidatingyyF":{"name":"cancelWithoutInvalidating()","abstract":"

    Cancels any associated promises without invalidating the token.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyyAA0B0Vyxq_Gr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers a Promise to be requested to cancel automatically when the token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV25requestCancelOnInvalidateyySo10TWLPromiseCyxq_GRlzCRl_Cr0_lF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Registers an ObjCPromise to be requested to cancel automatically when the token is","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV05chainC04from34includingCancelWithoutInvalidatingyAC_SbtF":{"name":"chainInvalidation(from:includingCancelWithoutInvalidating:)","abstract":"

    Invalidates the token whenever another token is invalidated.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s23CustomStringConvertibleP11descriptionSSvp":{"name":"description","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:s28CustomDebugStringConvertibleP16debugDescriptionSSvp":{"name":"debugDescription","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:12Tomorrowland24PromiseInvalidationTokenV2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseInvalidationToken"},"Structs/PromiseInvalidationToken.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseInvalidationToken"},"Structs/PromiseCancellable.html#/s:12Tomorrowland18PromiseCancellableV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests cancellation of the promise this PromiseCancellable was created from.

    ","parent_name":"PromiseCancellable"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7fulfill4withyx_tF":{"name":"fulfill(with:)","abstract":"

    Fulfills the promise with the given value.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6reject4withyq__tF":{"name":"reject(with:)","abstract":"

    Rejects the promise with the given error.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV6cancelyyF":{"name":"cancel()","abstract":"

    Cancels the promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyAA0B6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV7resolve4withyACyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with another promise.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV15onRequestCancel0D0_yAA0B7ContextO_yAEyxq__GctF":{"name":"onRequestCancel(on:_:)","abstract":"

    Registers a block that will be invoked if requestCancel() is invoked on the promise","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverV18hasRequestedCancelSbvp":{"name":"hasRequestedCancel","abstract":"

    Returns whether the promise has already been requested to cancel.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE7resolve4withyAA0B6ResultOyxqd__G_tsAFRd__lF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5Error_pRs_rlE14handleCallback08isCancelD0yxSg_sAF_pSgtcSbsAF_pc_tF":{"name":"handleCallback(isCancelError:)","abstract":"

    Convenience method for handling framework callbacks.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html#/s:12Tomorrowland7PromiseV8ResolverVAAs5ErrorR_rlE7resolve4withys6ResultOyxq_G_tF":{"name":"resolve(with:)","abstract":"

    Resolves the promise with the given result.

    ","parent_name":"Resolver"},"Structs/Promise/Resolver.html":{"name":"Resolver","abstract":"

    A Resolver is used to fulfill, reject, or cancel its associated Promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultAA0B6ResultOyxq_GSgvp":{"name":"result","abstract":"

    Returns the result of the promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16makeWithResolverACyxq_G_AC0E0Vyxq__GtyFZ":{"name":"makeWithResolver()","abstract":"

    Returns a Promise and a Promise.Resolver that can be used to fulfill that promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on_ACyxq_GAA0B7ContextO_yAC8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9fulfilledACyxq_Gx_tcfc":{"name":"init(fulfilled:)","abstract":"

    Returns a Promise that is already fulfilled with the given value.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8rejectedACyxq_Gq__tcfc":{"name":"init(rejected:)","abstract":"

    Returns a Promise that is already rejected with the given error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4withACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4then2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyxctF":{"name":"then(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3map2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xctlF":{"name":"map(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7flatMap2on5token_ACyqd__q_GAA0B7ContextO_AA0B17InvalidationTokenVSgAGxctlF":{"name":"flatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5catch2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyq_ctF":{"name":"catch(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7recover2on5token_ACyxAA7NoErrorOGAA0B7ContextO_AA0B17InvalidationTokenVSgxq_ctF":{"name":"recover(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8mapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_ctlF":{"name":"mapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12flatMapError2on5token_ACyxqd__GAA0B7ContextO_AA0B17InvalidationTokenVSgAGq_ctlF":{"name":"flatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11tryMapError2on5token_ACyxs0E0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__q_KctsAGRd__lF":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV15tryFlatMapError2on5token_ACyxs0F0_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyxqd__Gq_KctsAGRd__lF":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryMapError(on:token:_:)":{"name":"tryMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapError(on:token:_:)":{"name":"tryFlatMapError(on:token:_:)","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6always2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"always(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9mapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bD0Oyqd__qd_0_GANyxq_Gctr0_lF":{"name":"mapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13flatMapResult2on5token_ACyqd__qd_0_GAA0B7ContextO_AA0B17InvalidationTokenVSgAgA0bE0Oyxq_Gctr0_lF":{"name":"flatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV12tryMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgAA0bE0Oyqd__qd_0_GAOyxq_GKctsAGRd_0_r0_lF":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV16tryFlatMapResult2on5token_ACyqd__s5Error_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GAA0bF0Oyxq_GKctsAGRd_0_r0_lF":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryMapResult(on:token:_:)":{"name":"tryMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMapResult(on:token:_:)":{"name":"tryFlatMapResult(on:token:_:)","abstract":"

    Registers a callback that will be invoked with the promise result, no matter what it is, and","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tap2on5token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyAA0B6ResultOyxq_GctF":{"name":"tap(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is resolved without affecting behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV3tapACyxq_GyF":{"name":"tap()","abstract":"

    Returns a new Promise that adopts the result of the receiver without affecting its behavior.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV8onCancel0C05token_ACyxq_GAA0B7ContextO_AA0B17InvalidationTokenVSgyyctF":{"name":"onCancel(on:token:_:)","abstract":"

    Registers a callback that will be invoked when the promise is cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV23propagatingCancellation2on15cancelRequestedACyxq_GAA0B7ContextO_yAGctF":{"name":"propagatingCancellation(on:cancelRequested:)","abstract":"

    Returns a promise that adopts the same value as the receiver, and propagates cancellation","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9makeChildACyxq_GyF":{"name":"makeChild()","abstract":"

    Returns a promise that adopts the same value as the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV4forkyACyxq_GyAEKXEKF":{"name":"fork(_:)","abstract":"

    Passes the Promise to a block and then returns the Promise for further chaining.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV13requestCancelyyF":{"name":"requestCancel()","abstract":"

    Requests that the Promise should be cancelled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV25requestCancelOnInvalidateyACyxq_GAA0B17InvalidationTokenVF":{"name":"requestCancelOnInvalidate(_:)","abstract":"

    Requests that the Promise should be cancelled when the token is invalidated.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV14ignoringCancelACyxq_GyF":{"name":"ignoringCancel()","abstract":"

    Returns a new Promise that adopts the value of the receiver but ignores cancel requests.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV6resultACyxq_GAA0B6ResultOyxq_G_tcfc":{"name":"init(result:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on6result5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:result:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV21requestCancelOnDeinityACyxq_GyXlF":{"name":"requestCancelOnDeinit(_:)","abstract":"

    Requests that the Promise should be cancelled when the object deinits.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two Promises compare as equal if they represent the same promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV11cancellableAA0B11CancellableVvp":{"name":"cancellable","abstract":"

    Returns a value that can be used to cancel this promise without holding onto the full promise.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV9withTokenyAA0dB0Vyxq_GAA0b12InvalidationD0VF":{"name":"withToken(_:)","abstract":"

    Returns a new TokenPromise that wraps the receiver.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on9fulfilled5afterACyxq_GAA0B7ContextO_xSdtcfc":{"name":"init(on:fulfilled:after:)","abstract":"

    Returns a Promise that fulfills with the given value after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on8rejected5afterACyxq_GAA0B7ContextO_q_Sdtcfc":{"name":"init(on:rejected:after:)","abstract":"

    Returns a Promise that rejects with the given error after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV2on4with5afterACyxq_GAA0B7ContextO_AA0B6ResultOyxq_GSdtcfc":{"name":"init(on:with:after:)","abstract":"

    Returns a Promise that resolves with the given result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV5delay2on_ACyxq_GAA0B7ContextO_SdtF":{"name":"delay(on:_:)","abstract":"

    Returns a new Promise that adopts the receiver’s result after a delay.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseV7timeout2on5delayACyxAA0B12TimeoutErrorOyq_GGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE6upcastACyxsAD_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVA2A7NoErrorORs_rlE6upcastACyxs0D0_pGvp":{"name":"upcast","abstract":"

    Returns a new promise with an error type of Swift.Error.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE2on_ACyxsAD_pGAA0B7ContextO_yAC8ResolverVyxsAD_p_GKctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new Promise that will be resolved using the given block.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7tryThen2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgyxKctF":{"name":"tryThen(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE6tryMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgqd__xKctlF":{"name":"tryMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/tryFlatMap(on:token:_:)":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryFlatMap2on5token_ACyqd__sAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgACyqd__qd_0_GxKctsADRd_0_r0_lF":{"name":"tryFlatMap(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is fulfilled.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE10tryRecover2on5token_ACyxsAD_pGAA0B7ContextO_AA0B17InvalidationTokenVSgxsAD_pKctF":{"name":"tryRecover(on:token:_:)","abstract":"

    Registers a callback that is invoked when the promise is rejected.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5ErrorR_rlE4withACyxq_Gs6ResultOyxq_G_tcfc":{"name":"init(with:)","abstract":"

    Returns a Promise that is already resolved with the given result.

    ","parent_name":"Promise"},"Structs/Promise.html#/s:12Tomorrowland7PromiseVAAs5Error_pRs_rlE7timeout2on5delayACyxsAD_pGAA0B7ContextO_SdtF":{"name":"timeout(on:delay:)","abstract":"

    Returns a Promise that is rejected with an error if the receiver does not resolve within","parent_name":"Promise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV8Resolvera":{"name":"Resolver","abstract":"

    The type of the promise resolver. See Promise<Value,Error>.Resolver.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2on_ACyxq_GAA0C7ContextO_yAA0C0V8ResolverVyxq__Gctcfc":{"name":"init(on:_:)","abstract":"

    Returns a new DelayedPromise that can be resolved with the given block.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV7promiseAA0C0Vyxq_Gvp":{"name":"promise","abstract":"

    Returns a Promise that asynchronously contains the value of the computation.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html#/s:12Tomorrowland14DelayedPromiseV2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Two DelayedPromises compare as equal if they would produce equal Promises.

    ","parent_name":"DelayedPromise"},"Structs/DelayedPromise.html":{"name":"DelayedPromise","abstract":"

    DelayedPromise is like a Promise but it doesn’t invoke its callback until the .promise"},"Structs/Promise.html":{"name":"Promise","abstract":"

    A Promise is a construct that will eventually hold a value or error, and can invoke callbacks"},"Structs/PromiseCancellable.html":{"name":"PromiseCancellable","abstract":"

    A type that can be used to cancel a promise without holding onto the full promise.

    "},"Structs/PromiseInvalidationToken.html":{"name":"PromiseInvalidationToken","abstract":"

    An invalidation token that can be used to cancel callbacks registered to a Promise.

    "},"Structs/TokenPromise.html":{"name":"TokenPromise","abstract":"

    A Promise adapter that automatically applies a PromiseInvalidationToken.

    "},"Functions.html#/s:12Tomorrowland4when9fulfilled3qos15cancelOnFailureAA7PromiseVySayxGq_GSayAGyxq_GG_8Dispatch0I3QoSV0J6SClassOSbtr0_lF":{"name":"when(fulfilled:qos:cancelOnFailure:)","abstract":"

    Waits on an array of Promises and returns a Promise that is fulfilled with an array of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_q3_tq4_GAGyxq4_G_AGyq_q4_GAGyq0_q4_GAGyq1_q4_GAGyq2_q4_GAGyq3_q4_G8Dispatch0I3QoSV0J6SClassOSbtr5_lF":{"name":"when(fulfilled:_:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled____3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_q2_tq3_GAGyxq3_G_AGyq_q3_GAGyq0_q3_GAGyq1_q3_GAGyq2_q3_G8Dispatch0I3QoSV0J6SClassOSbtr4_lF":{"name":"when(fulfilled:_:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled___3qos15cancelOnFailureAA7PromiseVyx_q_q0_q1_tq2_GAGyxq2_G_AGyq_q2_GAGyq0_q2_GAGyq1_q2_G8Dispatch0I3QoSV0J6SClassOSbtr3_lF":{"name":"when(fulfilled:_:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled__3qos15cancelOnFailureAA7PromiseVyx_q_q0_tq1_GAGyxq1_G_AGyq_q1_GAGyq0_q1_G8Dispatch0I3QoSV0J6SClassOSbtr2_lF":{"name":"when(fulfilled:_:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when9fulfilled_3qos15cancelOnFailureAA7PromiseVyx_q_tq0_GAGyxq0_G_AGyq_q0_G8Dispatch0I3QoSV0J6SClassOSbtr1_lF":{"name":"when(fulfilled:_:qos:cancelOnFailure:)","abstract":"

    Waits on a tuple of Promises and returns a Promise that is fulfilled with a tuple of the"},"Functions.html#/s:12Tomorrowland4when5first15cancelRemainingAA7PromiseVyxq_GSayAGG_Sbtr0_lF":{"name":"when(first:cancelRemaining:)","abstract":"

    Returns a Promise that is resolved with the result of the first resolved input Promise.

    "},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8timedOutyACyxGAEmlF":{"name":"timedOut","abstract":"

    The promise did not resolve within the given interval.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorO8rejectedyACyxGxcAEmlF":{"name":"rejected(_:)","abstract":"

    The promise was rejected with an error.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:10Foundation13CustomNSErrorP13errorUserInfoSDySSypGvp":{"name":"errorUserInfo","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2eeoiySbACyxG_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:12Tomorrowland19PromiseTimeoutErrorOAASQRzlE2neoiySbACyxG_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseTimeoutError"},"Enums/PromiseTimeoutError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseTimeoutError"},"Enums/NoError.html#/s:12Tomorrowland7NoErrorO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"NoError"},"Enums/NoError.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"NoError"},"Enums/NoError.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"NoError"},"Enums/NoError.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"NoError"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valueyACyxq_GxcAEmr0_lF":{"name":"value(_:)","abstract":"

    The value the promise was fulfilled with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5erroryACyxq_Gq_cAEmr0_lF":{"name":"error(_:)","abstract":"

    The error the promise was rejected with.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO9cancelledyACyxq_GAEmr0_lF":{"name":"cancelled","abstract":"

    The promise was cancelled.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5valuexSgvp":{"name":"value","abstract":"

    Returns the contained value if the result is .value, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO5errorq_Sgvp":{"name":"error","abstract":"

    Returns the contained error if the result is .error, otherwise nil.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO11isCancelledSbvp":{"name":"isCancelled","abstract":"

    Returns true if the result is .cancelled, otherwise false.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO3mapyACyqd__q_Gqd__xKXEKlF":{"name":"map(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO8mapErroryACyxqd__Gqd__q_KXEKlF":{"name":"mapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO7flatMapyACyqd__q_GAExKXEKlF":{"name":"flatMap(_:)","abstract":"

    Maps a successful result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultO12flatMapErroryACyxqd__GAEq_KXEKlF":{"name":"flatMapError(_:)","abstract":"

    Maps a rejected result through a block and returns the new result.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2eeoiySbACyxq_G_AEtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAASQRzSQR_rlE2neoiySbACyxq_G_AEtFZ":{"name":"!=(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are not equal.

    ","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SH4hash4intoys6HasherVz_tF":{"name":"hash(into:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:SE6encode2toys7Encoder_p_tKF":{"name":"encode(to:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:Se4fromxs7Decoder_p_tKcfc":{"name":"init(from:)","parent_name":"PromiseResult"},"Enums/PromiseResult.html#/s:12Tomorrowland13PromiseResultOAAs5ErrorR_rlEyACyxq_Gs0C0Oyxq_Gcfc":{"name":"init(_:)","abstract":"

    Returns a PromiseResult from a Result.

    ","parent_name":"PromiseResult"},"Enums/PromiseCallbackError.html#/c:@M@Tomorrowland@E@TWLPromiseCallbackError@TWLPromiseCallbackErrorAPIMismatch":{"name":"apiMismatch","abstract":"

    The callback did not conform to the expected API.

    ","parent_name":"PromiseCallbackError"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4mainyA2CmF":{"name":"main","abstract":"

    Execute on the main queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO10backgroundyA2CmF":{"name":"background","abstract":"

    Execute on a dispatch queue with the .background QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7utilityyA2CmF":{"name":"utility","abstract":"

    Execute on a dispatch queue with the .utility QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO7defaultyA2CmF":{"name":"default","abstract":"

    Execute on a dispatch queue with the .default QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO13userInitiatedyA2CmF":{"name":"userInitiated","abstract":"

    Execute on a dispatch queue with the .userInitiated QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO15userInteractiveyA2CmF":{"name":"userInteractive","abstract":"

    Execute on a dispatch queue with the .userInteractive QoS.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5queueyACSo012OS_dispatch_D0CcACmF":{"name":"queue(_:)","abstract":"

    Execute on the specified dispatch queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14operationQueueyACSo011NSOperationE0CcACmF":{"name":"operationQueue(_:)","abstract":"

    Execute on the specified operation queue.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO9immediateyA2CmF":{"name":"immediate","abstract":"

    Execute synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO5nowOryA2CcACmF":{"name":"nowOr(_:)","abstract":"

    Execute synchronously if the promise is already resolved, otherwise use another context.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO4autoACvpZ":{"name":"auto","abstract":"

    Returns .main when accessed from the main thread, otherwise .default.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO14isExecutingNowSbvpZ":{"name":"isExecutingNow","abstract":"

    Returns whether a .nowOr(_:) context is executing synchronously.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO3qosAC8Dispatch0E3QoSV0F6SClassO_tcfc":{"name":"init(qos:)","abstract":"

    Returns the PromiseContext that corresponds to a given Dispatch QoS class.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html#/s:12Tomorrowland14PromiseContextO2eeoiySbAC_ACtFZ":{"name":"==(_:_:)","abstract":"

    Returns a Boolean value indicating whether two values are equal.

    ","parent_name":"PromiseContext"},"Enums/PromiseContext.html":{"name":"PromiseContext","abstract":"

    The context in which a Promise body or callback is evaluated.

    "},"Enums/PromiseCallbackError.html":{"name":"PromiseCallbackError","abstract":"

    An error potentially returned from Promise.Resolver.handleCallback(isCancelError:).

    "},"Enums/PromiseResult.html":{"name":"PromiseResult","abstract":"

    The result of a resolved promise.

    "},"Enums/NoError.html":{"name":"NoError","abstract":"

    NoError is a type that cannot be constructed.

    "},"Enums/PromiseTimeoutError.html":{"name":"PromiseTimeoutError","abstract":"

    The error type returned from Promise.timeout.

    "},"Enums.html":{"name":"Enumerations","abstract":"

    The following enumerations are available globally.

    "},"Functions.html":{"name":"Functions","abstract":"

    The following functions are available globally.

    "},"Structs.html":{"name":"Structures","abstract":"

    The following structures are available globally.

    "},"Typealiases.html":{"name":"Type Aliases","abstract":"

    The following type aliases are available globally.

    "}} \ No newline at end of file