From 5fb90b0d3162d00077c1112cdeb9db791cfb3168 Mon Sep 17 00:00:00 2001 From: pjechris Date: Thu, 4 Jan 2024 15:40:02 +0000 Subject: [PATCH] Deploying Updated Jazzy Docs --- Classes.html | 191 ++ Classes/EntityStore.html | 951 +++++++++ Classes/Subscription.html | 168 ++ Enums.html | 163 ++ Enums/StampError.html | 169 ++ Extensions.html | 216 +++ Extensions/Date.html | 170 ++ Extensions/Publisher.html | 254 +++ Protocols.html | 222 +++ Protocols/Aggregate.html | 170 ++ Protocols/EntityWrapper.html | 189 ++ Protocols/Logger.html | 281 +++ Structs.html | 220 +++ Structs/AliasKey.html | 169 ++ Structs/EntityObserver.html | 248 +++ Structs/PartialIdentifiableKeyPath.html | 406 ++++ Typealiases.html | 216 +++ badge.svg | 28 + css/highlight.css | 202 ++ css/jazzy.css | 439 +++++ docsets/.docset/Contents/Info.plist | 20 + .../Contents/Resources/Documents/Classes.html | 191 ++ .../Documents/Classes/EntityStore.html | 951 +++++++++ .../Documents/Classes/Subscription.html | 168 ++ .../Contents/Resources/Documents/Enums.html | 163 ++ .../Resources/Documents/Enums/StampError.html | 169 ++ .../Resources/Documents/Extensions.html | 216 +++ .../Resources/Documents/Extensions/Date.html | 170 ++ .../Documents/Extensions/Publisher.html | 254 +++ .../Resources/Documents/Protocols.html | 222 +++ .../Documents/Protocols/Aggregate.html | 170 ++ .../Documents/Protocols/EntityWrapper.html | 189 ++ .../Resources/Documents/Protocols/Logger.html | 281 +++ .../Contents/Resources/Documents/Structs.html | 220 +++ .../Resources/Documents/Structs/AliasKey.html | 169 ++ .../Documents/Structs/EntityObserver.html | 248 +++ .../Structs/PartialIdentifiableKeyPath.html | 406 ++++ .../Resources/Documents/Typealiases.html | 216 +++ .../Resources/Documents/css/highlight.css | 202 ++ .../Resources/Documents/css/jazzy.css | 439 +++++ .../Resources/Documents/img/carat.png | Bin 0 -> 274 bytes .../Contents/Resources/Documents/img/dash.png | Bin 0 -> 1338 bytes .../Resources/Documents/img/spinner.gif | Bin 0 -> 1849 bytes .../Contents/Resources/Documents/index.html | 406 ++++ .../Contents/Resources/Documents/js/jazzy.js | 74 + .../Resources/Documents/js/jazzy.search.js | 74 + .../Resources/Documents/js/jquery.min.js | 2 + .../Resources/Documents/js/lunr.min.js | 6 + .../Documents/js/typeahead.jquery.js | 1694 +++++++++++++++++ .../Contents/Resources/Documents/search.json | 1 + .../.docset/Contents/Resources/docSet.dsidx | Bin 0 -> 36864 bytes docsets/.tgz | Bin 0 -> 87028 bytes img/carat.png | Bin 0 -> 274 bytes img/dash.png | Bin 0 -> 1338 bytes img/spinner.gif | Bin 0 -> 1849 bytes index.html | 406 ++++ js/jazzy.js | 74 + js/jazzy.search.js | 74 + js/jquery.min.js | 2 + js/lunr.min.js | 6 + js/typeahead.jquery.js | 1694 +++++++++++++++++ search.json | 1 + undocumented.json | 6 + 63 files changed, 14656 insertions(+) create mode 100644 Classes.html create mode 100644 Classes/EntityStore.html create mode 100644 Classes/Subscription.html create mode 100644 Enums.html create mode 100644 Enums/StampError.html create mode 100644 Extensions.html create mode 100644 Extensions/Date.html create mode 100644 Extensions/Publisher.html create mode 100644 Protocols.html create mode 100644 Protocols/Aggregate.html create mode 100644 Protocols/EntityWrapper.html create mode 100644 Protocols/Logger.html create mode 100644 Structs.html create mode 100644 Structs/AliasKey.html create mode 100644 Structs/EntityObserver.html create mode 100644 Structs/PartialIdentifiableKeyPath.html create mode 100644 Typealiases.html create mode 100644 badge.svg create mode 100644 css/highlight.css create mode 100644 css/jazzy.css create mode 100644 docsets/.docset/Contents/Info.plist create mode 100644 docsets/.docset/Contents/Resources/Documents/Classes.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Classes/EntityStore.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Classes/Subscription.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Enums.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Enums/StampError.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Extensions.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Extensions/Date.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Protocols.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Protocols/Aggregate.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Protocols/EntityWrapper.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Protocols/Logger.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Structs.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Structs/AliasKey.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Structs/EntityObserver.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Structs/PartialIdentifiableKeyPath.html create mode 100644 docsets/.docset/Contents/Resources/Documents/Typealiases.html create mode 100644 docsets/.docset/Contents/Resources/Documents/css/highlight.css create mode 100644 docsets/.docset/Contents/Resources/Documents/css/jazzy.css create mode 100755 docsets/.docset/Contents/Resources/Documents/img/carat.png create mode 100755 docsets/.docset/Contents/Resources/Documents/img/dash.png create mode 100644 docsets/.docset/Contents/Resources/Documents/img/spinner.gif create mode 100644 docsets/.docset/Contents/Resources/Documents/index.html create mode 100755 docsets/.docset/Contents/Resources/Documents/js/jazzy.js create mode 100644 docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js create mode 100644 docsets/.docset/Contents/Resources/Documents/js/jquery.min.js create mode 100644 docsets/.docset/Contents/Resources/Documents/js/lunr.min.js create mode 100644 docsets/.docset/Contents/Resources/Documents/js/typeahead.jquery.js create mode 100644 docsets/.docset/Contents/Resources/Documents/search.json create mode 100644 docsets/.docset/Contents/Resources/docSet.dsidx create mode 100644 docsets/.tgz create mode 100755 img/carat.png create mode 100755 img/dash.png create mode 100644 img/spinner.gif create mode 100644 index.html create mode 100755 js/jazzy.js create mode 100644 js/jazzy.search.js create mode 100644 js/jquery.min.js create mode 100644 js/lunr.min.js create mode 100644 js/typeahead.jquery.js create mode 100644 search.json create mode 100644 undocumented.json diff --git a/Classes.html b/Classes.html new file mode 100644 index 0000000..f08c985 --- /dev/null +++ b/Classes.html @@ -0,0 +1,191 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + EntityStore + +
    +
    +
    +
    +
    +
    +

    Manages entities lifecycle and synchronisation

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class EntityStore
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Subscription + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Subscription
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/EntityStore.html b/Classes/EntityStore.html new file mode 100644 index 0000000..770778b --- /dev/null +++ b/Classes/EntityStore.html @@ -0,0 +1,951 @@ + + + + EntityStore Class Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityStore

+
+
+ +
public class EntityStore
+ +
+
+

Manages entities lifecycle and synchronisation

+ +
+
+
+
    +
  • +
    + + + + Update + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Update<T> = (inout T) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(queue:logger:) + +
    +
    +
    +
    +
    +
    +

    Create a new EntityStore instance optionally with a queue and a logger

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(queue: DispatchQueue? = nil, logger: Logger? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    the queue on which to receive updates. If nil identitymap will create its own.

    +
    +
    + + logger + + +
    +

    a logger to follow/debug identity internal state

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store an entity in the storage. Entity will be stored only if stamp (modifiedAt) is higher than in previous +insertion.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<T: Identifiable>(
    +    entity: T,
    +    named: AliasKey<T>? = nil,
    +    modifiedAt: Stamp? = nil,
    +    ifPresent update: Update<T>? = nil
    +) -> EntityObserver<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + entity + + +
    +

    the element to store in the identity map

    +
    +
    + + named + + +
    +

    an alias to reference the entity and retrieve it using it

    +
    +
    + + modifiedAt + + +
    +

    if entity was already stored it will be used to determine if the update should be applied or discarded

    +
    +
    + + ifPresent + + +
    +

    applies the closure before storing it if it’s already been stored. In this case this is similar as +calling update

    +
    +
    +
    +
    +

    Return Value

    +

    an object to observe changes on the entity

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store an aggregate in the storage. Each aggregate entities will be stored only if stamp (modifiedAt) is higher than in previous +insertion. Finally aggregate will be stored accordingly to each of its entities.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<T: Aggregate>(
    +    entity: T,
    +    named: AliasKey<T>? = nil,
    +    modifiedAt: Stamp? = nil,
    +    ifPresent update: Update<T>? = nil
    +) -> EntityObserver<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + entity + + +
    +

    the aggregate to store in the identity map

    +
    +
    + + named + + +
    +

    an alias to reference the aggregate and retrieve it using it

    +
    +
    + + modifiedAt + + +
    +

    if aggregate was already stored it will be used to determine if the update should be applied or discarded

    +
    +
    + + ifPresent + + +
    +

    applies the closure before storing it if it’s already been stored. In this case this is similar as +calling update

    +
    +
    +
    +
    +

    Return Value

    +

    an object to observe changes on the entity

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store multiple entities at once

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<C: Collection>(entities: C, named: AliasKey<C>? = nil, modifiedAt: Stamp? = nil)
    +-> EntityObserver<[C.Element]> where C.Element: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    store multiple aggregates at once

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<C: Collection>(entities: C, named: AliasKey<C>? = nil, modifiedAt: Stamp? = nil)
    +-> EntityObserver<[C.Element]> where C.Element: Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + find(_:id:) + +
    +
    +
    +
    +
    +
    +

    Try to find an entity/aggregate in the storage.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<T>(_ type: T.Type, id: T.ID) -> EntityObserver<T>? where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    the entity type

    +
    +
    + + id + + +
    +

    the entity id

    +
    +
    +
    +
    +

    Return Value

    +

    nil if not found, an EntityObserver` otherwise

    +
    +
    +
    +
  • +
  • +
    + + + + find(named:) + +
    +
    +
    +
    +
    +
    +

    Try to find an entity/aggregate registered under named alias

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<T>(named: AliasKey<T>) -> EntityObserver<T?> where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + named + + +
    +

    the alias to look for

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + find(named:) + +
    +
    +
    +
    +
    +
    +

    Try to find a collected registered under named alias

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<C>(named: AliasKey<C>) -> EntityObserver<C?> where C : Collection
    + +
    +
    +
    +

    Return Value

    +

    an observer returning the alias value. Note that the value will be an Array

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Update +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored entity using a closure. Useful to update a few properties or when you assume the entity +should already be stored. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(_ type: T.Type, id: T.ID, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. This is useful if you don’t have a full entity for update +but just a few attributes/modifications. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(_ type: T.Type, id: T.ID, modifiedAt: Stamp? = nil, _ update: Update<T>) -> Bool where T : Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(named: AliasKey<T>, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(named: AliasKey<T>, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already existing collection alias content +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<C: Collection>(named: AliasKey<C>, modifiedAt: Stamp? = nil, update: Update<C>)
    +-> Bool where C.Element: Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already existing collection alias content + Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<C: Collection>(named: AliasKey<C>, modifiedAt: Stamp? = nil, update: Update<C>)
    +-> Bool where C.Element: Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Delete +

+
+
+
    +
  • +
    + + + + removeAlias(named:) + +
    +
    +
    +
    +
    +
    +

    Removes an alias from the storage

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAlias<T>(named: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAlias(named:) + +
    +
    +
    +
    +
    +
    +

    Removes an alias from the storage

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAlias<C>(named: AliasKey<C>) where C : Collection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAllAlias() + +
    +
    +
    +
    +
    +
    +

    Removes all alias from identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAllAlias()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAll() + +
    +
    +
    +
    +
    +
    +

    Removes all alias AND all objects stored weakly. You should not need this method and rather use removeAlias. +But this can be useful if you fear retain cycles

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAll()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Classes/Subscription.html b/Classes/Subscription.html new file mode 100644 index 0000000..d4991e8 --- /dev/null +++ b/Classes/Subscription.html @@ -0,0 +1,168 @@ + + + + Subscription Class Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Subscription

+
+
+ +
public class Subscription
+ +
+
+ +
+
+
+
    +
  • +
    + + + + unsubscribe + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let unsubscribe: () -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums.html b/Enums.html new file mode 100644 index 0000000..b599c62 --- /dev/null +++ b/Enums.html @@ -0,0 +1,163 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + StampError + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum StampError : Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Enums/StampError.html b/Enums/StampError.html new file mode 100644 index 0000000..430e3c2 --- /dev/null +++ b/Enums/StampError.html @@ -0,0 +1,169 @@ + + + + StampError Enumeration Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

StampError

+
+
+ +
public enum StampError : Error
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    received stamp is smaller than current stamp

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case tooOld(current: Stamp, received: Stamp)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Extensions.html b/Extensions.html new file mode 100644 index 0000000..974cfd9 --- /dev/null +++ b/Extensions.html @@ -0,0 +1,216 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + Publisher + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Publisher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Date + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Date
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityNode + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension EntityNode: Hashable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Extensions/Date.html b/Extensions/Date.html new file mode 100644 index 0000000..551caff --- /dev/null +++ b/Extensions/Date.html @@ -0,0 +1,170 @@ + + + + Date Extension Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Date

+
+
+ +
extension Date
+ +
+
+ +
+
+
+
    +
  • +
    + + + + stamp + +
    +
    +
    +
    +
    +
    +

    Generate a stamp suitable to use in EntityStore. +Don’t suppose it equals unix timestamp (it is not)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var stamp: Stamp { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Extensions/Publisher.html b/Extensions/Publisher.html new file mode 100644 index 0000000..bea15f3 --- /dev/null +++ b/Extensions/Publisher.html @@ -0,0 +1,254 @@ + + + + Publisher Extension Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Publisher

+
+
+ +
extension Publisher
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Stores the Identifiable upstream into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<Output, Failure> where Output: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the Aggregate upstream into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<Output, Failure> where Output: Aggregate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the upstream collection into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<[Output.Element], Failure> where Output: Collection, Output.Element: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the upstream collection into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<[Output.Element], Failure> where Output: Collection, Output.Element: Aggregate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Protocols.html b/Protocols.html new file mode 100644 index 0000000..87668eb --- /dev/null +++ b/Protocols.html @@ -0,0 +1,222 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + Aggregate + +
    +
    +
    +
    +
    +
    +

    An Identifiable model containing nested models

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Aggregate : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityWrapper + +
    +
    +
    +
    +
    +
    +

    A type wrapping one or more Identifiable types. +You should rarely need to use this type. However it can happens to have a non Aggregate object containing Identifiable +objects to group them (for consistency or naming). This is especially true with enum cases.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Logger + +
    +
    +
    +
    +
    +
    +

    a protocol reporting EntityStore internal information

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Logger
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Protocols/Aggregate.html b/Protocols/Aggregate.html new file mode 100644 index 0000000..9a6ce5f --- /dev/null +++ b/Protocols/Aggregate.html @@ -0,0 +1,170 @@ + + + + Aggregate Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Aggregate

+
+
+ +
public protocol Aggregate : Identifiable
+ +
+
+

An Identifiable model containing nested models

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/Protocols/EntityWrapper.html b/Protocols/EntityWrapper.html new file mode 100644 index 0000000..452405c --- /dev/null +++ b/Protocols/EntityWrapper.html @@ -0,0 +1,189 @@ + + + + EntityWrapper Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityWrapper

+
+
+ +
public protocol EntityWrapper
+ +
+
+

A type wrapping one or more Identifiable types. +You should rarely need to use this type. However it can happens to have a non Aggregate object containing Identifiable +objects to group them (for consistency or naming). This is especially true with enum cases.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Entities contained by all cases relative to the parent container

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func wrappedEntitiesKeyPaths<Root>(relativeTo parent: WritableKeyPath<Root, Self>) -> [PartialIdentifiableKeyPath<Root>]
    + +
    +
    +
    +

    Return Value

    +

    entities contained in the wrapper +/ +Example: +/ “`swift +enum MyEnum: EntityWrapper { + case a(A) + case b(B)

    + +

    // note: you would also need to create computed getter/setter for a and b +func wrappedEntitiesKeyPaths(relativeTo root: WritableKeyPath) -> [PartialIdentifiableKeyPath] { + [.init(root.appending(.a)), .init(root.appending(.b))] +} +}

    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Protocols/Logger.html b/Protocols/Logger.html new file mode 100644 index 0000000..ee0cd16 --- /dev/null +++ b/Protocols/Logger.html @@ -0,0 +1,281 @@ + + + + Logger Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Logger

+
+
+ +
public protocol Logger
+ +
+
+

a protocol reporting EntityStore internal information

+ +
+
+
+
    +
  • +
    + + + + didStore(_:id:) + +
    +
    +
    +
    +
    +
    +

    Notify when an entity was stored in the identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didStore<T>(_ type: T.Type, id: T.ID) where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    the entity type

    +
    +
    + + id + + +
    +

    id of the stored entity

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didFailedToStore<T>(_ type: T.Type, id: T.ID, error: Error) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didRegisterAlias(_:) + +
    +
    +
    +
    +
    +
    +

    Notify an alias is registered with new entities

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didRegisterAlias<T>(_ alias: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Notify an alias is suppressed from the identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didUnregisterAlias<T>(_ alias: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs.html b/Structs.html new file mode 100644 index 0000000..8d0d636 --- /dev/null +++ b/Structs.html @@ -0,0 +1,220 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + AliasKey + +
    +
    +
    +
    +
    +
    +

    A value representing an Entity or set of Entity

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AliasKey<T> : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityObserver + +
    +
    +
    +
    +
    +
    +

    A type registering observers on a given entity from identity storage

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct EntityObserver<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct PartialIdentifiableKeyPath<Root>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/AliasKey.html b/Structs/AliasKey.html new file mode 100644 index 0000000..1ea0d99 --- /dev/null +++ b/Structs/AliasKey.html @@ -0,0 +1,169 @@ + + + + AliasKey Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AliasKey

+
+
+ +
public struct AliasKey<T> : Hashable
+ +
+
+

A value representing an Entity or set of Entity

+ +
+
+
+
    +
  • +
    + + + + init(named:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(named value: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/EntityObserver.html b/Structs/EntityObserver.html new file mode 100644 index 0000000..2063f38 --- /dev/null +++ b/Structs/EntityObserver.html @@ -0,0 +1,248 @@ + + + + EntityObserver Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityObserver

+
+
+ +
public struct EntityObserver<T>
+ +
+
+

A type registering observers on a given entity from identity storage

+ +
+
+
+
    +
  • +
    + + + + OnChange + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias OnChange = (T) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: T
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + observe(onChange:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(onChange: @escaping OnChange) -> Subscription
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + asPublisher + +
    +
    +
    +
    +
    +
    +

    A Publisher emitting the observer current value and subscribing to any subsequents new values

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var asPublisher: AnyPublisher<T, Never> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Structs/PartialIdentifiableKeyPath.html b/Structs/PartialIdentifiableKeyPath.html new file mode 100644 index 0000000..3344328 --- /dev/null +++ b/Structs/PartialIdentifiableKeyPath.html @@ -0,0 +1,406 @@ + + + + PartialIdentifiableKeyPath Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PartialIdentifiableKeyPath

+
+
+ +
public struct PartialIdentifiableKeyPath<Root>
+ +
+
+

A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an Identifiable keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T>) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an Aggregate keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T>) where T : Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an optional Identifiable keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T?>) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T?>) where T : Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C>) where C : MutableCollection, C.Element : Identifiable, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C?>) where C : MutableCollection, C.Element : Identifiable, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C>) where C : MutableCollection, C.Element : Aggregate, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C?>) where C : MutableCollection, C.Element : Aggregate, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrapper:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<W>(wrapper keyPath: WritableKeyPath<Root, W>) where W : EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrapper:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<W>(wrapper keyPath: WritableKeyPath<Root, W?>) where W : EntityWrapper
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/Typealiases.html b/Typealiases.html new file mode 100644 index 0000000..f34aeb8 --- /dev/null +++ b/Typealiases.html @@ -0,0 +1,216 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + EntityEnumWrapper + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias EntityEnumWrapper = EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IdentityMap + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias IdentityMap = EntityStore
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Stamp + +
    +
    +
    +
    +
    +
    +

    A type used to annotate track object modifications through time. +Most of the time you’ll just use date as stamp using Date().stamp method

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stamp = Double
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/badge.svg b/badge.svg new file mode 100644 index 0000000..a096fec --- /dev/null +++ b/badge.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + documentation + + + documentation + + + 100% + + + 100% + + + diff --git a/css/highlight.css b/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/css/jazzy.css b/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docsets/.docset/Contents/Info.plist b/docsets/.docset/Contents/Info.plist new file mode 100644 index 0000000..61863ec --- /dev/null +++ b/docsets/.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy. + CFBundleName + + DocSetPlatformFamily + + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docsets/.docset/Contents/Resources/Documents/Classes.html b/docsets/.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..f08c985 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,191 @@ + + + + Classes Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + EntityStore + +
    +
    +
    +
    +
    +
    +

    Manages entities lifecycle and synchronisation

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class EntityStore
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Subscription + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Subscription
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Classes/EntityStore.html b/docsets/.docset/Contents/Resources/Documents/Classes/EntityStore.html new file mode 100644 index 0000000..770778b --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Classes/EntityStore.html @@ -0,0 +1,951 @@ + + + + EntityStore Class Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityStore

+
+
+ +
public class EntityStore
+ +
+
+

Manages entities lifecycle and synchronisation

+ +
+
+
+
    +
  • +
    + + + + Update + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Update<T> = (inout T) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(queue:logger:) + +
    +
    +
    +
    +
    +
    +

    Create a new EntityStore instance optionally with a queue and a logger

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(queue: DispatchQueue? = nil, logger: Logger? = nil)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + queue + + +
    +

    the queue on which to receive updates. If nil identitymap will create its own.

    +
    +
    + + logger + + +
    +

    a logger to follow/debug identity internal state

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store an entity in the storage. Entity will be stored only if stamp (modifiedAt) is higher than in previous +insertion.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<T: Identifiable>(
    +    entity: T,
    +    named: AliasKey<T>? = nil,
    +    modifiedAt: Stamp? = nil,
    +    ifPresent update: Update<T>? = nil
    +) -> EntityObserver<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + entity + + +
    +

    the element to store in the identity map

    +
    +
    + + named + + +
    +

    an alias to reference the entity and retrieve it using it

    +
    +
    + + modifiedAt + + +
    +

    if entity was already stored it will be used to determine if the update should be applied or discarded

    +
    +
    + + ifPresent + + +
    +

    applies the closure before storing it if it’s already been stored. In this case this is similar as +calling update

    +
    +
    +
    +
    +

    Return Value

    +

    an object to observe changes on the entity

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store an aggregate in the storage. Each aggregate entities will be stored only if stamp (modifiedAt) is higher than in previous +insertion. Finally aggregate will be stored accordingly to each of its entities.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<T: Aggregate>(
    +    entity: T,
    +    named: AliasKey<T>? = nil,
    +    modifiedAt: Stamp? = nil,
    +    ifPresent update: Update<T>? = nil
    +) -> EntityObserver<T>
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + entity + + +
    +

    the aggregate to store in the identity map

    +
    +
    + + named + + +
    +

    an alias to reference the aggregate and retrieve it using it

    +
    +
    + + modifiedAt + + +
    +

    if aggregate was already stored it will be used to determine if the update should be applied or discarded

    +
    +
    + + ifPresent + + +
    +

    applies the closure before storing it if it’s already been stored. In this case this is similar as +calling update

    +
    +
    +
    +
    +

    Return Value

    +

    an object to observe changes on the entity

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Store multiple entities at once

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<C: Collection>(entities: C, named: AliasKey<C>? = nil, modifiedAt: Stamp? = nil)
    +-> EntityObserver<[C.Element]> where C.Element: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    store multiple aggregates at once

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store<C: Collection>(entities: C, named: AliasKey<C>? = nil, modifiedAt: Stamp? = nil)
    +-> EntityObserver<[C.Element]> where C.Element: Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + find(_:id:) + +
    +
    +
    +
    +
    +
    +

    Try to find an entity/aggregate in the storage.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<T>(_ type: T.Type, id: T.ID) -> EntityObserver<T>? where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    the entity type

    +
    +
    + + id + + +
    +

    the entity id

    +
    +
    +
    +
    +

    Return Value

    +

    nil if not found, an EntityObserver` otherwise

    +
    +
    +
    +
  • +
  • +
    + + + + find(named:) + +
    +
    +
    +
    +
    +
    +

    Try to find an entity/aggregate registered under named alias

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<T>(named: AliasKey<T>) -> EntityObserver<T?> where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + named + + +
    +

    the alias to look for

    +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + find(named:) + +
    +
    +
    +
    +
    +
    +

    Try to find a collected registered under named alias

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func find<C>(named: AliasKey<C>) -> EntityObserver<C?> where C : Collection
    + +
    +
    +
    +

    Return Value

    +

    an observer returning the alias value. Note that the value will be an Array

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Update +

+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored entity using a closure. Useful to update a few properties or when you assume the entity +should already be stored. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(_ type: T.Type, id: T.ID, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. This is useful if you don’t have a full entity for update +but just a few attributes/modifications. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(_ type: T.Type, id: T.ID, modifiedAt: Stamp? = nil, _ update: Update<T>) -> Bool where T : Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(named: AliasKey<T>, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already stored alias using a closure. +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<T>(named: AliasKey<T>, modifiedAt: Stamp? = nil, update: Update<T>) -> Bool where T : Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already existing collection alias content +Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<C: Collection>(named: AliasKey<C>, modifiedAt: Stamp? = nil, update: Update<C>)
    +-> Bool where C.Element: Identifiable
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Updates an already existing collection alias content + Note: the closure is evaluated before checking modifiedAt. As such the closure execution does not mean +the change was applied

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @discardableResult
    +public func update<C: Collection>(named: AliasKey<C>, modifiedAt: Stamp? = nil, update: Update<C>)
    +-> Bool where C.Element: Aggregate
    + +
    +
    +
    +

    Return Value

    +

    true if entity exists and might be updated, false otherwise. The update might not be applied if modifiedAt is too old

    +
    +
    +
    +
  • +
+
+
+
+ + +
+ +

Delete +

+
+
+
    +
  • +
    + + + + removeAlias(named:) + +
    +
    +
    +
    +
    +
    +

    Removes an alias from the storage

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAlias<T>(named: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAlias(named:) + +
    +
    +
    +
    +
    +
    +

    Removes an alias from the storage

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAlias<C>(named: AliasKey<C>) where C : Collection
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAllAlias() + +
    +
    +
    +
    +
    +
    +

    Removes all alias from identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAllAlias()
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + removeAll() + +
    +
    +
    +
    +
    +
    +

    Removes all alias AND all objects stored weakly. You should not need this method and rather use removeAlias. +But this can be useful if you fear retain cycles

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func removeAll()
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Classes/Subscription.html b/docsets/.docset/Contents/Resources/Documents/Classes/Subscription.html new file mode 100644 index 0000000..d4991e8 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Classes/Subscription.html @@ -0,0 +1,168 @@ + + + + Subscription Class Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Subscription

+
+
+ +
public class Subscription
+ +
+
+ +
+
+
+
    +
  • +
    + + + + unsubscribe + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let unsubscribe: () -> Void
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Enums.html b/docsets/.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..b599c62 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,163 @@ + + + + Enumerations Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Enumerations

+

The following enumerations are available globally.

+ +
+
+
+
    +
  • +
    + + + + StampError + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum StampError : Error
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Enums/StampError.html b/docsets/.docset/Contents/Resources/Documents/Enums/StampError.html new file mode 100644 index 0000000..430e3c2 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Enums/StampError.html @@ -0,0 +1,169 @@ + + + + StampError Enumeration Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

StampError

+
+
+ +
public enum StampError : Error
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    received stamp is smaller than current stamp

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case tooOld(current: Stamp, received: Stamp)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Extensions.html b/docsets/.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 0000000..974cfd9 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,216 @@ + + + + Extensions Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + Publisher + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Publisher
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Date + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension Date
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityNode + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    extension EntityNode: Hashable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Extensions/Date.html b/docsets/.docset/Contents/Resources/Documents/Extensions/Date.html new file mode 100644 index 0000000..551caff --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Extensions/Date.html @@ -0,0 +1,170 @@ + + + + Date Extension Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Date

+
+
+ +
extension Date
+ +
+
+ +
+
+
+
    +
  • +
    + + + + stamp + +
    +
    +
    +
    +
    +
    +

    Generate a stamp suitable to use in EntityStore. +Don’t suppose it equals unix timestamp (it is not)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var stamp: Stamp { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html b/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html new file mode 100644 index 0000000..bea15f3 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Extensions/Publisher.html @@ -0,0 +1,254 @@ + + + + Publisher Extension Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Publisher

+
+
+ +
extension Publisher
+ +
+
+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Stores the Identifiable upstream into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<Output, Failure> where Output: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the Aggregate upstream into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<Output, Failure> where Output: Aggregate
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the upstream collection into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<[Output.Element], Failure> where Output: Collection, Output.Element: Identifiable
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Stores the upstream collection into an entityStore

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func store(in entityStore: EntityStore, named: AliasKey<Output>? = nil, modifiedAt: Stamp = Date().stamp)
    +-> AnyPublisher<[Output.Element], Failure> where Output: Collection, Output.Element: Aggregate
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Protocols.html b/docsets/.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..87668eb --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,222 @@ + + + + Protocols Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + Aggregate + +
    +
    +
    +
    +
    +
    +

    An Identifiable model containing nested models

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Aggregate : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityWrapper + +
    +
    +
    +
    +
    +
    +

    A type wrapping one or more Identifiable types. +You should rarely need to use this type. However it can happens to have a non Aggregate object containing Identifiable +objects to group them (for consistency or naming). This is especially true with enum cases.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Logger + +
    +
    +
    +
    +
    +
    +

    a protocol reporting EntityStore internal information

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Logger
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Protocols/Aggregate.html b/docsets/.docset/Contents/Resources/Documents/Protocols/Aggregate.html new file mode 100644 index 0000000..9a6ce5f --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Protocols/Aggregate.html @@ -0,0 +1,170 @@ + + + + Aggregate Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Aggregate

+
+
+ +
public protocol Aggregate : Identifiable
+ +
+
+

An Identifiable model containing nested models

+ +
+
+
+ +
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Protocols/EntityWrapper.html b/docsets/.docset/Contents/Resources/Documents/Protocols/EntityWrapper.html new file mode 100644 index 0000000..452405c --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Protocols/EntityWrapper.html @@ -0,0 +1,189 @@ + + + + EntityWrapper Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityWrapper

+
+
+ +
public protocol EntityWrapper
+ +
+
+

A type wrapping one or more Identifiable types. +You should rarely need to use this type. However it can happens to have a non Aggregate object containing Identifiable +objects to group them (for consistency or naming). This is especially true with enum cases.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Entities contained by all cases relative to the parent container

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func wrappedEntitiesKeyPaths<Root>(relativeTo parent: WritableKeyPath<Root, Self>) -> [PartialIdentifiableKeyPath<Root>]
    + +
    +
    +
    +

    Return Value

    +

    entities contained in the wrapper +/ +Example: +/ “`swift +enum MyEnum: EntityWrapper { + case a(A) + case b(B)

    + +

    // note: you would also need to create computed getter/setter for a and b +func wrappedEntitiesKeyPaths(relativeTo root: WritableKeyPath) -> [PartialIdentifiableKeyPath] { + [.init(root.appending(.a)), .init(root.appending(.b))] +} +}

    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Protocols/Logger.html b/docsets/.docset/Contents/Resources/Documents/Protocols/Logger.html new file mode 100644 index 0000000..ee0cd16 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Protocols/Logger.html @@ -0,0 +1,281 @@ + + + + Logger Protocol Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Logger

+
+
+ +
public protocol Logger
+ +
+
+

a protocol reporting EntityStore internal information

+ +
+
+
+
    +
  • +
    + + + + didStore(_:id:) + +
    +
    +
    +
    +
    +
    +

    Notify when an entity was stored in the identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didStore<T>(_ type: T.Type, id: T.ID) where T : Identifiable
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + type + + +
    +

    the entity type

    +
    +
    + + id + + +
    +

    id of the stored entity

    +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didFailedToStore<T>(_ type: T.Type, id: T.ID, error: Error) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + didRegisterAlias(_:) + +
    +
    +
    +
    +
    +
    +

    Notify an alias is registered with new entities

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didRegisterAlias<T>(_ alias: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Notify an alias is suppressed from the identity map

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func didUnregisterAlias<T>(_ alias: AliasKey<T>)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Structs.html b/docsets/.docset/Contents/Resources/Documents/Structs.html new file mode 100644 index 0000000..8d0d636 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Structs.html @@ -0,0 +1,220 @@ + + + + Structures Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Structures

+

The following structures are available globally.

+ +
+
+
+
    +
  • +
    + + + + AliasKey + +
    +
    +
    +
    +
    +
    +

    A value representing an Entity or set of Entity

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct AliasKey<T> : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + EntityObserver + +
    +
    +
    +
    +
    +
    +

    A type registering observers on a given entity from identity storage

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct EntityObserver<T>
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct PartialIdentifiableKeyPath<Root>
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Structs/AliasKey.html b/docsets/.docset/Contents/Resources/Documents/Structs/AliasKey.html new file mode 100644 index 0000000..1ea0d99 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Structs/AliasKey.html @@ -0,0 +1,169 @@ + + + + AliasKey Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

AliasKey

+
+
+ +
public struct AliasKey<T> : Hashable
+ +
+
+

A value representing an Entity or set of Entity

+ +
+
+
+
    +
  • +
    + + + + init(named:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(named value: String)
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Structs/EntityObserver.html b/docsets/.docset/Contents/Resources/Documents/Structs/EntityObserver.html new file mode 100644 index 0000000..2063f38 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Structs/EntityObserver.html @@ -0,0 +1,248 @@ + + + + EntityObserver Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

EntityObserver

+
+
+ +
public struct EntityObserver<T>
+ +
+
+

A type registering observers on a given entity from identity storage

+ +
+
+
+
    +
  • +
    + + + + OnChange + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias OnChange = (T) -> Void
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + value + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public let value: T
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + observe(onChange:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func observe(onChange: @escaping OnChange) -> Subscription
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + asPublisher + +
    +
    +
    +
    +
    +
    +

    A Publisher emitting the observer current value and subscribing to any subsequents new values

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var asPublisher: AnyPublisher<T, Never> { get }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Structs/PartialIdentifiableKeyPath.html b/docsets/.docset/Contents/Resources/Documents/Structs/PartialIdentifiableKeyPath.html new file mode 100644 index 0000000..3344328 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Structs/PartialIdentifiableKeyPath.html @@ -0,0 +1,406 @@ + + + + PartialIdentifiableKeyPath Structure Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

PartialIdentifiableKeyPath

+
+
+ +
public struct PartialIdentifiableKeyPath<Root>
+ +
+
+

A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

+ +
+
+
+
    +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an Identifiable keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T>) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an Aggregate keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T>) where T : Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Creates an instance referencing an optional Identifiable keyPath

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T?>) where T : Identifiable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<T>(_ keyPath: WritableKeyPath<Root, T?>) where T : Aggregate
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C>) where C : MutableCollection, C.Element : Identifiable, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C?>) where C : MutableCollection, C.Element : Identifiable, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C>) where C : MutableCollection, C.Element : Aggregate, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<C>(_ keyPath: WritableKeyPath<Root, C?>) where C : MutableCollection, C.Element : Aggregate, C.Index : Hashable
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrapper:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<W>(wrapper keyPath: WritableKeyPath<Root, W>) where W : EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(wrapper:) + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init<W>(wrapper keyPath: WritableKeyPath<Root, W?>) where W : EntityWrapper
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/Typealiases.html b/docsets/.docset/Contents/Resources/Documents/Typealiases.html new file mode 100644 index 0000000..f34aeb8 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/Typealiases.html @@ -0,0 +1,216 @@ + + + + Type Aliases Reference + + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+

Type Aliases

+

The following type aliases are available globally.

+ +
+
+
+
    +
  • +
    + + + + EntityEnumWrapper + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias EntityEnumWrapper = EntityWrapper
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + IdentityMap + +
    +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias IdentityMap = EntityStore
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Stamp + +
    +
    +
    +
    +
    +
    +

    A type used to annotate track object modifications through time. +Most of the time you’ll just use date as stamp using Date().stamp method

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public typealias Stamp = Double
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docsets/.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..c170357 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight .c { + color: #999988; + font-style: italic; } + +.highlight .err { + color: #a61717; + background-color: #e3d2d2; } + +.highlight .k { + color: #000000; + font-weight: bold; } + +.highlight .o { + color: #000000; + font-weight: bold; } + +.highlight .cm { + color: #999988; + font-style: italic; } + +.highlight .cp { + color: #999999; + font-weight: bold; } + +.highlight .c1 { + color: #999988; + font-style: italic; } + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + +.highlight .gd { + color: #000000; + background-color: #ffdddd; } + +.highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + +.highlight .ge { + color: #000000; + font-style: italic; } + +.highlight .gr { + color: #aa0000; } + +.highlight .gh { + color: #999999; } + +.highlight .gi { + color: #000000; + background-color: #ddffdd; } + +.highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + +.highlight .go { + color: #888888; } + +.highlight .gp { + color: #555555; } + +.highlight .gs { + font-weight: bold; } + +.highlight .gu { + color: #aaaaaa; } + +.highlight .gt { + color: #aa0000; } + +.highlight .kc { + color: #000000; + font-weight: bold; } + +.highlight .kd { + color: #000000; + font-weight: bold; } + +.highlight .kp { + color: #000000; + font-weight: bold; } + +.highlight .kr { + color: #000000; + font-weight: bold; } + +.highlight .kt { + color: #445588; } + +.highlight .m { + color: #009999; } + +.highlight .s { + color: #d14; } + +.highlight .na { + color: #008080; } + +.highlight .nb { + color: #0086B3; } + +.highlight .nc { + color: #445588; + font-weight: bold; } + +.highlight .no { + color: #008080; } + +.highlight .ni { + color: #800080; } + +.highlight .ne { + color: #990000; + font-weight: bold; } + +.highlight .nf { + color: #990000; } + +.highlight .nn { + color: #555555; } + +.highlight .nt { + color: #000080; } + +.highlight .nv { + color: #008080; } + +.highlight .ow { + color: #000000; + font-weight: bold; } + +.highlight .w { + color: #bbbbbb; } + +.highlight .mf { + color: #009999; } + +.highlight .mh { + color: #009999; } + +.highlight .mi { + color: #009999; } + +.highlight .mo { + color: #009999; } + +.highlight .sb { + color: #d14; } + +.highlight .sc { + color: #d14; } + +.highlight .sd { + color: #d14; } + +.highlight .s2 { + color: #d14; } + +.highlight .se { + color: #d14; } + +.highlight .sh { + color: #d14; } + +.highlight .si { + color: #d14; } + +.highlight .sx { + color: #d14; } + +.highlight .sr { + color: #009926; } + +.highlight .s1 { + color: #d14; } + +.highlight .ss { + color: #990073; } + +.highlight .bp { + color: #999999; } + +.highlight .vc { + color: #008080; } + +.highlight .vg { + color: #008080; } + +.highlight .vi { + color: #008080; } + +.highlight .il { + color: #009999; } diff --git a/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docsets/.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..2e38713 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,439 @@ +/*! Jazzy - https://github.com/realm/jazzy + * Copyright Realm Inc. + * SPDX-License-Identifier: MIT + */ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h4 { + font-size: 13px; + line-height: 1.5; + margin-top: 21px; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +.section-name { + color: gray; + display: block; + font-family: Helvetica; + font-size: 22px; + font-weight: 100; + margin-bottom: 15px; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +pre > code { + padding: 0; } + +a { + color: #0088cc; + text-decoration: none; } + a code { + color: inherit; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +hr { + height: 1px; + border: none; + background-color: #e2e2e2; } + +.footnote-ref { + display: inline-block; + scroll-margin-top: 70px; } + +.footnote-def { + scroll-margin-top: 70px; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 32px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 3; } + header img { + padding-right: 6px; + vertical-align: -3px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 21px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 2; + margin-top: 32px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; + white-space: nowrap; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 20px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + .main-content section .heading:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .main-content .section-name p { + margin-bottom: inherit; + line-height: inherit; } + .main-content .section-name code { + background-color: inherit; + padding: inherit; + color: inherit; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + margin-top: 10px; + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.task-name-container a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + +.section-name-container { + position: relative; + display: inline-block; } + .section-name-container .section-name-link { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 0; + margin-bottom: 0; } + .section-name-container .section-name { + position: relative; + pointer-events: none; + z-index: 1; } + .section-name-container .section-name a { + pointer-events: auto; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token, .item .direct-link { + display: inline-block; + text-indent: -20px; + padding-left: 3px; + margin-left: 35px; + font-size: 11.9px; + transition: all 300ms; } + .item .token-open { + margin-left: 20px; } + .item .discouraged { + text-decoration: line-through; } + .item .declaration-note { + font-size: .85em; + color: gray; + font-style: italic; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +.aside, .language { + padding: 6px 12px; + margin: 12px 0; + border-left: 5px solid #dddddd; + overflow-y: hidden; } + .aside .aside-title, .language .aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; + margin: 0; + color: #aaa; + -webkit-user-select: none; } + .aside p:last-child, .language p:last-child { + margin-bottom: 0; } + +.language { + border-left: 5px solid #cde9f4; } + .language .aside-title { + color: #4b8afb; } + +.aside-warning, .aside-deprecated, .aside-unavailable { + border-left: 5px solid #ff6666; } + .aside-warning .aside-title, .aside-deprecated .aside-title, .aside-unavailable .aside-title { + color: #ff0000; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: relative; + top: 10px; + bottom: 0px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } + +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } + +html.dash .height-container { + display: block; } + +html.dash .item .token { + margin-left: 0; } + +html.dash .content-wrapper { + width: auto; } + +html.dash #footer { + position: static; } + +form[role=search] { + float: right; } + form[role=search] input { + font: Helvetica, freesans, Arial, sans-serif; + margin-top: 6px; + font-size: 13px; + line-height: 20px; + padding: 0px 10px; + border: none; + border-radius: 1em; } + .loading form[role=search] input { + background: white url(../img/spinner.gif) center right 4px no-repeat; } + form[role=search] .tt-menu { + margin: 0; + min-width: 300px; + background: #fff; + color: #333; + border: 1px solid #e2e2e2; + z-index: 4; } + form[role=search] .tt-highlight { + font-weight: bold; } + form[role=search] .tt-suggestion { + font: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + padding: 0 8px; } + form[role=search] .tt-suggestion span { + display: table-cell; + white-space: nowrap; } + form[role=search] .tt-suggestion .doc-parent-name { + width: 100%; + text-align: right; + font-weight: normal; + font-size: 0.9em; + padding-left: 16px; } + form[role=search] .tt-suggestion:hover, + form[role=search] .tt-suggestion.tt-cursor { + cursor: pointer; + background-color: #4183c4; + color: #fff; } + form[role=search] .tt-suggestion:hover .doc-parent-name, + form[role=search] .tt-suggestion.tt-cursor .doc-parent-name { + color: #fff; } diff --git a/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docsets/.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000000000000000000000000000000000000..29d2f7fd4955fca6bc6fb740e0373a2c358c398e GIT binary patch literal 274 zcmeAS@N?(olHy`uVBq!ia0vp^0zfRo!3HEV4DF?Wlw^r(L`iUdT1k0gQ7VIDN`6wR zf@f}GdTLN=VoGJ<$y6JlqAi{-jv*Ddl5#RKJQ5NTUZgiPI4RUKGIKU?u8L&ndhX1t za+0CMVUnT(Gnb}ei=c~x==tMH^F1_tBocXwcoSWoO-SZY-o>!8%^=Bms)(~h;m_U( zXNixk28L}0LS5-jKyq@#2gyS|J&f#pGCLkTc<@2s1dqeyqJ*Rc0tSIETAgmODY;(s z2y|Mcp&2}7rpBprBBB~1qM1`N+}4SoxYVPqsXi&l`rxZp{(w0iSy$Nv5*Vy!RapG^ S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docsets/.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/docsets/.docset/Contents/Resources/Documents/index.html b/docsets/.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..e012fe5 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,406 @@ + + + + Reference + + + + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

CohesionKit - Single Source of Truth

+ +

+ swift + platforms + test + + twitter + +

+ +

Keep your models synchronized in your app and never have any inconsistency anymore. Designed using latest Swift features.

+

Why using CohesionKit?

+ +
    +
  • 🔁 You need realtime synchronisation (websockets)
  • +
  • 🌐 You have multiple data sources (REST, CoreData, websocket, phone Contacts, Google Maps, etc…)
  • +
  • 🪶 You look for a full Swift lightweight tool
  • +
  • 🗃️ You want to use structs
  • +
+

Features

+ +
    +
  • [x] 🦺 Thread safe
  • +
  • [x] 🪶 Lighweight (< 600 lines of code)
  • +
  • [x] 🪪 Working with plain Swift struct and Identifiable objects
  • +
  • [x] 🔀 Support for Combine
  • +
  • [x] 🧠 In-memory storage
  • +
  • [x] 🐾 Low memory footprint
  • +
  • [x] 🐪 Strongly typed
  • +
+

Where to put CohesionKit in my stack?

+ +

CohesionKit being a Single Source of Truth solution it handles your objects lifecycle and synchronization from any source.

+ +

You should put CohesionKit in front of your data sources (REST API, GraphQL, …) before returning data to your app.

+
sequenceDiagram
+    autonumber
+
+        YourApp ->>DataSource: findBooks
+        DataSource ->>GraphQL: query findBooks
+        GraphQL -->>DataSource: FindBooksQueryResult
+        DataSource ->>CohesionKit: store books [A,B,C]
+        CohesionKit -->> YourApp: Publisher<[A,B,C]>
+
+        WebSocket ->> WebSocketListener: book A updated
+        WebSocketListener ->> CohesionKit: update book A
+        CohesionKit -->> YourApp: Publisher<[A,B,C]>
+
+

Installation

+ +
    +
  • Swift Package Manager
  • +
+
dependencies: [
+    .package(url: "https://github.com/pjechris/CohesionKit.git", .upToNextMajor(from: "0.7.0"))
+]
+
+

Examples

+ +

Library comes with an example project so you can see a real case usage. It mostly shows:

+ +
    +
  • How to store data in the library
  • +
  • How to retrieve and update that data for realtime
  • +
  • How data is synchronised throughout multiple screens
  • +
+

Getting started

+

Storing an object

+ +

First create an instance of EntityStore:

+
let entityStore = EntityStore()
+
+ +

EntityStore let you store Identifiable objects:

+
struct Book: Identifiable {
+  let id: String
+  let title: String
+}
+
+let book = Book(id: "ABCD", name: "My Book")
+
+entityStore.store(book)
+
+ +

Then You can retrieve the object from anywhere in your code:

+
// somewhere else in the code
+entityStore.find(Book.self, id: "ABCD") // return Book(id: "ABCD", name: "My Book")
+
+

Observing changes

+ +

Every time data is updated in EntityStore triggers a notification to any registered observer. To register yourself as an observer just use result from store or find methods:

+
func findBooks() -> some Publisher<[Book], Error> {
+  // 1. load data using URLSession
+  URLSession(...)
+  // 2. store data inside our entityStore
+    .store(in: entityStore)
+    .sink { ... }
+    .store(in: &cancellables)
+}
+
+
entityStore.find(Book.self, id: 1)?
+  .asPublisher
+  .sink { ... }
+  .store(in: &cancellables)
+
+ +
+

CohesionKit has a weak memory policy you should read about. As such, returned value from entityStore.store must be strongly retained to not lose value.

+ +

For brievety, next examples will omit .sink { ... }.store(in:&cancellables).

+
+

Relational objects

+ +

To store objects containing nested identity objects you need to make them conform to one protocol: Aggregate.

+
struct AuthorBooks: Aggregate {
+  var id: Author.ID { author.id }
+
+  var author: Author
+  var books: [Book]
+
+  // `nestedEntitiesKeyPaths` must list all Identifiable/Aggregate this object contain
+  var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<Self>] {
+    [.init(\.author), .init(\.books)]
+  }
+}
+
+ +

CohesionKit then handles synchronisation for the three entities:

+ +
    +
  • AuthorBook
  • +
+

Author

+ Author + +
    +
  • Book
  • +
+ +

This gives you the ability to retrieve them independently from each other:

+
let authorBooks = AuthorBooks(
+    author: Author(id: 1, name: "George R.R Martin"),
+    books: [
+      Book(id: "ACK", title: "A Clash of Kings"),
+      Book(id: "ADD", title: "A Dance with Dragons")
+    ]
+)
+
+entityStore.store(authorBooks)
+
+entityStore.find(Author.self, id: 1) // George R.R Martin
+entityStore.find(Book.self, id: "ACK") // A Clash of Kings
+entityStore.find(Book.self, id: "ADD") // A Dance with Dragons
+
+ +

You can also modify any of them however you want. Notice the change is visible from the object itself AND from aggregate objects:

+
let newAuthor = Author(id: 1, name: "George R.R MartinI")
+
+entityStore.store(newAuthor)
+
+entityStore.find(Author.self, id: 1) // George R.R MartinI
+entityStore.find(AuthorBooks.self, id: 1) // George R.R MartinI + [A Clash of Kings, A Dance with Dragons]
+
+ +
+

You might think about storing books on Author directly (author.books). In this case Author needs to implement Aggregate and declare books as nested entity.

+ +

However I strongly advise you to not nest Identifiable objects into other Identifiable objects. Read Handling relationships article if you want to know more about this subject.

+
+

Storing vs Updating

+ +

For now we only focused on entityStore.store but CohesionKit comes with another method to store data: entityStore.update.

+ +

Sometimes both can be used but they each have a different purpose:

+ +
    +
  1. store is suited for storing full data retrieved from webservices, like GET /user for instance
  2. +
  3. update is usually used for partial data. It’s also the preferred method when receiving events from websockets.
  4. +
+

Advanced topics

+

Enum support

+ +

Starting with 0.13 library has support for enum types. Note that you’ll need to conform to EntityWrapper and provide computed getter/setter for each entity you’d like to store.

+
enum MediaType: EntityWrapper {
+  case book(Book)
+  case game(Game)
+  case tvShow(TvShow)
+
+  func wrappedEntitiesKeyPaths<Root>(relativeTo parent: WritableKeyPath<Root, Self>) -> [PartialIdentifiableKeyPath<Root>] {
+    [.init(parent.appending(\.book)), .init(parent.appending(\.game)), .init(parent.appending(\.tvShow))]
+  }
+
+  var book: Book? {
+    get { ... }
+    set { ... }
+  }
+
+  var game: Game? {
+    get { ... }
+    set { ... }
+  }
+
+  var tvShow: TvShow? {
+    get { ... }
+    set { ... }
+  }
+}
+
+struct AuthorMedia: Aggregate {
+  var author: Author
+  var media: MediaType
+
+  var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<Self>] {
+    [.init(\.author), .init(wrapper: \.media)]
+  }
+}
+
+

Aliases

+ +

Sometimes you need to retrieve data without knowing the object id. Common case is current user.

+ +

CohesionKit provides a suitable mechanism: aliases. Aliases allow you to register and find entities using a key.

+
extension AliasKey where T == User {
+  static let currentUser = AliasKey("user")
+}
+
+entityStore.store(currentUser, named: .currentUser)
+
+ +

Then request it somewhere else:

+
entityStore.find(named: .currentUser) // return the current user
+
+ +

Compared to regular entities, aliased objects are long-live objects: they will be kept in the storage even if no one observes them. This allow registered observers to be notified when alias value change:

+
entityStore.removeAlias(named: .currentUser) // observers will be notified currentUser is nil.
+
+entityStore.store(newCurrentUser, named: .currentUser) // observers will be notified that currentUser changed even if currentUser was nil before
+
+

Stale data

+ +

When storing data CohesionKit actually require you to set a modification stamp on it. Stamp is used as a marker to compare data freshness: the higher stamp is the more recent data is.

+ +

By default CohesionKit will use the current date as stamp.

+
entityStore.store(book) // use default stamp: current date
+entityStore.store(book, modifiedAt: Date().stamp) // explicitly use Date time stamp
+entityStore.store(book, modifiedAt: 9000) // any Double value is valid
+
+ +

If for some reason you try to store data with a stamp lower than the already stamped stored data then the update will be discarded.

+

Weak memory management

+ +

CohesionKit has a weak memory policy: objects are kept in EntityStore as long as someone use them.

+ +

To that end you need to retain observers as long as you’re interested in the data:

+
let book = Book(id: "ACK", title: "A Clash of Kings")
+let cancellable = entityStore.store(book) // observer is retained: data is retained
+
+entityStore.find(Book.self, id: "ACK") // return  "A Clash of Kings"
+
+ +

If you don’t create/retain observers then once entities have no more observers they will be automatically discarded from the storage.

+
let book = Book(id: "ACK", title: "A Clash of Kings")
+_ = entityStore.store(book) // observer is not retained and no one else observe this book: data is released
+
+entityStore.find(Book.self, id: "ACK") // return nil
+
+
let book = Book(id: "ACK", title: "A Clash of Kings")
+var cancellable = entityStore.store(book).asPublisher.sink { ... }
+let cancellable2 = entityStore.find(Book.self, id: "ACK") // return a publisher
+
+cancellable = nil
+
+entityStore.find(Book.self, id: "ACK") // return "A Clash of Kings" because cancellable2 still observe this book
+
+

License

+ +

This project is released under the MIT License. Please see the LICENSE file for details.

+ +
+
+ +
+
+ + diff --git a/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docsets/.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js b/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/docsets/.docset/Contents/Resources/Documents/js/typeahead.jquery.js b/docsets/.docset/Contents/Resources/Documents/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/docsets/.docset/Contents/Resources/Documents/search.json b/docsets/.docset/Contents/Resources/Documents/search.json new file mode 100644 index 0000000..013be5f --- /dev/null +++ b/docsets/.docset/Contents/Resources/Documents/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:11CohesionKit17EntityEnumWrappera":{"name":"EntityEnumWrapper"},"Typealiases.html#/s:11CohesionKit11IdentityMapa":{"name":"IdentityMap"},"Typealiases.html#/s:11CohesionKit5Stampa":{"name":"Stamp","abstract":"

A type used to annotate track object modifications through time."},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__Gcs0D0Rd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an Identifiable keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcAA9AggregateRd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an Aggregate keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcs0D0Rd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an optional Identifiable keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcAA9AggregateRd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcSMRd__s0D07ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcSMRd__s0D07ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcSMRd__AA9Aggregate7ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcSMRd__AA9Aggregate7ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathV7wrapperACyxGs08WritableeF0Cyxqd__G_tcAA13EntityWrapperRd__lufc":{"name":"init(wrapper:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathV7wrapperACyxGs08WritableeF0Cyxqd__SgG_tcAA13EntityWrapperRd__lufc":{"name":"init(wrapper:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV8OnChangea":{"name":"OnChange","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV5valuexvp":{"name":"value","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV7observe8onChangeAA12SubscriptionCyxc_tF":{"name":"observe(onChange:)","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV11asPublisher7Combine03AnyF0Vyxs5NeverOGvp":{"name":"asPublisher","abstract":"

A Publisher emitting the observer current value and subscribing to any subsequents new values

","parent_name":"EntityObserver"},"Structs/AliasKey.html#/s:11CohesionKit8AliasKeyV5namedACyxGSS_tcfc":{"name":"init(named:)","parent_name":"AliasKey"},"Structs/AliasKey.html":{"name":"AliasKey","abstract":"

A value representing an Entity or set of Entity

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

A type registering observers on a given entity from identity storage

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

A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP8didStore_2idyqd__m_2IDQyd__ts12IdentifiableRd__lF":{"name":"didStore(_:id:)","abstract":"

Notify when an entity was stored in the identity map

","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP16didFailedToStore_2id5erroryqd__m_2IDQyd__s5Error_pts12IdentifiableRd__lF":{"name":"didFailedToStore(_:id:error:)","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP16didRegisterAliasyyAA0F3KeyVyqd__GlF":{"name":"didRegisterAlias(_:)","abstract":"

Notify an alias is registered with new entities

","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP18didUnregisterAliasyyAA0F3KeyVyqd__GlF":{"name":"didUnregisterAlias(_:)","abstract":"

Notify an alias is suppressed from the identity map

","parent_name":"Logger"},"Protocols/EntityWrapper.html#/s:11CohesionKit13EntityWrapperP23wrappedEntitiesKeyPaths10relativeToSayAA019PartialIdentifiableG4PathVyqd__GGs08WritablegM0Cyqd__xG_tlF":{"name":"wrappedEntitiesKeyPaths(relativeTo:)","abstract":"

Entities contained by all cases relative to the parent container

","parent_name":"EntityWrapper"},"Protocols/Aggregate.html#/s:11CohesionKit9AggregateP22nestedEntitiesKeyPathsSayAA019PartialIdentifiableF4PathVyxGGvp":{"name":"nestedEntitiesKeyPaths","abstract":"

keypaths to nested models

","parent_name":"Aggregate"},"Protocols/Aggregate.html":{"name":"Aggregate","abstract":"

An Identifiable model containing nested models

"},"Protocols/EntityWrapper.html":{"name":"EntityWrapper","abstract":"

A type wrapping one or more Identifiable types."},"Protocols/Logger.html":{"name":"Logger","abstract":"

a protocol reporting EntityStore internal information

"},"Extensions/Date.html#/s:10Foundation4DateV11CohesionKitE5stampSdvp":{"name":"stamp","abstract":"

Generate a stamp suitable to use in EntityStore.","parent_name":"Date"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0Vy6OutputQz7FailureQzGAD11EntityStoreC_AD8AliasKeyVyALGSgSdts12IdentifiableALRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the Identifiable upstream into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0Vy6OutputQz7FailureQzGAD11EntityStoreC_AD8AliasKeyVyALGSgSdtAD9AggregateALRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the Aggregate upstream into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0VySay6Output_7ElementQZG7FailureQzGAD11EntityStoreC_AD8AliasKeyVyAKQzGSgSdtSlAVRQs12IdentifiableAMRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the upstream collection into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0VySay6Output_7ElementQZG7FailureQzGAD11EntityStoreC_AD8AliasKeyVyAKQzGSgSdtSlAVRQAD9AggregateAMRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the upstream collection into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html":{"name":"Publisher"},"Extensions/Date.html":{"name":"Date"},"Extensions.html#/s:11CohesionKit10EntityNodeC":{"name":"EntityNode"},"Enums/StampError.html#/s:11CohesionKit10StampErrorO6tooOldyACSd_SdtcACmF":{"name":"tooOld(current:received:)","abstract":"

received stamp is smaller than current stamp

","parent_name":"StampError"},"Enums/StampError.html":{"name":"StampError"},"Classes/Subscription.html#/s:11CohesionKit12SubscriptionC11unsubscribeyycvp":{"name":"unsubscribe","parent_name":"Subscription"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6Updatea":{"name":"Update","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5queue6loggerACSo012OS_dispatch_E0CSg_AA6Logger_pSgtcfc":{"name":"init(queue:logger:)","abstract":"

Create a new EntityStore instance optionally with a queue and a logger

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store6entity5named10modifiedAt9ifPresentAA0C8ObserverVyxGx_AA8AliasKeyVyxGSgSdSgyxzcSgts12IdentifiableRzlF":{"name":"store(entity:named:modifiedAt:ifPresent:)","abstract":"

Store an entity in the storage. Entity will be stored only if stamp (modifiedAt) is higher than in previous","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store6entity5named10modifiedAt9ifPresentAA0C8ObserverVyxGx_AA8AliasKeyVyxGSgSdSgyxzcSgtAA9AggregateRzlF":{"name":"store(entity:named:modifiedAt:ifPresent:)","abstract":"

Store an aggregate in the storage. Each aggregate entities will be stored only if stamp (modifiedAt) is higher than in previous","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store8entities5named10modifiedAtAA0C8ObserverVySay7ElementQzGGx_AA8AliasKeyVyxGSgSdSgtSlRzs12IdentifiableAKRQlF":{"name":"store(entities:named:modifiedAt:)","abstract":"

Store multiple entities at once

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store8entities5named10modifiedAtAA0C8ObserverVySay7ElementQzGGx_AA8AliasKeyVyxGSgSdSgtSlRzAA9AggregateAKRQlF":{"name":"store(entities:named:modifiedAt:)","abstract":"

store multiple aggregates at once

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find_2idAA0C8ObserverVyxGSgxm_2IDQzts12IdentifiableRzlF":{"name":"find(_:id:)","abstract":"

Try to find an entity/aggregate in the storage.

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find5namedAA0C8ObserverVyxSgGAA8AliasKeyVyxG_ts12IdentifiableRzlF":{"name":"find(named:)","abstract":"

Try to find an entity/aggregate registered under named alias

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find5namedAA0C8ObserverVyxSgGAA8AliasKeyVyxG_tSlRzlF":{"name":"find(named:)","abstract":"

Try to find a collected registered under named alias

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update_2id10modifiedAtADSbxm_2IDQzSdSgyxzXEts12IdentifiableRzlF":{"name":"update(_:id:modifiedAt:update:)","abstract":"

Updates an already stored entity using a closure. Useful to update a few properties or when you assume the entity","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update_2id10modifiedAt_Sbxm_2IDQzSdSgyxzXEtAA9AggregateRzlF":{"name":"update(_:id:modifiedAt:_:)","abstract":"

Updates an already stored alias using a closure. This is useful if you don’t have a full entity for update","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEts12IdentifiableRzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already stored alias using a closure.","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtAA9AggregateRzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already stored alias using a closure.","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtSlRzs12Identifiable7ElementRpzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already existing collection alias content","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtSlRzAA9Aggregate7ElementRpzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already existing collection alias content","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC11removeAlias5namedyAA0F3KeyVyxG_tlF":{"name":"removeAlias(named:)","abstract":"

Removes an alias from the storage

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC11removeAlias5namedyAA0F3KeyVyxG_tSlRzlF":{"name":"removeAlias(named:)","abstract":"

Removes an alias from the storage

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC14removeAllAliasyyF":{"name":"removeAllAlias()","abstract":"

Removes all alias from identity map

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC9removeAllyyF":{"name":"removeAll()","abstract":"

Removes all alias AND all objects stored weakly. You should not need this method and rather use removeAlias.","parent_name":"EntityStore"},"Classes/EntityStore.html":{"name":"EntityStore","abstract":"

Manages entities lifecycle and synchronisation

"},"Classes/Subscription.html":{"name":"Subscription"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

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

The following enumerations are available globally.

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

The following extensions are available globally.

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

The following protocols 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/docsets/.docset/Contents/Resources/docSet.dsidx b/docsets/.docset/Contents/Resources/docSet.dsidx new file mode 100644 index 0000000000000000000000000000000000000000..5fc618f7dc2d17aa3be8c445b4984baea2e4f766 GIT binary patch literal 36864 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 literal 0 HcmV?d00001 diff --git a/docsets/.tgz b/docsets/.tgz new file mode 100644 index 0000000000000000000000000000000000000000..e42652e11ad050dbc87e2c9b6dd08105683018bb GIT binary patch literal 87028 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 S^0y4=eg;ohKbLh*2~7a!Pg}VF literal 0 HcmV?d00001 diff --git a/img/dash.png b/img/dash.png new file mode 100755 index 0000000000000000000000000000000000000000..6f694c7a012b417908da3687a0a39aa182e91c74 GIT binary patch literal 1338 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html new file mode 100644 index 0000000..e012fe5 --- /dev/null +++ b/index.html @@ -0,0 +1,406 @@ + + + + Reference + + + + + + + + + + + + +

+
+

Docs (100% documented)

+
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+ +

CohesionKit - Single Source of Truth

+ +

+ swift + platforms + test + + twitter + +

+ +

Keep your models synchronized in your app and never have any inconsistency anymore. Designed using latest Swift features.

+

Why using CohesionKit?

+ +
    +
  • 🔁 You need realtime synchronisation (websockets)
  • +
  • 🌐 You have multiple data sources (REST, CoreData, websocket, phone Contacts, Google Maps, etc…)
  • +
  • 🪶 You look for a full Swift lightweight tool
  • +
  • 🗃️ You want to use structs
  • +
+

Features

+ +
    +
  • [x] 🦺 Thread safe
  • +
  • [x] 🪶 Lighweight (< 600 lines of code)
  • +
  • [x] 🪪 Working with plain Swift struct and Identifiable objects
  • +
  • [x] 🔀 Support for Combine
  • +
  • [x] 🧠 In-memory storage
  • +
  • [x] 🐾 Low memory footprint
  • +
  • [x] 🐪 Strongly typed
  • +
+

Where to put CohesionKit in my stack?

+ +

CohesionKit being a Single Source of Truth solution it handles your objects lifecycle and synchronization from any source.

+ +

You should put CohesionKit in front of your data sources (REST API, GraphQL, …) before returning data to your app.

+
sequenceDiagram
+    autonumber
+
+        YourApp ->>DataSource: findBooks
+        DataSource ->>GraphQL: query findBooks
+        GraphQL -->>DataSource: FindBooksQueryResult
+        DataSource ->>CohesionKit: store books [A,B,C]
+        CohesionKit -->> YourApp: Publisher<[A,B,C]>
+
+        WebSocket ->> WebSocketListener: book A updated
+        WebSocketListener ->> CohesionKit: update book A
+        CohesionKit -->> YourApp: Publisher<[A,B,C]>
+
+

Installation

+ +
    +
  • Swift Package Manager
  • +
+
dependencies: [
+    .package(url: "https://github.com/pjechris/CohesionKit.git", .upToNextMajor(from: "0.7.0"))
+]
+
+

Examples

+ +

Library comes with an example project so you can see a real case usage. It mostly shows:

+ +
    +
  • How to store data in the library
  • +
  • How to retrieve and update that data for realtime
  • +
  • How data is synchronised throughout multiple screens
  • +
+

Getting started

+

Storing an object

+ +

First create an instance of EntityStore:

+
let entityStore = EntityStore()
+
+ +

EntityStore let you store Identifiable objects:

+
struct Book: Identifiable {
+  let id: String
+  let title: String
+}
+
+let book = Book(id: "ABCD", name: "My Book")
+
+entityStore.store(book)
+
+ +

Then You can retrieve the object from anywhere in your code:

+
// somewhere else in the code
+entityStore.find(Book.self, id: "ABCD") // return Book(id: "ABCD", name: "My Book")
+
+

Observing changes

+ +

Every time data is updated in EntityStore triggers a notification to any registered observer. To register yourself as an observer just use result from store or find methods:

+
func findBooks() -> some Publisher<[Book], Error> {
+  // 1. load data using URLSession
+  URLSession(...)
+  // 2. store data inside our entityStore
+    .store(in: entityStore)
+    .sink { ... }
+    .store(in: &cancellables)
+}
+
+
entityStore.find(Book.self, id: 1)?
+  .asPublisher
+  .sink { ... }
+  .store(in: &cancellables)
+
+ +
+

CohesionKit has a weak memory policy you should read about. As such, returned value from entityStore.store must be strongly retained to not lose value.

+ +

For brievety, next examples will omit .sink { ... }.store(in:&cancellables).

+
+

Relational objects

+ +

To store objects containing nested identity objects you need to make them conform to one protocol: Aggregate.

+
struct AuthorBooks: Aggregate {
+  var id: Author.ID { author.id }
+
+  var author: Author
+  var books: [Book]
+
+  // `nestedEntitiesKeyPaths` must list all Identifiable/Aggregate this object contain
+  var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<Self>] {
+    [.init(\.author), .init(\.books)]
+  }
+}
+
+ +

CohesionKit then handles synchronisation for the three entities:

+ +
    +
  • AuthorBook
  • +
+

Author

+ Author + +
    +
  • Book
  • +
+ +

This gives you the ability to retrieve them independently from each other:

+
let authorBooks = AuthorBooks(
+    author: Author(id: 1, name: "George R.R Martin"),
+    books: [
+      Book(id: "ACK", title: "A Clash of Kings"),
+      Book(id: "ADD", title: "A Dance with Dragons")
+    ]
+)
+
+entityStore.store(authorBooks)
+
+entityStore.find(Author.self, id: 1) // George R.R Martin
+entityStore.find(Book.self, id: "ACK") // A Clash of Kings
+entityStore.find(Book.self, id: "ADD") // A Dance with Dragons
+
+ +

You can also modify any of them however you want. Notice the change is visible from the object itself AND from aggregate objects:

+
let newAuthor = Author(id: 1, name: "George R.R MartinI")
+
+entityStore.store(newAuthor)
+
+entityStore.find(Author.self, id: 1) // George R.R MartinI
+entityStore.find(AuthorBooks.self, id: 1) // George R.R MartinI + [A Clash of Kings, A Dance with Dragons]
+
+ +
+

You might think about storing books on Author directly (author.books). In this case Author needs to implement Aggregate and declare books as nested entity.

+ +

However I strongly advise you to not nest Identifiable objects into other Identifiable objects. Read Handling relationships article if you want to know more about this subject.

+
+

Storing vs Updating

+ +

For now we only focused on entityStore.store but CohesionKit comes with another method to store data: entityStore.update.

+ +

Sometimes both can be used but they each have a different purpose:

+ +
    +
  1. store is suited for storing full data retrieved from webservices, like GET /user for instance
  2. +
  3. update is usually used for partial data. It’s also the preferred method when receiving events from websockets.
  4. +
+

Advanced topics

+

Enum support

+ +

Starting with 0.13 library has support for enum types. Note that you’ll need to conform to EntityWrapper and provide computed getter/setter for each entity you’d like to store.

+
enum MediaType: EntityWrapper {
+  case book(Book)
+  case game(Game)
+  case tvShow(TvShow)
+
+  func wrappedEntitiesKeyPaths<Root>(relativeTo parent: WritableKeyPath<Root, Self>) -> [PartialIdentifiableKeyPath<Root>] {
+    [.init(parent.appending(\.book)), .init(parent.appending(\.game)), .init(parent.appending(\.tvShow))]
+  }
+
+  var book: Book? {
+    get { ... }
+    set { ... }
+  }
+
+  var game: Game? {
+    get { ... }
+    set { ... }
+  }
+
+  var tvShow: TvShow? {
+    get { ... }
+    set { ... }
+  }
+}
+
+struct AuthorMedia: Aggregate {
+  var author: Author
+  var media: MediaType
+
+  var nestedEntitiesKeyPaths: [PartialIdentifiableKeyPath<Self>] {
+    [.init(\.author), .init(wrapper: \.media)]
+  }
+}
+
+

Aliases

+ +

Sometimes you need to retrieve data without knowing the object id. Common case is current user.

+ +

CohesionKit provides a suitable mechanism: aliases. Aliases allow you to register and find entities using a key.

+
extension AliasKey where T == User {
+  static let currentUser = AliasKey("user")
+}
+
+entityStore.store(currentUser, named: .currentUser)
+
+ +

Then request it somewhere else:

+
entityStore.find(named: .currentUser) // return the current user
+
+ +

Compared to regular entities, aliased objects are long-live objects: they will be kept in the storage even if no one observes them. This allow registered observers to be notified when alias value change:

+
entityStore.removeAlias(named: .currentUser) // observers will be notified currentUser is nil.
+
+entityStore.store(newCurrentUser, named: .currentUser) // observers will be notified that currentUser changed even if currentUser was nil before
+
+

Stale data

+ +

When storing data CohesionKit actually require you to set a modification stamp on it. Stamp is used as a marker to compare data freshness: the higher stamp is the more recent data is.

+ +

By default CohesionKit will use the current date as stamp.

+
entityStore.store(book) // use default stamp: current date
+entityStore.store(book, modifiedAt: Date().stamp) // explicitly use Date time stamp
+entityStore.store(book, modifiedAt: 9000) // any Double value is valid
+
+ +

If for some reason you try to store data with a stamp lower than the already stamped stored data then the update will be discarded.

+

Weak memory management

+ +

CohesionKit has a weak memory policy: objects are kept in EntityStore as long as someone use them.

+ +

To that end you need to retain observers as long as you’re interested in the data:

+
let book = Book(id: "ACK", title: "A Clash of Kings")
+let cancellable = entityStore.store(book) // observer is retained: data is retained
+
+entityStore.find(Book.self, id: "ACK") // return  "A Clash of Kings"
+
+ +

If you don’t create/retain observers then once entities have no more observers they will be automatically discarded from the storage.

+
let book = Book(id: "ACK", title: "A Clash of Kings")
+_ = entityStore.store(book) // observer is not retained and no one else observe this book: data is released
+
+entityStore.find(Book.self, id: "ACK") // return nil
+
+
let book = Book(id: "ACK", title: "A Clash of Kings")
+var cancellable = entityStore.store(book).asPublisher.sink { ... }
+let cancellable2 = entityStore.find(Book.self, id: "ACK") // return a publisher
+
+cancellable = nil
+
+entityStore.find(Book.self, id: "ACK") // return "A Clash of Kings" because cancellable2 still observe this book
+
+

License

+ +

This project is released under the MIT License. Please see the LICENSE file for details.

+ +
+
+ +
+
+ + diff --git a/js/jazzy.js b/js/jazzy.js new file mode 100755 index 0000000..1984416 --- /dev/null +++ b/js/jazzy.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +function toggleItem($link, $content) { + var animationDuration = 300; + $link.toggleClass('token-open'); + $content.slideToggle(animationDuration); +} + +function itemLinkToContent($link) { + return $link.parent().parent().next(); +} + +// On doc load + hash-change, open any targetted item +function openCurrentItemIfClosed() { + if (window.jazzy.docset) { + return; + } + var $link = $(`a[name="${location.hash.substring(1)}"]`).nextAll('.token'); + $content = itemLinkToContent($link); + if ($content.is(':hidden')) { + toggleItem($link, $content); + } +} + +$(openCurrentItemIfClosed); +$(window).on('hashchange', openCurrentItemIfClosed); + +// On item link ('token') click, toggle its discussion +$('.token').on('click', function(event) { + if (window.jazzy.docset) { + return; + } + var $link = $(this); + toggleItem($link, itemLinkToContent($link)); + + // Keeps the document from jumping to the hash. + var href = $link.attr('href'); + if (history.pushState) { + history.pushState({}, '', href); + } else { + location.hash = href; + } + event.preventDefault(); +}); + +// Clicks on links to the current, closed, item need to open the item +$("a:not('.token')").on('click', function() { + if (location == this.href) { + openCurrentItemIfClosed(); + } +}); + +// KaTeX rendering +if ("katex" in window) { + $($('.math').each( (_, element) => { + katex.render(element.textContent, element, { + displayMode: $(element).hasClass('m-block'), + throwOnError: false, + trust: true + }); + })) +} diff --git a/js/jazzy.search.js b/js/jazzy.search.js new file mode 100644 index 0000000..359cdbb --- /dev/null +++ b/js/jazzy.search.js @@ -0,0 +1,74 @@ +// Jazzy - https://github.com/realm/jazzy +// Copyright Realm Inc. +// SPDX-License-Identifier: MIT + +$(function(){ + var $typeahead = $('[data-typeahead]'); + var $form = $typeahead.parents('form'); + var searchURL = $form.attr('action'); + + function displayTemplate(result) { + return result.name; + } + + function suggestionTemplate(result) { + var t = '
'; + t += '' + result.name + ''; + if (result.parent_name) { + t += '' + result.parent_name + ''; + } + t += '
'; + return t; + } + + $typeahead.one('focus', function() { + $form.addClass('loading'); + + $.getJSON(searchURL).then(function(searchData) { + const searchIndex = lunr(function() { + this.ref('url'); + this.field('name'); + this.field('abstract'); + for (const [url, doc] of Object.entries(searchData)) { + this.add({url: url, name: doc.name, abstract: doc.abstract}); + } + }); + + $typeahead.typeahead( + { + highlight: true, + minLength: 3, + autoselect: true + }, + { + limit: 10, + display: displayTemplate, + templates: { suggestion: suggestionTemplate }, + source: function(query, sync) { + const lcSearch = query.toLowerCase(); + const results = searchIndex.query(function(q) { + q.term(lcSearch, { boost: 100 }); + q.term(lcSearch, { + boost: 10, + wildcard: lunr.Query.wildcard.TRAILING + }); + }).map(function(result) { + var doc = searchData[result.ref]; + doc.url = result.ref; + return doc; + }); + sync(results); + } + } + ); + $form.removeClass('loading'); + $typeahead.trigger('focus'); + }); + }); + + var baseURL = searchURL.slice(0, -"search.json".length); + + $typeahead.on('typeahead:select', function(e, result) { + window.location = baseURL + result.url; + }); +}); diff --git a/js/jquery.min.js b/js/jquery.min.js new file mode 100644 index 0000000..7f37b5d --- /dev/null +++ b/js/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.7.1 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(ie,e){"use strict";var oe=[],r=Object.getPrototypeOf,ae=oe.slice,g=oe.flat?function(e){return oe.flat.call(e)}:function(e){return oe.concat.apply([],e)},s=oe.push,se=oe.indexOf,n={},i=n.toString,ue=n.hasOwnProperty,o=ue.toString,a=o.call(Object),le={},v=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},y=function(e){return null!=e&&e===e.window},C=ie.document,u={type:!0,src:!0,nonce:!0,noModule:!0};function m(e,t,n){var r,i,o=(n=n||C).createElement("script");if(o.text=e,t)for(r in u)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[i.call(e)]||"object":typeof e}var t="3.7.1",l=/HTML$/i,ce=function(e,t){return new ce.fn.init(e,t)};function c(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!v(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+ge+")"+ge+"*"),x=new RegExp(ge+"|>"),j=new RegExp(g),A=new RegExp("^"+t+"$"),D={ID:new RegExp("^#("+t+")"),CLASS:new RegExp("^\\.("+t+")"),TAG:new RegExp("^("+t+"|[*])"),ATTR:new RegExp("^"+p),PSEUDO:new RegExp("^"+g),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ge+"*(even|odd|(([+-]|)(\\d*)n|)"+ge+"*(?:([+-]|)"+ge+"*(\\d+)|))"+ge+"*\\)|)","i"),bool:new RegExp("^(?:"+f+")$","i"),needsContext:new RegExp("^"+ge+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ge+"*((?:-\\d)?\\d*)"+ge+"*\\)|)(?=[^-]|$)","i")},N=/^(?:input|select|textarea|button)$/i,q=/^h\d$/i,L=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,H=/[+~]/,O=new RegExp("\\\\[\\da-fA-F]{1,6}"+ge+"?|\\\\([^\\r\\n\\f])","g"),P=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},M=function(){V()},R=J(function(e){return!0===e.disabled&&fe(e,"fieldset")},{dir:"parentNode",next:"legend"});try{k.apply(oe=ae.call(ye.childNodes),ye.childNodes),oe[ye.childNodes.length].nodeType}catch(e){k={apply:function(e,t){me.apply(e,ae.call(t))},call:function(e){me.apply(e,ae.call(arguments,1))}}}function I(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(V(e),e=e||T,C)){if(11!==p&&(u=L.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return k.call(n,a),n}else if(f&&(a=f.getElementById(i))&&I.contains(e,a)&&a.id===i)return k.call(n,a),n}else{if(u[2])return k.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&e.getElementsByClassName)return k.apply(n,e.getElementsByClassName(i)),n}if(!(h[t+" "]||d&&d.test(t))){if(c=t,f=e,1===p&&(x.test(t)||m.test(t))){(f=H.test(t)&&U(e.parentNode)||e)==e&&le.scope||((s=e.getAttribute("id"))?s=ce.escapeSelector(s):e.setAttribute("id",s=S)),o=(l=Y(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+Q(l[o]);c=l.join(",")}try{return k.apply(n,f.querySelectorAll(c)),n}catch(e){h(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return re(t.replace(ve,"$1"),e,n,r)}function W(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function F(e){return e[S]=!0,e}function $(e){var t=T.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function B(t){return function(e){return fe(e,"input")&&e.type===t}}function _(t){return function(e){return(fe(e,"input")||fe(e,"button"))&&e.type===t}}function z(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&R(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function X(a){return F(function(o){return o=+o,F(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function U(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function V(e){var t,n=e?e.ownerDocument||e:ye;return n!=T&&9===n.nodeType&&n.documentElement&&(r=(T=n).documentElement,C=!ce.isXMLDoc(T),i=r.matches||r.webkitMatchesSelector||r.msMatchesSelector,r.msMatchesSelector&&ye!=T&&(t=T.defaultView)&&t.top!==t&&t.addEventListener("unload",M),le.getById=$(function(e){return r.appendChild(e).id=ce.expando,!T.getElementsByName||!T.getElementsByName(ce.expando).length}),le.disconnectedMatch=$(function(e){return i.call(e,"*")}),le.scope=$(function(){return T.querySelectorAll(":scope")}),le.cssHas=$(function(){try{return T.querySelector(":has(*,:jqfake)"),!1}catch(e){return!0}}),le.getById?(b.filter.ID=function(e){var t=e.replace(O,P);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(O,P);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&C){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):t.querySelectorAll(e)},b.find.CLASS=function(e,t){if("undefined"!=typeof t.getElementsByClassName&&C)return t.getElementsByClassName(e)},d=[],$(function(e){var t;r.appendChild(e).innerHTML="",e.querySelectorAll("[selected]").length||d.push("\\["+ge+"*(?:value|"+f+")"),e.querySelectorAll("[id~="+S+"-]").length||d.push("~="),e.querySelectorAll("a#"+S+"+*").length||d.push(".#.+[+~]"),e.querySelectorAll(":checked").length||d.push(":checked"),(t=T.createElement("input")).setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),r.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&d.push(":enabled",":disabled"),(t=T.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||d.push("\\["+ge+"*name"+ge+"*="+ge+"*(?:''|\"\")")}),le.cssHas||d.push(":has"),d=d.length&&new RegExp(d.join("|")),l=function(e,t){if(e===t)return a=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!le.sortDetached&&t.compareDocumentPosition(e)===n?e===T||e.ownerDocument==ye&&I.contains(ye,e)?-1:t===T||t.ownerDocument==ye&&I.contains(ye,t)?1:o?se.call(o,e)-se.call(o,t):0:4&n?-1:1)}),T}for(e in I.matches=function(e,t){return I(e,null,null,t)},I.matchesSelector=function(e,t){if(V(e),C&&!h[t+" "]&&(!d||!d.test(t)))try{var n=i.call(e,t);if(n||le.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){h(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(O,P),e[3]=(e[3]||e[4]||e[5]||"").replace(O,P),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||I.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&I.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return D.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&j.test(n)&&(t=Y(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(O,P).toLowerCase();return"*"===e?function(){return!0}:function(e){return fe(e,t)}},CLASS:function(e){var t=s[e+" "];return t||(t=new RegExp("(^|"+ge+")"+e+"("+ge+"|$)"))&&s(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=I.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function T(e,n,r){return v(n)?ce.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?ce.grep(e,function(e){return e===n!==r}):"string"!=typeof n?ce.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(ce.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||k,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:S.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof ce?t[0]:t,ce.merge(this,ce.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:C,!0)),w.test(r[1])&&ce.isPlainObject(t))for(r in t)v(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=C.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):v(e)?void 0!==n.ready?n.ready(e):e(ce):ce.makeArray(e,this)}).prototype=ce.fn,k=ce(C);var E=/^(?:parents|prev(?:Until|All))/,j={children:!0,contents:!0,next:!0,prev:!0};function A(e,t){while((e=e[t])&&1!==e.nodeType);return e}ce.fn.extend({has:function(e){var t=ce(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,Ce=/^$|^module$|\/(?:java|ecma)script/i;xe=C.createDocumentFragment().appendChild(C.createElement("div")),(be=C.createElement("input")).setAttribute("type","radio"),be.setAttribute("checked","checked"),be.setAttribute("name","t"),xe.appendChild(be),le.checkClone=xe.cloneNode(!0).cloneNode(!0).lastChild.checked,xe.innerHTML="",le.noCloneChecked=!!xe.cloneNode(!0).lastChild.defaultValue,xe.innerHTML="",le.option=!!xe.lastChild;var ke={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Se(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&fe(e,t)?ce.merge([e],n):n}function Ee(e,t){for(var n=0,r=e.length;n",""]);var je=/<|&#?\w+;/;function Ae(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function Re(e,t){return fe(e,"table")&&fe(11!==t.nodeType?t:t.firstChild,"tr")&&ce(e).children("tbody")[0]||e}function Ie(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function We(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Fe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(_.hasData(e)&&(s=_.get(e).events))for(i in _.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),C.head.appendChild(r[0])},abort:function(){i&&i()}}});var Jt,Kt=[],Zt=/(=)\?(?=&|$)|\?\?/;ce.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Kt.pop()||ce.expando+"_"+jt.guid++;return this[e]=!0,e}}),ce.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Zt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Zt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=v(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Zt,"$1"+r):!1!==e.jsonp&&(e.url+=(At.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||ce.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=ie[r],ie[r]=function(){o=arguments},n.always(function(){void 0===i?ce(ie).removeProp(r):ie[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Kt.push(r)),o&&v(i)&&i(o[0]),o=i=void 0}),"script"}),le.createHTMLDocument=((Jt=C.implementation.createHTMLDocument("").body).innerHTML="
",2===Jt.childNodes.length),ce.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(le.createHTMLDocument?((r=(t=C.implementation.createHTMLDocument("")).createElement("base")).href=C.location.href,t.head.appendChild(r)):t=C),o=!n&&[],(i=w.exec(e))?[t.createElement(i[1])]:(i=Ae([e],t,o),o&&o.length&&ce(o).remove(),ce.merge([],i.childNodes)));var r,i,o},ce.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(ce.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},ce.expr.pseudos.animated=function(t){return ce.grep(ce.timers,function(e){return t===e.elem}).length},ce.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=ce.css(e,"position"),c=ce(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=ce.css(e,"top"),u=ce.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),v(t)&&(t=t.call(e,n,ce.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},ce.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){ce.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===ce.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===ce.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=ce(e).offset()).top+=ce.css(e,"borderTopWidth",!0),i.left+=ce.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-ce.css(r,"marginTop",!0),left:t.left-i.left-ce.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===ce.css(e,"position"))e=e.offsetParent;return e||J})}}),ce.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;ce.fn[t]=function(e){return M(this,function(e,t,n){var r;if(y(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),ce.each(["top","left"],function(e,n){ce.cssHooks[n]=Ye(le.pixelPosition,function(e,t){if(t)return t=Ge(e,n),_e.test(t)?ce(e).position()[n]+"px":t})}),ce.each({Height:"height",Width:"width"},function(a,s){ce.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){ce.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return M(this,function(e,t,n){var r;return y(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?ce.css(e,t,i):ce.style(e,t,n,i)},s,n?e:void 0,n)}})}),ce.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){ce.fn[t]=function(e){return this.on(t,e)}}),ce.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.on("mouseenter",e).on("mouseleave",t||e)}}),ce.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){ce.fn[n]=function(e,t){return 00){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); diff --git a/js/typeahead.jquery.js b/js/typeahead.jquery.js new file mode 100644 index 0000000..3a2d2ab --- /dev/null +++ b/js/typeahead.jquery.js @@ -0,0 +1,1694 @@ +/*! + * typeahead.js 1.3.1 + * https://github.com/corejavascript/typeahead.js + * Copyright 2013-2020 Twitter, Inc. and other contributors; Licensed MIT + */ + + +(function(root, factory) { + if (typeof define === "function" && define.amd) { + define([ "jquery" ], function(a0) { + return factory(a0); + }); + } else if (typeof module === "object" && module.exports) { + module.exports = factory(require("jquery")); + } else { + factory(root["jQuery"]); + } +})(this, function($) { + var _ = function() { + "use strict"; + return { + isMsie: function() { + return /(msie|trident)/i.test(navigator.userAgent) ? navigator.userAgent.match(/(msie |rv:)(\d+(.\d+)?)/i)[2] : false; + }, + isBlankString: function(str) { + return !str || /^\s*$/.test(str); + }, + escapeRegExChars: function(str) { + return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"); + }, + isString: function(obj) { + return typeof obj === "string"; + }, + isNumber: function(obj) { + return typeof obj === "number"; + }, + isArray: $.isArray, + isFunction: $.isFunction, + isObject: $.isPlainObject, + isUndefined: function(obj) { + return typeof obj === "undefined"; + }, + isElement: function(obj) { + return !!(obj && obj.nodeType === 1); + }, + isJQuery: function(obj) { + return obj instanceof $; + }, + toStr: function toStr(s) { + return _.isUndefined(s) || s === null ? "" : s + ""; + }, + bind: $.proxy, + each: function(collection, cb) { + $.each(collection, reverseArgs); + function reverseArgs(index, value) { + return cb(value, index); + } + }, + map: $.map, + filter: $.grep, + every: function(obj, test) { + var result = true; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (!(result = test.call(null, val, key, obj))) { + return false; + } + }); + return !!result; + }, + some: function(obj, test) { + var result = false; + if (!obj) { + return result; + } + $.each(obj, function(key, val) { + if (result = test.call(null, val, key, obj)) { + return false; + } + }); + return !!result; + }, + mixin: $.extend, + identity: function(x) { + return x; + }, + clone: function(obj) { + return $.extend(true, {}, obj); + }, + getIdGenerator: function() { + var counter = 0; + return function() { + return counter++; + }; + }, + templatify: function templatify(obj) { + return $.isFunction(obj) ? obj : template; + function template() { + return String(obj); + } + }, + defer: function(fn) { + setTimeout(fn, 0); + }, + debounce: function(func, wait, immediate) { + var timeout, result; + return function() { + var context = this, args = arguments, later, callNow; + later = function() { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + } + }; + callNow = immediate && !timeout; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + } + return result; + }; + }, + throttle: function(func, wait) { + var context, args, timeout, result, previous, later; + previous = 0; + later = function() { + previous = new Date(); + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date(), remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }, + stringify: function(val) { + return _.isString(val) ? val : JSON.stringify(val); + }, + guid: function() { + function _p8(s) { + var p = (Math.random().toString(16) + "000000000").substr(2, 8); + return s ? "-" + p.substr(0, 4) + "-" + p.substr(4, 4) : p; + } + return "tt-" + _p8() + _p8(true) + _p8(true) + _p8(); + }, + noop: function() {} + }; + }(); + var WWW = function() { + "use strict"; + var defaultClassNames = { + wrapper: "twitter-typeahead", + input: "tt-input", + hint: "tt-hint", + menu: "tt-menu", + dataset: "tt-dataset", + suggestion: "tt-suggestion", + selectable: "tt-selectable", + empty: "tt-empty", + open: "tt-open", + cursor: "tt-cursor", + highlight: "tt-highlight" + }; + return build; + function build(o) { + var www, classes; + classes = _.mixin({}, defaultClassNames, o); + www = { + css: buildCss(), + classes: classes, + html: buildHtml(classes), + selectors: buildSelectors(classes) + }; + return { + css: www.css, + html: www.html, + classes: www.classes, + selectors: www.selectors, + mixin: function(o) { + _.mixin(o, www); + } + }; + } + function buildHtml(c) { + return { + wrapper: '', + menu: '
' + }; + } + function buildSelectors(classes) { + var selectors = {}; + _.each(classes, function(v, k) { + selectors[k] = "." + v; + }); + return selectors; + } + function buildCss() { + var css = { + wrapper: { + position: "relative", + display: "inline-block" + }, + hint: { + position: "absolute", + top: "0", + left: "0", + borderColor: "transparent", + boxShadow: "none", + opacity: "1" + }, + input: { + position: "relative", + verticalAlign: "top", + backgroundColor: "transparent" + }, + inputWithNoHint: { + position: "relative", + verticalAlign: "top" + }, + menu: { + position: "absolute", + top: "100%", + left: "0", + zIndex: "100", + display: "none" + }, + ltr: { + left: "0", + right: "auto" + }, + rtl: { + left: "auto", + right: " 0" + } + }; + if (_.isMsie()) { + _.mixin(css.input, { + backgroundImage: "url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)" + }); + } + return css; + } + }(); + var EventBus = function() { + "use strict"; + var namespace, deprecationMap; + namespace = "typeahead:"; + deprecationMap = { + render: "rendered", + cursorchange: "cursorchanged", + select: "selected", + autocomplete: "autocompleted" + }; + function EventBus(o) { + if (!o || !o.el) { + $.error("EventBus initialized without el"); + } + this.$el = $(o.el); + } + _.mixin(EventBus.prototype, { + _trigger: function(type, args) { + var $e = $.Event(namespace + type); + this.$el.trigger.call(this.$el, $e, args || []); + return $e; + }, + before: function(type) { + var args, $e; + args = [].slice.call(arguments, 1); + $e = this._trigger("before" + type, args); + return $e.isDefaultPrevented(); + }, + trigger: function(type) { + var deprecatedType; + this._trigger(type, [].slice.call(arguments, 1)); + if (deprecatedType = deprecationMap[type]) { + this._trigger(deprecatedType, [].slice.call(arguments, 1)); + } + } + }); + return EventBus; + }(); + var EventEmitter = function() { + "use strict"; + var splitter = /\s+/, nextTick = getNextTick(); + return { + onSync: onSync, + onAsync: onAsync, + off: off, + trigger: trigger + }; + function on(method, types, cb, context) { + var type; + if (!cb) { + return this; + } + types = types.split(splitter); + cb = context ? bindContext(cb, context) : cb; + this._callbacks = this._callbacks || {}; + while (type = types.shift()) { + this._callbacks[type] = this._callbacks[type] || { + sync: [], + async: [] + }; + this._callbacks[type][method].push(cb); + } + return this; + } + function onAsync(types, cb, context) { + return on.call(this, "async", types, cb, context); + } + function onSync(types, cb, context) { + return on.call(this, "sync", types, cb, context); + } + function off(types) { + var type; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + while (type = types.shift()) { + delete this._callbacks[type]; + } + return this; + } + function trigger(types) { + var type, callbacks, args, syncFlush, asyncFlush; + if (!this._callbacks) { + return this; + } + types = types.split(splitter); + args = [].slice.call(arguments, 1); + while ((type = types.shift()) && (callbacks = this._callbacks[type])) { + syncFlush = getFlush(callbacks.sync, this, [ type ].concat(args)); + asyncFlush = getFlush(callbacks.async, this, [ type ].concat(args)); + syncFlush() && nextTick(asyncFlush); + } + return this; + } + function getFlush(callbacks, context, args) { + return flush; + function flush() { + var cancelled; + for (var i = 0, len = callbacks.length; !cancelled && i < len; i += 1) { + cancelled = callbacks[i].apply(context, args) === false; + } + return !cancelled; + } + } + function getNextTick() { + var nextTickFn; + if (window.setImmediate) { + nextTickFn = function nextTickSetImmediate(fn) { + setImmediate(function() { + fn(); + }); + }; + } else { + nextTickFn = function nextTickSetTimeout(fn) { + setTimeout(function() { + fn(); + }, 0); + }; + } + return nextTickFn; + } + function bindContext(fn, context) { + return fn.bind ? fn.bind(context) : function() { + fn.apply(context, [].slice.call(arguments, 0)); + }; + } + }(); + var highlight = function(doc) { + "use strict"; + var defaults = { + node: null, + pattern: null, + tagName: "strong", + className: null, + wordsOnly: false, + caseSensitive: false, + diacriticInsensitive: false + }; + var accented = { + A: "[AaªÀ-Åà-åĀ-ąǍǎȀ-ȃȦȧᴬᵃḀḁẚẠ-ảₐ℀℁℻⒜Ⓐⓐ㍱-㍴㎀-㎄㎈㎉㎩-㎯㏂㏊㏟㏿Aa]", + B: "[BbᴮᵇḂ-ḇℬ⒝Ⓑⓑ㍴㎅-㎇㏃㏈㏔㏝Bb]", + C: "[CcÇçĆ-čᶜ℀ℂ℃℅℆ℭⅭⅽ⒞Ⓒⓒ㍶㎈㎉㎝㎠㎤㏄-㏇Cc]", + D: "[DdĎďDŽ-džDZ-dzᴰᵈḊ-ḓⅅⅆⅮⅾ⒟Ⓓⓓ㋏㍲㍷-㍹㎗㎭-㎯㏅㏈Dd]", + E: "[EeÈ-Ëè-ëĒ-ěȄ-ȇȨȩᴱᵉḘ-ḛẸ-ẽₑ℡ℯℰⅇ⒠Ⓔⓔ㉐㋍㋎Ee]", + F: "[FfᶠḞḟ℉ℱ℻⒡Ⓕⓕ㎊-㎌㎙ff-fflFf]", + G: "[GgĜ-ģǦǧǴǵᴳᵍḠḡℊ⒢Ⓖⓖ㋌㋍㎇㎍-㎏㎓㎬㏆㏉㏒㏿Gg]", + H: "[HhĤĥȞȟʰᴴḢ-ḫẖℋ-ℎ⒣Ⓗⓗ㋌㍱㎐-㎔㏊㏋㏗Hh]", + I: "[IiÌ-Ïì-ïĨ-İIJijǏǐȈ-ȋᴵᵢḬḭỈ-ịⁱℐℑℹⅈⅠ-ⅣⅥ-ⅨⅪⅫⅰ-ⅳⅵ-ⅸⅺⅻ⒤Ⓘⓘ㍺㏌㏕fiffiIi]", + J: "[JjIJ-ĵLJ-njǰʲᴶⅉ⒥ⒿⓙⱼJj]", + K: "[KkĶķǨǩᴷᵏḰ-ḵK⒦Ⓚⓚ㎄㎅㎉㎏㎑㎘㎞㎢㎦㎪㎸㎾㏀㏆㏍-㏏Kk]", + L: "[LlĹ-ŀLJ-ljˡᴸḶḷḺ-ḽℒℓ℡Ⅼⅼ⒧Ⓛⓛ㋏㎈㎉㏐-㏓㏕㏖㏿flfflLl]", + M: "[MmᴹᵐḾ-ṃ℠™ℳⅯⅿ⒨Ⓜⓜ㍷-㍹㎃㎆㎎㎒㎖㎙-㎨㎫㎳㎷㎹㎽㎿㏁㏂㏎㏐㏔-㏖㏘㏙㏞㏟Mm]", + N: "[NnÑñŃ-ʼnNJ-njǸǹᴺṄ-ṋⁿℕ№⒩Ⓝⓝ㎁㎋㎚㎱㎵㎻㏌㏑Nn]", + O: "[OoºÒ-Öò-öŌ-őƠơǑǒǪǫȌ-ȏȮȯᴼᵒỌ-ỏₒ℅№ℴ⒪Ⓞⓞ㍵㏇㏒㏖Oo]", + P: "[PpᴾᵖṔ-ṗℙ⒫Ⓟⓟ㉐㍱㍶㎀㎊㎩-㎬㎰㎴㎺㏋㏗-㏚Pp]", + Q: "[Qqℚ⒬Ⓠⓠ㏃Qq]", + R: "[RrŔ-řȐ-ȓʳᴿᵣṘ-ṛṞṟ₨ℛ-ℝ⒭Ⓡⓡ㋍㍴㎭-㎯㏚㏛Rr]", + S: "[SsŚ-šſȘșˢṠ-ṣ₨℁℠⒮Ⓢⓢ㎧㎨㎮-㎳㏛㏜stSs]", + T: "[TtŢ-ťȚțᵀᵗṪ-ṱẗ℡™⒯Ⓣⓣ㉐㋏㎔㏏ſtstTt]", + U: "[UuÙ-Üù-üŨ-ųƯưǓǔȔ-ȗᵁᵘᵤṲ-ṷỤ-ủ℆⒰Ⓤⓤ㍳㍺Uu]", + V: "[VvᵛᵥṼ-ṿⅣ-Ⅷⅳ-ⅷ⒱Ⓥⓥⱽ㋎㍵㎴-㎹㏜㏞Vv]", + W: "[WwŴŵʷᵂẀ-ẉẘ⒲Ⓦⓦ㎺-㎿㏝Ww]", + X: "[XxˣẊ-ẍₓ℻Ⅸ-Ⅻⅸ-ⅻ⒳Ⓧⓧ㏓Xx]", + Y: "[YyÝýÿŶ-ŸȲȳʸẎẏẙỲ-ỹ⒴Ⓨⓨ㏉Yy]", + Z: "[ZzŹ-žDZ-dzᶻẐ-ẕℤℨ⒵Ⓩⓩ㎐-㎔Zz]" + }; + return function hightlight(o) { + var regex; + o = _.mixin({}, defaults, o); + if (!o.node || !o.pattern) { + return; + } + o.pattern = _.isArray(o.pattern) ? o.pattern : [ o.pattern ]; + regex = getRegex(o.pattern, o.caseSensitive, o.wordsOnly, o.diacriticInsensitive); + traverse(o.node, hightlightTextNode); + function hightlightTextNode(textNode) { + var match, patternNode, wrapperNode; + if (match = regex.exec(textNode.data)) { + wrapperNode = doc.createElement(o.tagName); + o.className && (wrapperNode.className = o.className); + patternNode = textNode.splitText(match.index); + patternNode.splitText(match[0].length); + wrapperNode.appendChild(patternNode.cloneNode(true)); + textNode.parentNode.replaceChild(wrapperNode, patternNode); + } + return !!match; + } + function traverse(el, hightlightTextNode) { + var childNode, TEXT_NODE_TYPE = 3; + for (var i = 0; i < el.childNodes.length; i++) { + childNode = el.childNodes[i]; + if (childNode.nodeType === TEXT_NODE_TYPE) { + i += hightlightTextNode(childNode) ? 1 : 0; + } else { + traverse(childNode, hightlightTextNode); + } + } + } + }; + function accent_replacer(chr) { + return accented[chr.toUpperCase()] || chr; + } + function getRegex(patterns, caseSensitive, wordsOnly, diacriticInsensitive) { + var escapedPatterns = [], regexStr; + for (var i = 0, len = patterns.length; i < len; i++) { + var escapedWord = _.escapeRegExChars(patterns[i]); + if (diacriticInsensitive) { + escapedWord = escapedWord.replace(/\S/g, accent_replacer); + } + escapedPatterns.push(escapedWord); + } + regexStr = wordsOnly ? "\\b(" + escapedPatterns.join("|") + ")\\b" : "(" + escapedPatterns.join("|") + ")"; + return caseSensitive ? new RegExp(regexStr) : new RegExp(regexStr, "i"); + } + }(window.document); + var Input = function() { + "use strict"; + var specialKeyCodeMap; + specialKeyCodeMap = { + 9: "tab", + 27: "esc", + 37: "left", + 39: "right", + 13: "enter", + 38: "up", + 40: "down" + }; + function Input(o, www) { + var id; + o = o || {}; + if (!o.input) { + $.error("input is missing"); + } + www.mixin(this); + this.$hint = $(o.hint); + this.$input = $(o.input); + this.$menu = $(o.menu); + id = this.$input.attr("id") || _.guid(); + this.$menu.attr("id", id + "_listbox"); + this.$hint.attr({ + "aria-hidden": true + }); + this.$input.attr({ + "aria-owns": id + "_listbox", + role: "combobox", + "aria-autocomplete": "list", + "aria-expanded": false + }); + this.query = this.$input.val(); + this.queryWhenFocused = this.hasFocus() ? this.query : null; + this.$overflowHelper = buildOverflowHelper(this.$input); + this._checkLanguageDirection(); + if (this.$hint.length === 0) { + this.setHint = this.getHint = this.clearHint = this.clearHintIfInvalid = _.noop; + } + this.onSync("cursorchange", this._updateDescendent); + } + Input.normalizeQuery = function(str) { + return _.toStr(str).replace(/^\s*/g, "").replace(/\s{2,}/g, " "); + }; + _.mixin(Input.prototype, EventEmitter, { + _onBlur: function onBlur() { + this.resetInputValue(); + this.trigger("blurred"); + }, + _onFocus: function onFocus() { + this.queryWhenFocused = this.query; + this.trigger("focused"); + }, + _onKeydown: function onKeydown($e) { + var keyName = specialKeyCodeMap[$e.which || $e.keyCode]; + this._managePreventDefault(keyName, $e); + if (keyName && this._shouldTrigger(keyName, $e)) { + this.trigger(keyName + "Keyed", $e); + } + }, + _onInput: function onInput() { + this._setQuery(this.getInputValue()); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + _managePreventDefault: function managePreventDefault(keyName, $e) { + var preventDefault; + switch (keyName) { + case "up": + case "down": + preventDefault = !withModifier($e); + break; + + default: + preventDefault = false; + } + preventDefault && $e.preventDefault(); + }, + _shouldTrigger: function shouldTrigger(keyName, $e) { + var trigger; + switch (keyName) { + case "tab": + trigger = !withModifier($e); + break; + + default: + trigger = true; + } + return trigger; + }, + _checkLanguageDirection: function checkLanguageDirection() { + var dir = (this.$input.css("direction") || "ltr").toLowerCase(); + if (this.dir !== dir) { + this.dir = dir; + this.$hint.attr("dir", dir); + this.trigger("langDirChanged", dir); + } + }, + _setQuery: function setQuery(val, silent) { + var areEquivalent, hasDifferentWhitespace; + areEquivalent = areQueriesEquivalent(val, this.query); + hasDifferentWhitespace = areEquivalent ? this.query.length !== val.length : false; + this.query = val; + if (!silent && !areEquivalent) { + this.trigger("queryChanged", this.query); + } else if (!silent && hasDifferentWhitespace) { + this.trigger("whitespaceChanged", this.query); + } + }, + _updateDescendent: function updateDescendent(event, id) { + this.$input.attr("aria-activedescendant", id); + }, + bind: function() { + var that = this, onBlur, onFocus, onKeydown, onInput; + onBlur = _.bind(this._onBlur, this); + onFocus = _.bind(this._onFocus, this); + onKeydown = _.bind(this._onKeydown, this); + onInput = _.bind(this._onInput, this); + this.$input.on("blur.tt", onBlur).on("focus.tt", onFocus).on("keydown.tt", onKeydown); + if (!_.isMsie() || _.isMsie() > 9) { + this.$input.on("input.tt", onInput); + } else { + this.$input.on("keydown.tt keypress.tt cut.tt paste.tt", function($e) { + if (specialKeyCodeMap[$e.which || $e.keyCode]) { + return; + } + _.defer(_.bind(that._onInput, that, $e)); + }); + } + return this; + }, + focus: function focus() { + this.$input.focus(); + }, + blur: function blur() { + this.$input.blur(); + }, + getLangDir: function getLangDir() { + return this.dir; + }, + getQuery: function getQuery() { + return this.query || ""; + }, + setQuery: function setQuery(val, silent) { + this.setInputValue(val); + this._setQuery(val, silent); + }, + hasQueryChangedSinceLastFocus: function hasQueryChangedSinceLastFocus() { + return this.query !== this.queryWhenFocused; + }, + getInputValue: function getInputValue() { + return this.$input.val(); + }, + setInputValue: function setInputValue(value) { + this.$input.val(value); + this.clearHintIfInvalid(); + this._checkLanguageDirection(); + }, + resetInputValue: function resetInputValue() { + this.setInputValue(this.query); + }, + getHint: function getHint() { + return this.$hint.val(); + }, + setHint: function setHint(value) { + this.$hint.val(value); + }, + clearHint: function clearHint() { + this.setHint(""); + }, + clearHintIfInvalid: function clearHintIfInvalid() { + var val, hint, valIsPrefixOfHint, isValid; + val = this.getInputValue(); + hint = this.getHint(); + valIsPrefixOfHint = val !== hint && hint.indexOf(val) === 0; + isValid = val !== "" && valIsPrefixOfHint && !this.hasOverflow(); + !isValid && this.clearHint(); + }, + hasFocus: function hasFocus() { + return this.$input.is(":focus"); + }, + hasOverflow: function hasOverflow() { + var constraint = this.$input.width() - 2; + this.$overflowHelper.text(this.getInputValue()); + return this.$overflowHelper.width() >= constraint; + }, + isCursorAtEnd: function() { + var valueLength, selectionStart, range; + valueLength = this.$input.val().length; + selectionStart = this.$input[0].selectionStart; + if (_.isNumber(selectionStart)) { + return selectionStart === valueLength; + } else if (document.selection) { + range = document.selection.createRange(); + range.moveStart("character", -valueLength); + return valueLength === range.text.length; + } + return true; + }, + destroy: function destroy() { + this.$hint.off(".tt"); + this.$input.off(".tt"); + this.$overflowHelper.remove(); + this.$hint = this.$input = this.$overflowHelper = $("
"); + }, + setAriaExpanded: function setAriaExpanded(value) { + this.$input.attr("aria-expanded", value); + } + }); + return Input; + function buildOverflowHelper($input) { + return $('').css({ + position: "absolute", + visibility: "hidden", + whiteSpace: "pre", + fontFamily: $input.css("font-family"), + fontSize: $input.css("font-size"), + fontStyle: $input.css("font-style"), + fontVariant: $input.css("font-variant"), + fontWeight: $input.css("font-weight"), + wordSpacing: $input.css("word-spacing"), + letterSpacing: $input.css("letter-spacing"), + textIndent: $input.css("text-indent"), + textRendering: $input.css("text-rendering"), + textTransform: $input.css("text-transform") + }).insertAfter($input); + } + function areQueriesEquivalent(a, b) { + return Input.normalizeQuery(a) === Input.normalizeQuery(b); + } + function withModifier($e) { + return $e.altKey || $e.ctrlKey || $e.metaKey || $e.shiftKey; + } + }(); + var Dataset = function() { + "use strict"; + var keys, nameGenerator; + keys = { + dataset: "tt-selectable-dataset", + val: "tt-selectable-display", + obj: "tt-selectable-object" + }; + nameGenerator = _.getIdGenerator(); + function Dataset(o, www) { + o = o || {}; + o.templates = o.templates || {}; + o.templates.notFound = o.templates.notFound || o.templates.empty; + if (!o.source) { + $.error("missing source"); + } + if (!o.node) { + $.error("missing node"); + } + if (o.name && !isValidName(o.name)) { + $.error("invalid dataset name: " + o.name); + } + www.mixin(this); + this.highlight = !!o.highlight; + this.name = _.toStr(o.name || nameGenerator()); + this.limit = o.limit || 5; + this.displayFn = getDisplayFn(o.display || o.displayKey); + this.templates = getTemplates(o.templates, this.displayFn); + this.source = o.source.__ttAdapter ? o.source.__ttAdapter() : o.source; + this.async = _.isUndefined(o.async) ? this.source.length > 2 : !!o.async; + this._resetLastSuggestion(); + this.$el = $(o.node).attr("role", "presentation").addClass(this.classes.dataset).addClass(this.classes.dataset + "-" + this.name); + } + Dataset.extractData = function extractData(el) { + var $el = $(el); + if ($el.data(keys.obj)) { + return { + dataset: $el.data(keys.dataset) || "", + val: $el.data(keys.val) || "", + obj: $el.data(keys.obj) || null + }; + } + return null; + }; + _.mixin(Dataset.prototype, EventEmitter, { + _overwrite: function overwrite(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (this.async && this.templates.pending) { + this._renderPending(query); + } else if (!this.async && this.templates.notFound) { + this._renderNotFound(query); + } else { + this._empty(); + } + this.trigger("rendered", suggestions, false, this.name); + }, + _append: function append(query, suggestions) { + suggestions = suggestions || []; + if (suggestions.length && this.$lastSuggestion.length) { + this._appendSuggestions(query, suggestions); + } else if (suggestions.length) { + this._renderSuggestions(query, suggestions); + } else if (!this.$lastSuggestion.length && this.templates.notFound) { + this._renderNotFound(query); + } + this.trigger("rendered", suggestions, true, this.name); + }, + _renderSuggestions: function renderSuggestions(query, suggestions) { + var $fragment; + $fragment = this._getSuggestionsFragment(query, suggestions); + this.$lastSuggestion = $fragment.children().last(); + this.$el.html($fragment).prepend(this._getHeader(query, suggestions)).append(this._getFooter(query, suggestions)); + }, + _appendSuggestions: function appendSuggestions(query, suggestions) { + var $fragment, $lastSuggestion; + $fragment = this._getSuggestionsFragment(query, suggestions); + $lastSuggestion = $fragment.children().last(); + this.$lastSuggestion.after($fragment); + this.$lastSuggestion = $lastSuggestion; + }, + _renderPending: function renderPending(query) { + var template = this.templates.pending; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _renderNotFound: function renderNotFound(query) { + var template = this.templates.notFound; + this._resetLastSuggestion(); + template && this.$el.html(template({ + query: query, + dataset: this.name + })); + }, + _empty: function empty() { + this.$el.empty(); + this._resetLastSuggestion(); + }, + _getSuggestionsFragment: function getSuggestionsFragment(query, suggestions) { + var that = this, fragment; + fragment = document.createDocumentFragment(); + _.each(suggestions, function getSuggestionNode(suggestion) { + var $el, context; + context = that._injectQuery(query, suggestion); + $el = $(that.templates.suggestion(context)).data(keys.dataset, that.name).data(keys.obj, suggestion).data(keys.val, that.displayFn(suggestion)).addClass(that.classes.suggestion + " " + that.classes.selectable); + fragment.appendChild($el[0]); + }); + this.highlight && highlight({ + className: this.classes.highlight, + node: fragment, + pattern: query + }); + return $(fragment); + }, + _getFooter: function getFooter(query, suggestions) { + return this.templates.footer ? this.templates.footer({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _getHeader: function getHeader(query, suggestions) { + return this.templates.header ? this.templates.header({ + query: query, + suggestions: suggestions, + dataset: this.name + }) : null; + }, + _resetLastSuggestion: function resetLastSuggestion() { + this.$lastSuggestion = $(); + }, + _injectQuery: function injectQuery(query, obj) { + return _.isObject(obj) ? _.mixin({ + _query: query + }, obj) : obj; + }, + update: function update(query) { + var that = this, canceled = false, syncCalled = false, rendered = 0; + this.cancel(); + this.cancel = function cancel() { + canceled = true; + that.cancel = $.noop; + that.async && that.trigger("asyncCanceled", query, that.name); + }; + this.source(query, sync, async); + !syncCalled && sync([]); + function sync(suggestions) { + if (syncCalled) { + return; + } + syncCalled = true; + suggestions = (suggestions || []).slice(0, that.limit); + rendered = suggestions.length; + that._overwrite(query, suggestions); + if (rendered < that.limit && that.async) { + that.trigger("asyncRequested", query, that.name); + } + } + function async(suggestions) { + suggestions = suggestions || []; + if (!canceled && rendered < that.limit) { + that.cancel = $.noop; + var idx = Math.abs(rendered - that.limit); + rendered += idx; + that._append(query, suggestions.slice(0, idx)); + that.async && that.trigger("asyncReceived", query, that.name); + } + } + }, + cancel: $.noop, + clear: function clear() { + this._empty(); + this.cancel(); + this.trigger("cleared"); + }, + isEmpty: function isEmpty() { + return this.$el.is(":empty"); + }, + destroy: function destroy() { + this.$el = $("
"); + } + }); + return Dataset; + function getDisplayFn(display) { + display = display || _.stringify; + return _.isFunction(display) ? display : displayFn; + function displayFn(obj) { + return obj[display]; + } + } + function getTemplates(templates, displayFn) { + return { + notFound: templates.notFound && _.templatify(templates.notFound), + pending: templates.pending && _.templatify(templates.pending), + header: templates.header && _.templatify(templates.header), + footer: templates.footer && _.templatify(templates.footer), + suggestion: templates.suggestion ? userSuggestionTemplate : suggestionTemplate + }; + function userSuggestionTemplate(context) { + var template = templates.suggestion; + return $(template(context)).attr("id", _.guid()); + } + function suggestionTemplate(context) { + return $('
').attr("id", _.guid()).text(displayFn(context)); + } + } + function isValidName(str) { + return /^[_a-zA-Z0-9-]+$/.test(str); + } + }(); + var Menu = function() { + "use strict"; + function Menu(o, www) { + var that = this; + o = o || {}; + if (!o.node) { + $.error("node is required"); + } + www.mixin(this); + this.$node = $(o.node); + this.query = null; + this.datasets = _.map(o.datasets, initializeDataset); + function initializeDataset(oDataset) { + var node = that.$node.find(oDataset.node).first(); + oDataset.node = node.length ? node : $("
").appendTo(that.$node); + return new Dataset(oDataset, www); + } + } + _.mixin(Menu.prototype, EventEmitter, { + _onSelectableClick: function onSelectableClick($e) { + this.trigger("selectableClicked", $($e.currentTarget)); + }, + _onRendered: function onRendered(type, dataset, suggestions, async) { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetRendered", dataset, suggestions, async); + }, + _onCleared: function onCleared() { + this.$node.toggleClass(this.classes.empty, this._allDatasetsEmpty()); + this.trigger("datasetCleared"); + }, + _propagate: function propagate() { + this.trigger.apply(this, arguments); + }, + _allDatasetsEmpty: function allDatasetsEmpty() { + return _.every(this.datasets, _.bind(function isDatasetEmpty(dataset) { + var isEmpty = dataset.isEmpty(); + this.$node.attr("aria-expanded", !isEmpty); + return isEmpty; + }, this)); + }, + _getSelectables: function getSelectables() { + return this.$node.find(this.selectors.selectable); + }, + _removeCursor: function _removeCursor() { + var $selectable = this.getActiveSelectable(); + $selectable && $selectable.removeClass(this.classes.cursor); + }, + _ensureVisible: function ensureVisible($el) { + var elTop, elBottom, nodeScrollTop, nodeHeight; + elTop = $el.position().top; + elBottom = elTop + $el.outerHeight(true); + nodeScrollTop = this.$node.scrollTop(); + nodeHeight = this.$node.height() + parseInt(this.$node.css("paddingTop"), 10) + parseInt(this.$node.css("paddingBottom"), 10); + if (elTop < 0) { + this.$node.scrollTop(nodeScrollTop + elTop); + } else if (nodeHeight < elBottom) { + this.$node.scrollTop(nodeScrollTop + (elBottom - nodeHeight)); + } + }, + bind: function() { + var that = this, onSelectableClick; + onSelectableClick = _.bind(this._onSelectableClick, this); + this.$node.on("click.tt", this.selectors.selectable, onSelectableClick); + this.$node.on("mouseover", this.selectors.selectable, function() { + that.setCursor($(this)); + }); + this.$node.on("mouseleave", function() { + that._removeCursor(); + }); + _.each(this.datasets, function(dataset) { + dataset.onSync("asyncRequested", that._propagate, that).onSync("asyncCanceled", that._propagate, that).onSync("asyncReceived", that._propagate, that).onSync("rendered", that._onRendered, that).onSync("cleared", that._onCleared, that); + }); + return this; + }, + isOpen: function isOpen() { + return this.$node.hasClass(this.classes.open); + }, + open: function open() { + this.$node.scrollTop(0); + this.$node.addClass(this.classes.open); + }, + close: function close() { + this.$node.attr("aria-expanded", false); + this.$node.removeClass(this.classes.open); + this._removeCursor(); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.attr("dir", dir); + }, + selectableRelativeToCursor: function selectableRelativeToCursor(delta) { + var $selectables, $oldCursor, oldIndex, newIndex; + $oldCursor = this.getActiveSelectable(); + $selectables = this._getSelectables(); + oldIndex = $oldCursor ? $selectables.index($oldCursor) : -1; + newIndex = oldIndex + delta; + newIndex = (newIndex + 1) % ($selectables.length + 1) - 1; + newIndex = newIndex < -1 ? $selectables.length - 1 : newIndex; + return newIndex === -1 ? null : $selectables.eq(newIndex); + }, + setCursor: function setCursor($selectable) { + this._removeCursor(); + if ($selectable = $selectable && $selectable.first()) { + $selectable.addClass(this.classes.cursor); + this._ensureVisible($selectable); + } + }, + getSelectableData: function getSelectableData($el) { + return $el && $el.length ? Dataset.extractData($el) : null; + }, + getActiveSelectable: function getActiveSelectable() { + var $selectable = this._getSelectables().filter(this.selectors.cursor).first(); + return $selectable.length ? $selectable : null; + }, + getTopSelectable: function getTopSelectable() { + var $selectable = this._getSelectables().first(); + return $selectable.length ? $selectable : null; + }, + update: function update(query) { + var isValidUpdate = query !== this.query; + if (isValidUpdate) { + this.query = query; + _.each(this.datasets, updateDataset); + } + return isValidUpdate; + function updateDataset(dataset) { + dataset.update(query); + } + }, + empty: function empty() { + _.each(this.datasets, clearDataset); + this.query = null; + this.$node.addClass(this.classes.empty); + function clearDataset(dataset) { + dataset.clear(); + } + }, + destroy: function destroy() { + this.$node.off(".tt"); + this.$node = $("
"); + _.each(this.datasets, destroyDataset); + function destroyDataset(dataset) { + dataset.destroy(); + } + } + }); + return Menu; + }(); + var Status = function() { + "use strict"; + function Status(options) { + this.$el = $("", { + role: "status", + "aria-live": "polite" + }).css({ + position: "absolute", + padding: "0", + border: "0", + height: "1px", + width: "1px", + "margin-bottom": "-1px", + "margin-right": "-1px", + overflow: "hidden", + clip: "rect(0 0 0 0)", + "white-space": "nowrap" + }); + options.$input.after(this.$el); + _.each(options.menu.datasets, _.bind(function(dataset) { + if (dataset.onSync) { + dataset.onSync("rendered", _.bind(this.update, this)); + dataset.onSync("cleared", _.bind(this.cleared, this)); + } + }, this)); + } + _.mixin(Status.prototype, { + update: function update(event, suggestions) { + var length = suggestions.length; + var words; + if (length === 1) { + words = { + result: "result", + is: "is" + }; + } else { + words = { + result: "results", + is: "are" + }; + } + this.$el.text(length + " " + words.result + " " + words.is + " available, use up and down arrow keys to navigate."); + }, + cleared: function() { + this.$el.text(""); + } + }); + return Status; + }(); + var DefaultMenu = function() { + "use strict"; + var s = Menu.prototype; + function DefaultMenu() { + Menu.apply(this, [].slice.call(arguments, 0)); + } + _.mixin(DefaultMenu.prototype, Menu.prototype, { + open: function open() { + !this._allDatasetsEmpty() && this._show(); + return s.open.apply(this, [].slice.call(arguments, 0)); + }, + close: function close() { + this._hide(); + return s.close.apply(this, [].slice.call(arguments, 0)); + }, + _onRendered: function onRendered() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onRendered.apply(this, [].slice.call(arguments, 0)); + }, + _onCleared: function onCleared() { + if (this._allDatasetsEmpty()) { + this._hide(); + } else { + this.isOpen() && this._show(); + } + return s._onCleared.apply(this, [].slice.call(arguments, 0)); + }, + setLanguageDirection: function setLanguageDirection(dir) { + this.$node.css(dir === "ltr" ? this.css.ltr : this.css.rtl); + return s.setLanguageDirection.apply(this, [].slice.call(arguments, 0)); + }, + _hide: function hide() { + this.$node.hide(); + }, + _show: function show() { + this.$node.css("display", "block"); + } + }); + return DefaultMenu; + }(); + var Typeahead = function() { + "use strict"; + function Typeahead(o, www) { + var onFocused, onBlurred, onEnterKeyed, onTabKeyed, onEscKeyed, onUpKeyed, onDownKeyed, onLeftKeyed, onRightKeyed, onQueryChanged, onWhitespaceChanged; + o = o || {}; + if (!o.input) { + $.error("missing input"); + } + if (!o.menu) { + $.error("missing menu"); + } + if (!o.eventBus) { + $.error("missing event bus"); + } + www.mixin(this); + this.eventBus = o.eventBus; + this.minLength = _.isNumber(o.minLength) ? o.minLength : 1; + this.input = o.input; + this.menu = o.menu; + this.enabled = true; + this.autoselect = !!o.autoselect; + this.active = false; + this.input.hasFocus() && this.activate(); + this.dir = this.input.getLangDir(); + this._hacks(); + this.menu.bind().onSync("selectableClicked", this._onSelectableClicked, this).onSync("asyncRequested", this._onAsyncRequested, this).onSync("asyncCanceled", this._onAsyncCanceled, this).onSync("asyncReceived", this._onAsyncReceived, this).onSync("datasetRendered", this._onDatasetRendered, this).onSync("datasetCleared", this._onDatasetCleared, this); + onFocused = c(this, "activate", "open", "_onFocused"); + onBlurred = c(this, "deactivate", "_onBlurred"); + onEnterKeyed = c(this, "isActive", "isOpen", "_onEnterKeyed"); + onTabKeyed = c(this, "isActive", "isOpen", "_onTabKeyed"); + onEscKeyed = c(this, "isActive", "_onEscKeyed"); + onUpKeyed = c(this, "isActive", "open", "_onUpKeyed"); + onDownKeyed = c(this, "isActive", "open", "_onDownKeyed"); + onLeftKeyed = c(this, "isActive", "isOpen", "_onLeftKeyed"); + onRightKeyed = c(this, "isActive", "isOpen", "_onRightKeyed"); + onQueryChanged = c(this, "_openIfActive", "_onQueryChanged"); + onWhitespaceChanged = c(this, "_openIfActive", "_onWhitespaceChanged"); + this.input.bind().onSync("focused", onFocused, this).onSync("blurred", onBlurred, this).onSync("enterKeyed", onEnterKeyed, this).onSync("tabKeyed", onTabKeyed, this).onSync("escKeyed", onEscKeyed, this).onSync("upKeyed", onUpKeyed, this).onSync("downKeyed", onDownKeyed, this).onSync("leftKeyed", onLeftKeyed, this).onSync("rightKeyed", onRightKeyed, this).onSync("queryChanged", onQueryChanged, this).onSync("whitespaceChanged", onWhitespaceChanged, this).onSync("langDirChanged", this._onLangDirChanged, this); + } + _.mixin(Typeahead.prototype, { + _hacks: function hacks() { + var $input, $menu; + $input = this.input.$input || $("
"); + $menu = this.menu.$node || $("
"); + $input.on("blur.tt", function($e) { + var active, isActive, hasActive; + active = document.activeElement; + isActive = $menu.is(active); + hasActive = $menu.has(active).length > 0; + if (_.isMsie() && (isActive || hasActive)) { + $e.preventDefault(); + $e.stopImmediatePropagation(); + _.defer(function() { + $input.focus(); + }); + } + }); + $menu.on("mousedown.tt", function($e) { + $e.preventDefault(); + }); + }, + _onSelectableClicked: function onSelectableClicked(type, $el) { + this.select($el); + }, + _onDatasetCleared: function onDatasetCleared() { + this._updateHint(); + }, + _onDatasetRendered: function onDatasetRendered(type, suggestions, async, dataset) { + this._updateHint(); + if (this.autoselect) { + var cursorClass = this.selectors.cursor.substr(1); + this.menu.$node.find(this.selectors.suggestion).first().addClass(cursorClass); + } + this.eventBus.trigger("render", suggestions, async, dataset); + }, + _onAsyncRequested: function onAsyncRequested(type, dataset, query) { + this.eventBus.trigger("asyncrequest", query, dataset); + }, + _onAsyncCanceled: function onAsyncCanceled(type, dataset, query) { + this.eventBus.trigger("asynccancel", query, dataset); + }, + _onAsyncReceived: function onAsyncReceived(type, dataset, query) { + this.eventBus.trigger("asyncreceive", query, dataset); + }, + _onFocused: function onFocused() { + this._minLengthMet() && this.menu.update(this.input.getQuery()); + }, + _onBlurred: function onBlurred() { + if (this.input.hasQueryChangedSinceLastFocus()) { + this.eventBus.trigger("change", this.input.getQuery()); + } + }, + _onEnterKeyed: function onEnterKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + if (this.select($selectable)) { + $e.preventDefault(); + $e.stopPropagation(); + } + } else if (this.autoselect) { + if (this.select(this.menu.getTopSelectable())) { + $e.preventDefault(); + $e.stopPropagation(); + } + } + }, + _onTabKeyed: function onTabKeyed(type, $e) { + var $selectable; + if ($selectable = this.menu.getActiveSelectable()) { + this.select($selectable) && $e.preventDefault(); + } else if (this.autoselect) { + if ($selectable = this.menu.getTopSelectable()) { + this.autocomplete($selectable) && $e.preventDefault(); + } + } + }, + _onEscKeyed: function onEscKeyed() { + this.close(); + }, + _onUpKeyed: function onUpKeyed() { + this.moveCursor(-1); + }, + _onDownKeyed: function onDownKeyed() { + this.moveCursor(+1); + }, + _onLeftKeyed: function onLeftKeyed() { + if (this.dir === "rtl" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onRightKeyed: function onRightKeyed() { + if (this.dir === "ltr" && this.input.isCursorAtEnd()) { + this.autocomplete(this.menu.getActiveSelectable() || this.menu.getTopSelectable()); + } + }, + _onQueryChanged: function onQueryChanged(e, query) { + this._minLengthMet(query) ? this.menu.update(query) : this.menu.empty(); + }, + _onWhitespaceChanged: function onWhitespaceChanged() { + this._updateHint(); + }, + _onLangDirChanged: function onLangDirChanged(e, dir) { + if (this.dir !== dir) { + this.dir = dir; + this.menu.setLanguageDirection(dir); + } + }, + _openIfActive: function openIfActive() { + this.isActive() && this.open(); + }, + _minLengthMet: function minLengthMet(query) { + query = _.isString(query) ? query : this.input.getQuery() || ""; + return query.length >= this.minLength; + }, + _updateHint: function updateHint() { + var $selectable, data, val, query, escapedQuery, frontMatchRegEx, match; + $selectable = this.menu.getTopSelectable(); + data = this.menu.getSelectableData($selectable); + val = this.input.getInputValue(); + if (data && !_.isBlankString(val) && !this.input.hasOverflow()) { + query = Input.normalizeQuery(val); + escapedQuery = _.escapeRegExChars(query); + frontMatchRegEx = new RegExp("^(?:" + escapedQuery + ")(.+$)", "i"); + match = frontMatchRegEx.exec(data.val); + match && this.input.setHint(val + match[1]); + } else { + this.input.clearHint(); + } + }, + isEnabled: function isEnabled() { + return this.enabled; + }, + enable: function enable() { + this.enabled = true; + }, + disable: function disable() { + this.enabled = false; + }, + isActive: function isActive() { + return this.active; + }, + activate: function activate() { + if (this.isActive()) { + return true; + } else if (!this.isEnabled() || this.eventBus.before("active")) { + return false; + } else { + this.active = true; + this.eventBus.trigger("active"); + return true; + } + }, + deactivate: function deactivate() { + if (!this.isActive()) { + return true; + } else if (this.eventBus.before("idle")) { + return false; + } else { + this.active = false; + this.close(); + this.eventBus.trigger("idle"); + return true; + } + }, + isOpen: function isOpen() { + return this.menu.isOpen(); + }, + open: function open() { + if (!this.isOpen() && !this.eventBus.before("open")) { + this.input.setAriaExpanded(true); + this.menu.open(); + this._updateHint(); + this.eventBus.trigger("open"); + } + return this.isOpen(); + }, + close: function close() { + if (this.isOpen() && !this.eventBus.before("close")) { + this.input.setAriaExpanded(false); + this.menu.close(); + this.input.clearHint(); + this.input.resetInputValue(); + this.eventBus.trigger("close"); + } + return !this.isOpen(); + }, + setVal: function setVal(val) { + this.input.setQuery(_.toStr(val)); + }, + getVal: function getVal() { + return this.input.getQuery(); + }, + select: function select($selectable) { + var data = this.menu.getSelectableData($selectable); + if (data && !this.eventBus.before("select", data.obj, data.dataset)) { + this.input.setQuery(data.val, true); + this.eventBus.trigger("select", data.obj, data.dataset); + this.close(); + return true; + } + return false; + }, + autocomplete: function autocomplete($selectable) { + var query, data, isValid; + query = this.input.getQuery(); + data = this.menu.getSelectableData($selectable); + isValid = data && query !== data.val; + if (isValid && !this.eventBus.before("autocomplete", data.obj, data.dataset)) { + this.input.setQuery(data.val); + this.eventBus.trigger("autocomplete", data.obj, data.dataset); + return true; + } + return false; + }, + moveCursor: function moveCursor(delta) { + var query, $candidate, data, suggestion, datasetName, cancelMove, id; + query = this.input.getQuery(); + $candidate = this.menu.selectableRelativeToCursor(delta); + data = this.menu.getSelectableData($candidate); + suggestion = data ? data.obj : null; + datasetName = data ? data.dataset : null; + id = $candidate ? $candidate.attr("id") : null; + this.input.trigger("cursorchange", id); + cancelMove = this._minLengthMet() && this.menu.update(query); + if (!cancelMove && !this.eventBus.before("cursorchange", suggestion, datasetName)) { + this.menu.setCursor($candidate); + if (data) { + if (typeof data.val === "string") { + this.input.setInputValue(data.val); + } + } else { + this.input.resetInputValue(); + this._updateHint(); + } + this.eventBus.trigger("cursorchange", suggestion, datasetName); + return true; + } + return false; + }, + destroy: function destroy() { + this.input.destroy(); + this.menu.destroy(); + } + }); + return Typeahead; + function c(ctx) { + var methods = [].slice.call(arguments, 1); + return function() { + var args = [].slice.call(arguments); + _.each(methods, function(method) { + return ctx[method].apply(ctx, args); + }); + }; + } + }(); + (function() { + "use strict"; + var old, keys, methods; + old = $.fn.typeahead; + keys = { + www: "tt-www", + attrs: "tt-attrs", + typeahead: "tt-typeahead" + }; + methods = { + initialize: function initialize(o, datasets) { + var www; + datasets = _.isArray(datasets) ? datasets : [].slice.call(arguments, 1); + o = o || {}; + www = WWW(o.classNames); + return this.each(attach); + function attach() { + var $input, $wrapper, $hint, $menu, defaultHint, defaultMenu, eventBus, input, menu, status, typeahead, MenuConstructor; + _.each(datasets, function(d) { + d.highlight = !!o.highlight; + }); + $input = $(this); + $wrapper = $(www.html.wrapper); + $hint = $elOrNull(o.hint); + $menu = $elOrNull(o.menu); + defaultHint = o.hint !== false && !$hint; + defaultMenu = o.menu !== false && !$menu; + defaultHint && ($hint = buildHintFromInput($input, www)); + defaultMenu && ($menu = $(www.html.menu).css(www.css.menu)); + $hint && $hint.val(""); + $input = prepInput($input, www); + if (defaultHint || defaultMenu) { + $wrapper.css(www.css.wrapper); + $input.css(defaultHint ? www.css.input : www.css.inputWithNoHint); + $input.wrap($wrapper).parent().prepend(defaultHint ? $hint : null).append(defaultMenu ? $menu : null); + } + MenuConstructor = defaultMenu ? DefaultMenu : Menu; + eventBus = new EventBus({ + el: $input + }); + input = new Input({ + hint: $hint, + input: $input, + menu: $menu + }, www); + menu = new MenuConstructor({ + node: $menu, + datasets: datasets + }, www); + status = new Status({ + $input: $input, + menu: menu + }); + typeahead = new Typeahead({ + input: input, + menu: menu, + eventBus: eventBus, + minLength: o.minLength, + autoselect: o.autoselect + }, www); + $input.data(keys.www, www); + $input.data(keys.typeahead, typeahead); + } + }, + isEnabled: function isEnabled() { + var enabled; + ttEach(this.first(), function(t) { + enabled = t.isEnabled(); + }); + return enabled; + }, + enable: function enable() { + ttEach(this, function(t) { + t.enable(); + }); + return this; + }, + disable: function disable() { + ttEach(this, function(t) { + t.disable(); + }); + return this; + }, + isActive: function isActive() { + var active; + ttEach(this.first(), function(t) { + active = t.isActive(); + }); + return active; + }, + activate: function activate() { + ttEach(this, function(t) { + t.activate(); + }); + return this; + }, + deactivate: function deactivate() { + ttEach(this, function(t) { + t.deactivate(); + }); + return this; + }, + isOpen: function isOpen() { + var open; + ttEach(this.first(), function(t) { + open = t.isOpen(); + }); + return open; + }, + open: function open() { + ttEach(this, function(t) { + t.open(); + }); + return this; + }, + close: function close() { + ttEach(this, function(t) { + t.close(); + }); + return this; + }, + select: function select(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.select($el); + }); + return success; + }, + autocomplete: function autocomplete(el) { + var success = false, $el = $(el); + ttEach(this.first(), function(t) { + success = t.autocomplete($el); + }); + return success; + }, + moveCursor: function moveCursoe(delta) { + var success = false; + ttEach(this.first(), function(t) { + success = t.moveCursor(delta); + }); + return success; + }, + val: function val(newVal) { + var query; + if (!arguments.length) { + ttEach(this.first(), function(t) { + query = t.getVal(); + }); + return query; + } else { + ttEach(this, function(t) { + t.setVal(_.toStr(newVal)); + }); + return this; + } + }, + destroy: function destroy() { + ttEach(this, function(typeahead, $input) { + revert($input); + typeahead.destroy(); + }); + return this; + } + }; + $.fn.typeahead = function(method) { + if (methods[method]) { + return methods[method].apply(this, [].slice.call(arguments, 1)); + } else { + return methods.initialize.apply(this, arguments); + } + }; + $.fn.typeahead.noConflict = function noConflict() { + $.fn.typeahead = old; + return this; + }; + function ttEach($els, fn) { + $els.each(function() { + var $input = $(this), typeahead; + (typeahead = $input.data(keys.typeahead)) && fn(typeahead, $input); + }); + } + function buildHintFromInput($input, www) { + return $input.clone().addClass(www.classes.hint).removeData().css(www.css.hint).css(getBackgroundStyles($input)).prop({ + readonly: true, + required: false + }).removeAttr("id name placeholder").removeClass("required").attr({ + spellcheck: "false", + tabindex: -1 + }); + } + function prepInput($input, www) { + $input.data(keys.attrs, { + dir: $input.attr("dir"), + autocomplete: $input.attr("autocomplete"), + spellcheck: $input.attr("spellcheck"), + style: $input.attr("style") + }); + $input.addClass(www.classes.input).attr({ + spellcheck: false + }); + try { + !$input.attr("dir") && $input.attr("dir", "auto"); + } catch (e) {} + return $input; + } + function getBackgroundStyles($el) { + return { + backgroundAttachment: $el.css("background-attachment"), + backgroundClip: $el.css("background-clip"), + backgroundColor: $el.css("background-color"), + backgroundImage: $el.css("background-image"), + backgroundOrigin: $el.css("background-origin"), + backgroundPosition: $el.css("background-position"), + backgroundRepeat: $el.css("background-repeat"), + backgroundSize: $el.css("background-size") + }; + } + function revert($input) { + var www, $wrapper; + www = $input.data(keys.www); + $wrapper = $input.parent().filter(www.selectors.wrapper); + _.each($input.data(keys.attrs), function(val, key) { + _.isUndefined(val) ? $input.removeAttr(key) : $input.attr(key, val); + }); + $input.removeData(keys.typeahead).removeData(keys.www).removeData(keys.attr).removeClass(www.classes.input); + if ($wrapper.length) { + $input.detach().insertAfter($wrapper); + $wrapper.remove(); + } + } + function $elOrNull(obj) { + var isValid, $el; + isValid = _.isJQuery(obj) || _.isElement(obj); + $el = isValid ? $(obj).first() : []; + return $el.length ? $el : null; + } + })(); +}); \ No newline at end of file diff --git a/search.json b/search.json new file mode 100644 index 0000000..013be5f --- /dev/null +++ b/search.json @@ -0,0 +1 @@ +{"Typealiases.html#/s:11CohesionKit17EntityEnumWrappera":{"name":"EntityEnumWrapper"},"Typealiases.html#/s:11CohesionKit11IdentityMapa":{"name":"IdentityMap"},"Typealiases.html#/s:11CohesionKit5Stampa":{"name":"Stamp","abstract":"

A type used to annotate track object modifications through time."},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__Gcs0D0Rd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an Identifiable keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcAA9AggregateRd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an Aggregate keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcs0D0Rd__lufc":{"name":"init(_:)","abstract":"

Creates an instance referencing an optional Identifiable keyPath

","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcAA9AggregateRd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcSMRd__s0D07ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcSMRd__s0D07ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__GcSMRd__AA9Aggregate7ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathVyACyxGs08WritableeF0Cyxqd__SgGcSMRd__AA9Aggregate7ElementRpd__SH5IndexRpd__lufc":{"name":"init(_:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathV7wrapperACyxGs08WritableeF0Cyxqd__G_tcAA13EntityWrapperRd__lufc":{"name":"init(wrapper:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/PartialIdentifiableKeyPath.html#/s:11CohesionKit26PartialIdentifiableKeyPathV7wrapperACyxGs08WritableeF0Cyxqd__SgG_tcAA13EntityWrapperRd__lufc":{"name":"init(wrapper:)","parent_name":"PartialIdentifiableKeyPath"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV8OnChangea":{"name":"OnChange","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV5valuexvp":{"name":"value","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV7observe8onChangeAA12SubscriptionCyxc_tF":{"name":"observe(onChange:)","parent_name":"EntityObserver"},"Structs/EntityObserver.html#/s:11CohesionKit14EntityObserverV11asPublisher7Combine03AnyF0Vyxs5NeverOGvp":{"name":"asPublisher","abstract":"

A Publisher emitting the observer current value and subscribing to any subsequents new values

","parent_name":"EntityObserver"},"Structs/AliasKey.html#/s:11CohesionKit8AliasKeyV5namedACyxGSS_tcfc":{"name":"init(named:)","parent_name":"AliasKey"},"Structs/AliasKey.html":{"name":"AliasKey","abstract":"

A value representing an Entity or set of Entity

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

A type registering observers on a given entity from identity storage

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

A KeyPath wrapper allowing only Identifiable/Aggregate keypaths

"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP8didStore_2idyqd__m_2IDQyd__ts12IdentifiableRd__lF":{"name":"didStore(_:id:)","abstract":"

Notify when an entity was stored in the identity map

","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP16didFailedToStore_2id5erroryqd__m_2IDQyd__s5Error_pts12IdentifiableRd__lF":{"name":"didFailedToStore(_:id:error:)","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP16didRegisterAliasyyAA0F3KeyVyqd__GlF":{"name":"didRegisterAlias(_:)","abstract":"

Notify an alias is registered with new entities

","parent_name":"Logger"},"Protocols/Logger.html#/s:11CohesionKit6LoggerP18didUnregisterAliasyyAA0F3KeyVyqd__GlF":{"name":"didUnregisterAlias(_:)","abstract":"

Notify an alias is suppressed from the identity map

","parent_name":"Logger"},"Protocols/EntityWrapper.html#/s:11CohesionKit13EntityWrapperP23wrappedEntitiesKeyPaths10relativeToSayAA019PartialIdentifiableG4PathVyqd__GGs08WritablegM0Cyqd__xG_tlF":{"name":"wrappedEntitiesKeyPaths(relativeTo:)","abstract":"

Entities contained by all cases relative to the parent container

","parent_name":"EntityWrapper"},"Protocols/Aggregate.html#/s:11CohesionKit9AggregateP22nestedEntitiesKeyPathsSayAA019PartialIdentifiableF4PathVyxGGvp":{"name":"nestedEntitiesKeyPaths","abstract":"

keypaths to nested models

","parent_name":"Aggregate"},"Protocols/Aggregate.html":{"name":"Aggregate","abstract":"

An Identifiable model containing nested models

"},"Protocols/EntityWrapper.html":{"name":"EntityWrapper","abstract":"

A type wrapping one or more Identifiable types."},"Protocols/Logger.html":{"name":"Logger","abstract":"

a protocol reporting EntityStore internal information

"},"Extensions/Date.html#/s:10Foundation4DateV11CohesionKitE5stampSdvp":{"name":"stamp","abstract":"

Generate a stamp suitable to use in EntityStore.","parent_name":"Date"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0Vy6OutputQz7FailureQzGAD11EntityStoreC_AD8AliasKeyVyALGSgSdts12IdentifiableALRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the Identifiable upstream into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0Vy6OutputQz7FailureQzGAD11EntityStoreC_AD8AliasKeyVyALGSgSdtAD9AggregateALRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the Aggregate upstream into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0VySay6Output_7ElementQZG7FailureQzGAD11EntityStoreC_AD8AliasKeyVyAKQzGSgSdtSlAVRQs12IdentifiableAMRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the upstream collection into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html#/s:7Combine9PublisherP11CohesionKitE5store2in5named10modifiedAtAA03AnyB0VySay6Output_7ElementQZG7FailureQzGAD11EntityStoreC_AD8AliasKeyVyAKQzGSgSdtSlAVRQAD9AggregateAMRQrlF":{"name":"store(in:named:modifiedAt:)","abstract":"

Stores the upstream collection into an entityStore

","parent_name":"Publisher"},"Extensions/Publisher.html":{"name":"Publisher"},"Extensions/Date.html":{"name":"Date"},"Extensions.html#/s:11CohesionKit10EntityNodeC":{"name":"EntityNode"},"Enums/StampError.html#/s:11CohesionKit10StampErrorO6tooOldyACSd_SdtcACmF":{"name":"tooOld(current:received:)","abstract":"

received stamp is smaller than current stamp

","parent_name":"StampError"},"Enums/StampError.html":{"name":"StampError"},"Classes/Subscription.html#/s:11CohesionKit12SubscriptionC11unsubscribeyycvp":{"name":"unsubscribe","parent_name":"Subscription"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6Updatea":{"name":"Update","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5queue6loggerACSo012OS_dispatch_E0CSg_AA6Logger_pSgtcfc":{"name":"init(queue:logger:)","abstract":"

Create a new EntityStore instance optionally with a queue and a logger

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store6entity5named10modifiedAt9ifPresentAA0C8ObserverVyxGx_AA8AliasKeyVyxGSgSdSgyxzcSgts12IdentifiableRzlF":{"name":"store(entity:named:modifiedAt:ifPresent:)","abstract":"

Store an entity in the storage. Entity will be stored only if stamp (modifiedAt) is higher than in previous","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store6entity5named10modifiedAt9ifPresentAA0C8ObserverVyxGx_AA8AliasKeyVyxGSgSdSgyxzcSgtAA9AggregateRzlF":{"name":"store(entity:named:modifiedAt:ifPresent:)","abstract":"

Store an aggregate in the storage. Each aggregate entities will be stored only if stamp (modifiedAt) is higher than in previous","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store8entities5named10modifiedAtAA0C8ObserverVySay7ElementQzGGx_AA8AliasKeyVyxGSgSdSgtSlRzs12IdentifiableAKRQlF":{"name":"store(entities:named:modifiedAt:)","abstract":"

Store multiple entities at once

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC5store8entities5named10modifiedAtAA0C8ObserverVySay7ElementQzGGx_AA8AliasKeyVyxGSgSdSgtSlRzAA9AggregateAKRQlF":{"name":"store(entities:named:modifiedAt:)","abstract":"

store multiple aggregates at once

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find_2idAA0C8ObserverVyxGSgxm_2IDQzts12IdentifiableRzlF":{"name":"find(_:id:)","abstract":"

Try to find an entity/aggregate in the storage.

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find5namedAA0C8ObserverVyxSgGAA8AliasKeyVyxG_ts12IdentifiableRzlF":{"name":"find(named:)","abstract":"

Try to find an entity/aggregate registered under named alias

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC4find5namedAA0C8ObserverVyxSgGAA8AliasKeyVyxG_tSlRzlF":{"name":"find(named:)","abstract":"

Try to find a collected registered under named alias

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update_2id10modifiedAtADSbxm_2IDQzSdSgyxzXEts12IdentifiableRzlF":{"name":"update(_:id:modifiedAt:update:)","abstract":"

Updates an already stored entity using a closure. Useful to update a few properties or when you assume the entity","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update_2id10modifiedAt_Sbxm_2IDQzSdSgyxzXEtAA9AggregateRzlF":{"name":"update(_:id:modifiedAt:_:)","abstract":"

Updates an already stored alias using a closure. This is useful if you don’t have a full entity for update","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEts12IdentifiableRzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already stored alias using a closure.","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtAA9AggregateRzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already stored alias using a closure.","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtSlRzs12Identifiable7ElementRpzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already existing collection alias content","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC6update5named10modifiedAtADSbAA8AliasKeyVyxG_SdSgyxzXEtSlRzAA9Aggregate7ElementRpzlF":{"name":"update(named:modifiedAt:update:)","abstract":"

Updates an already existing collection alias content","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC11removeAlias5namedyAA0F3KeyVyxG_tlF":{"name":"removeAlias(named:)","abstract":"

Removes an alias from the storage

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC11removeAlias5namedyAA0F3KeyVyxG_tSlRzlF":{"name":"removeAlias(named:)","abstract":"

Removes an alias from the storage

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC14removeAllAliasyyF":{"name":"removeAllAlias()","abstract":"

Removes all alias from identity map

","parent_name":"EntityStore"},"Classes/EntityStore.html#/s:11CohesionKit11EntityStoreC9removeAllyyF":{"name":"removeAll()","abstract":"

Removes all alias AND all objects stored weakly. You should not need this method and rather use removeAlias.","parent_name":"EntityStore"},"Classes/EntityStore.html":{"name":"EntityStore","abstract":"

Manages entities lifecycle and synchronisation

"},"Classes/Subscription.html":{"name":"Subscription"},"Classes.html":{"name":"Classes","abstract":"

The following classes are available globally.

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

The following enumerations are available globally.

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

The following extensions are available globally.

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

The following protocols 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/undocumented.json b/undocumented.json new file mode 100644 index 0000000..a27d575 --- /dev/null +++ b/undocumented.json @@ -0,0 +1,6 @@ +{ + "warnings": [ + + ], + "source_directory": "/Users/runner/work/CohesionKit/CohesionKit" +} \ No newline at end of file