{"id":28435194,"url":"https://github.com/skiptools/skip-lib","last_synced_at":"2026-04-02T00:03:34.054Z","repository":{"id":189263576,"uuid":"680363450","full_name":"skiptools/skip-lib","owner":"skiptools","description":"Standard Library for Skip apps","archived":false,"fork":false,"pushed_at":"2026-03-22T22:04:25.000Z","size":581,"stargazers_count":13,"open_issues_count":7,"forks_count":3,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-03-23T15:47:13.100Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://skip.dev/docs/modules/skip-lib/","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skiptools.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.LGPL","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"custom":["https://skip.dev/sponsor"]}},"created_at":"2023-08-19T02:28:49.000Z","updated_at":"2026-03-22T22:04:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"1d38cf1f-af7a-4e0e-ba54-e97458ea0aaa","html_url":"https://github.com/skiptools/skip-lib","commit_stats":null,"previous_names":["skiptools/skip-lib"],"tags_count":122,"template":false,"template_full_name":null,"purl":"pkg:github/skiptools/skip-lib","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiptools%2Fskip-lib","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiptools%2Fskip-lib/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiptools%2Fskip-lib/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiptools%2Fskip-lib/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skiptools","download_url":"https://codeload.github.com/skiptools/skip-lib/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiptools%2Fskip-lib/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31293160,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-05T20:06:54.344Z","updated_at":"2026-04-02T00:03:34.025Z","avatar_url":"https://github.com/skiptools.png","language":"Swift","funding_links":["https://skip.dev/sponsor"],"categories":[],"sub_categories":[],"readme":"# SkipLib\n\nSwift standard library for [Skip Lite](https://skip.dev/docs/modes/#lite) transpiled Swift.\n\nSee what API is currently implemented [here](#swift-standard-library-support).\n\n## About \n\nSkipLib vends the `skip.lib` Kotlin package. It serves two purposes:\n\n1. SkipLib is a reimplementation of the Swift standard library for Kotlin on Android. Its goal is to mirror as much of the Swift standard library as possible, allowing Skip developers to use Swift standard library API with confidence.\n1. SkipLib contains custom Kotlin API that the Skip transpiler takes advantage of when translating your Swift source to the equivalent Kotlin code. For example, the Kotlin language does not have tuples. Instead, SkipLib's `Tuple.kt` defines bespoke Kotlin `Tuple` classes. When the transpiler translates Swift code that references tuples, it uses these `Tuple` classes in the Kotlin it generates.\n\n## Dependencies\n\nSkipLib depends on the [skip](https://source.skip.dev/skip) transpiler plugin and has no additional library dependencies.\n\nIt is part of the core *Skip Core Frameworks* and is not intended to be imported directly.\nThe module is transparently adopted through the automatic addition of `import skip.lib.*` to transpiled files by the Skip transpiler.\n\n## Status\n\n- SkipLib's Swift symbol files (see [Implementation Strategy](#implementation-strategy)) are nominally complete. They should declare all Swift standard library API. This is difficult to validate, however, so if you find anything missing, please [report it](https://github.com/skiptools/skip-lib/issues) to us.\n- Unimplemented API is appropriately marked with `@available(*, unavailable)` annotations. Skip will generate an error when you attempt to use an unimplemented API.\n- In particular, a significant portion of the [collections](#collections) API is not yet implemented.\n- Unit testing is not comprehensive.\n\nSee [Swift Standard Library Support](#swift-standard-library-support).\n\n## Contributing\n\nWe welcome contributions to SkipLib. The Skip product [documentation](https://skip.dev/docs/contributing/) includes helpful instructions and tips on local Skip library development. \n\nThe most pressing need is to reduce the amount of unimplemented API. To help fill in unimplemented API in SkipLib:\n\n1. Find unimplemented API. Unimplemented API should be marked with `@available(*, unavailable)` in the Swift symbol files.\n1. Write an appropriate Kotlin implementation. See [Implementation Strategy](#implementation-strategy) below. For [collections](#collections) API, make sure your implementation is duplicated for `String` as well.\n1. Write unit tests.\n1. [Submit a PR.](https://github.com/skiptools/skip-lib/pulls)\n\nOther forms of contributions such as test cases, comments, and documentation are also welcome!\n\n## Implementation Strategy\n\nApart from the Skip transpiler itself, SkipLib implements the lowest levels of the Swift language. Its implementation strategy, therefore, differs from other Skip libraries. \n\nMost Skip libraries *call* Kotlin API, but are *written* in Swift, relying on the Skip transpiler for translation to Kotlin. Most of SkipLib, however, is written in pure Kotlin. Consider SkipLib's implementation of Swift's `Array`. SkipLib divides its `Array` support into two files:\n\n1. `Sources/SkipLib/Array.swift` acts as a Swift header file, declaring the `Array` type's Swift API but stubbing out the implementation. The `// SKIP SYMBOLFILE` comment at the top of the file marks it as such. Read more about special Skip comments in the Skip product [documentation](https://skip.dev/docs/platformcustomization/#skip-comments).\n1. `Sources/SkipLib/Skip/Array.kt` contains the actual `Array` implementation in Kotlin. \n\nThis pattern is used for most Swift types throughout SkipLib. Meanwhile, SwiftLib implementations of constructs built directly into the Swift language - e.g. tuples or `inout` parameters - only have a Kotlin file, with no corresponding Swift symbol file.\n\n## Swift Standard Library Support\n\nThe following table summarizes SkipLib's Swift Standard Library API support on Android. Anything not listed here is likely not supported. Note that in your iOS-only code - i.e. code within `#if !SKIP` blocks - you can use any API you want.\n\nSupport levels:\n\n  - ✅ – Full\n  - 🟢 – High\n  - 🟡 - Medium\n  - 🟠 – Low\n\n\u003ctable\u003e\n  \u003cthead\u003e\u003cth\u003eSupport\u003c/th\u003e\u003cth\u003eAPI\u003c/th\u003e\u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eActor\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eNon-private mutable properties are not supported\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAny\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyActor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyHashable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAnyObject\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eArray\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003einit()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(repeating: Element, count: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(_ sequence: any Sequence\u0026lt;Element\u0026gt;)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSee \u003ccode\u003eCollection\u003c/code\u003e for collection API support\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eassert\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eassertionFailure\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eAsyncSequence\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eAsyncStream\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003eWhen invoking the \u003ccode\u003einit(unfolding:)\u003c/code\u003e constructor, use a labeled argument rather than a trailing closure\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eBool\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic func random() -\u003e Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(using gen: inout RandomNumberGenerator) -\u003e Bool\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCaseIterable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGAffineTransform\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGFloat\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGPoint\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGRect\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCGSize\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eCharacter\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003einit(_: Character)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(_: String)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isNewline: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isWhitespace: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isUppercase: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isLowercase: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc lowercased() -\u003e String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc uppercased() -\u003e String\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eCodable\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eSee \u003ca href=\"#codable\"\u003eCodable\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟡\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eCollection\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003eNote: This list represents the combined supported API of Swift's many collection types: \u003ccode\u003eSequence\u003c/code\u003e, \u003ccode\u003eCollection\u003c/code\u003e, \u003ccode\u003eBidirectionalCollection\u003c/code\u003e, etc\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc allSatisfy(_ predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func append(_ newElement: Element)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func append(contentsOf newElements: any Sequence\u0026lt;Element\u0026gt;)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc contains(_ element: Element) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc contains(where predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc distance(from start: Int, to end: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc drop(while predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc dropFirst(_ k: Int = 1) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc dropLast(_ k: Int = 1) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc elementsEqual(_ other: any Sequence\u0026lt;Element\u0026gt;) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc elementsEqual(_ other: any Sequence\u0026lt;Element\u0026gt;, by areEquivalent: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc enumerated() -\u0026gt; any Sequence\u0026lt;(offset: Int, element: Element)\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar endIndex: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc filter(_ isIncluded: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc first(where predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc firstIndex(of element: Element) -\u0026gt; Int?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc firstIndex(where predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Int?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar first: Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc flatMap\u0026lt;RE\u0026gt;(_ transform: (Element) throws -\u0026gt; any Sequence\u0026lt;RE\u0026gt;) rethrows -\u0026gt; [RE]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc formIndex(_ i: inout Int, offsetBy distance: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc formIndex(after i: inout Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc index(_ i: Int, offsetBy distance: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc index(after i: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar indices: any Sequence\u0026lt;Int\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isEmpty: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined\u0026lt;RE\u0026gt;() -\u0026gt; [RE] where Element: Sequence\u0026lt;RE\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined\u0026lt;RE\u0026gt;(separator: any Sequence\u0026lt;RE\u0026gt;) -\u0026gt; [RE] where Element: Sequence\u0026lt;RE\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined(separator: String) -\u0026gt; String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc makeIterator() -\u0026gt; any IteratorProtocol\u0026lt;Element\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc map\u0026lt;RE\u0026gt;(_ transform: (Element) throws -\u0026gt; RE) rethrows -\u0026gt; [RE]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc max() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc max(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc min() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc min(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar underestimatedCount: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc prefix(_ maxLength: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc prefix(through end: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc prefix(upTo end: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func popFirst() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func popLast() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc randomElement() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc randomElement(using generator: inout any RandomNumberGenerator) -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reduce\u0026lt;R\u0026gt;(_ initialResult: R, _ nextPartialResult: (_ partialResult: R, Element) throws -\u0026gt; R) rethrows -\u0026gt; R\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reduce\u0026lt;R\u0026gt;(into initialResult: R, _ updateAccumulatingResult: (_ partialResult: inout R, Element) throws -\u0026gt; Void) rethrows -\u0026gt; R\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc remove(at i: Int) -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeAll(keepingCapacity keepCapacity: Bool = false)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeAll(where shouldBeRemoved: (Element) throws -\u0026gt; Bool) rethrows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeFirst() -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeFirst(_ k: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeLast() -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeLast(_ k: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func reverse()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reversed() -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func shuffle()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func shuffle\u0026lt;T: RandomNumberGenerator\u0026gt;(using generator: inout T)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func sort()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func sort(by areIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func swapAt(_ i: Int, _ j: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(bounds: Range\u0026lt;Int\u0026gt;) -\u0026gt; any Collection\u0026lt;Element\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(position: Int) -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc starts(with possiblePrefix: Any) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc starts(with possiblePrefix: Any, by areEquivalent: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc suffix(from start: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc suffix(_ maxLength: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sorted() -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sorted(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar startIndex: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar count: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc count\u0026lt;E\u0026gt;(where: (E) throws -\u003e Bool) rethrows -\u003e Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc withContiguousStorageIfAvailable\u0026lt;R\u0026gt;(_ body: (Any) throws -\u0026gt; R) rethrows -\u0026gt; R?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc forEach(_ body: (Element) throws -\u0026gt; Void) rethrows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc drop(while predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc dropFirst(_ k: Int = 1) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc dropLast(_ k: Int = 1) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc enumerated() -\u0026gt; any Sequence\u0026lt;(offset: Int, element: Element)\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc filter(_ isIncluded: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc first(where predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc map\u0026lt;RE\u0026gt;(_ transform: (Element) throws -\u0026gt; RE) rethrows -\u0026gt; [RE]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc max(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc min(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reduce\u0026lt;R\u0026gt;(_ initialResult: R, _ nextPartialResult: (_ partialResult: R, Element) throws -\u0026gt; R) rethrows -\u0026gt; R\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reduce\u0026lt;R\u0026gt;(into initialResult: R, _ updateAccumulatingResult: (_ partialResult: inout R, Element) throws -\u0026gt; Void) rethrows -\u0026gt; R\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc reversed() -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc shuffled() -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc shuffled\u0026lt;T: RandomNumberGenerator\u0026gt;(using generator: inout T) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc flatMap\u0026lt;RE\u0026gt;(_ transform: (Element) throws -\u0026gt; any Sequence\u0026lt;RE\u0026gt;) rethrows -\u0026gt; [RE]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc compactMap\u0026lt;RE\u0026gt;(_ transform: (Element) throws -\u0026gt; RE?) rethrows -\u0026gt; [RE]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sorted(by areInIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined\u0026lt;RE\u0026gt;() -\u0026gt; [RE] where Element: Sequence\u0026lt;RE\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined\u0026lt;RE\u0026gt;(separator: any Sequence\u0026lt;RE\u0026gt;) -\u0026gt; [RE] where Element: Sequence\u0026lt;RE\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc joined(separator: String) -\u0026gt; String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc starts(with possiblePrefix: Any) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc contains(_ element: Element) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc min() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc max() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sorted() -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar startIndex: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar endIndex: Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar indices: any Sequence\u0026lt;Int\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc index(_ i: Int, offsetBy distance: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc distance(from start: Int, to end: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc index(after i: Int) -\u0026gt; Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc formIndex(after i: inout Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc formIndex(_ i: inout Int, offsetBy distance: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc randomElement() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc randomElement(using generator: inout any RandomNumberGenerator) -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func popFirst() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar first: Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc prefix(upTo end: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc suffix(from start: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc prefix(through end: Int) -\u0026gt; [Element]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeFirst() -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeFirst(_ k: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc firstIndex(of element: Element) -\u0026gt; Int?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc firstIndex(where predicate: (Element) throws -\u0026gt; Bool) rethrows -\u0026gt; Int?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func shuffle()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func shuffle\u0026lt;T: RandomNumberGenerator\u0026gt;(using generator: inout T)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func sort()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func sort(by areIncreasingOrder: (Element, Element) throws -\u0026gt; Bool) rethrows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func reverse()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func swapAt(_ i: Int, _ j: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func append(_ newElement: Element)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func append(contentsOf newElements: any Sequence\u0026lt;Element\u0026gt;)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func insert(_ newElement: Element, at i: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func insert(contentsOf newElements: any Sequence\u0026lt;Element\u0026gt;, at i: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func remove(at i: Int) -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeAll(keepingCapacity keepCapacity: Bool = false)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeAll(where shouldBeRemoved: (Element) throws -\u0026gt; Bool) rethrows\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func popLast() -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeLast() -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeLast(_ k: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(bounds: Range\u0026lt;Int\u0026gt;) -\u0026gt; any Collection\u0026lt;Element\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(position: Int) -\u0026gt; Element\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eComparable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCustomDebugStringConvertible\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eCustomStringConvertible\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eDecodable\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eSee \u003ca href=\"#codable\"\u003eCodable\u003c/a\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eDictionary\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003einit()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(minimumCapacity: Int)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(uniqueKeysWithValues keysAndValues: any Sequence\u0026lt;(Key, Value)\u0026gt;)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc filter(_ isIncluded: ((Key, Value)) throws -\u0026gt; Bool) rethrows -\u0026gt; Dictionary\u0026lt;Key, Value\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(key: Key) -\u0026gt; Value?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubscript(key: Key, default defaultValue: Value) -\u0026gt; Value\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc mapValues\u0026lt;T\u0026gt;(_ transform: (Value) throws -\u0026gt; T) rethrows -\u0026gt; Dictionary\u0026lt;Key, T\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc compactMapValues\u0026lt;T\u0026gt;(_ transform: (Value) throws -\u0026gt; T?) rethrows -\u0026gt; Dictionary\u0026lt;Key, T\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func updateValue(_ value: Value, forKey key: Key) -\u0026gt; Value?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeValue(forKey key: Key) -\u0026gt; Value?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar keys: any Collection\u0026lt;Key\u0026gt;)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar values: any Collection\u0026lt;Value\u0026gt;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func removeAll(keepingCapacity keepCapacity: Bool = false) \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSee \u003ccode\u003eCollection\u003c/code\u003e for collection API support\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eDiscardingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eDouble\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var nan: Double \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var infinity: Double \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var pi: Double \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isNan: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isFinite: Bool \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isInfinite: Bool \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Double\u0026gt;) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc rounded() -\u003e Double \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc rounded(_ rule: FloatingPointRoundingRule) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eEncodable\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eSee [Codable](#codable)\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eEquatable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eError\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003efatalError\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eFloat\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var nan: Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var infinity: Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var pi: Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isNan: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isFinite: Bool \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isInfinite: Bool \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Float\u003e) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc rounded() -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc rounded(_ rule: FloatingPointRoundingRule) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eHashable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eHasher\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n   \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eIdentifiable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eInt8\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: Int8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: Int8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int8\u0026gt;) -\u003e Int8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int8\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e Int8\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eInt16\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: Int16 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: Int16 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int16\u0026gt;) -\u003e Int16\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int16\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e Int16\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eInt32\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: Int32 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: Int32 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int32\u0026gt;) -\u003e Int32\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int32\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e Int32\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eInt\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eKotlin \u003ccode\u003eInts\u003c/code\u003e are 32 bit\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: Int \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: Int \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int\u0026gt;) -\u003e Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e Int\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eInt64\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: Int64 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: Int64 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int64\u0026gt;) -\u003e Int64\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;Int64\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e Int64\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003e@MainActor\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eMainActor\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ccode\u003estatic func run\u0026lt;T\u003e(body: () throws -\u003e T) async -\u003e T\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003emath.h\u003c/code\u003e\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003evar M_E: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar M_LOG2E: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar M_LOG10E: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar M_LN2: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar M_LN10: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar M_PI: Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acosf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acos(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acosl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asinf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asin(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asinl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atanf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atan(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atanl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atan2f(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atan2(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atan2l(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cosf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cos(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cosl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sinf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sin(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sinl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tanf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tan(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tanl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acoshf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acosh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc acoshl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asinhf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asinh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc asinhl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atanhf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atanh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc atanhl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc coshf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cosh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc coshl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sinhf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sinh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sinhl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tanhf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tanh(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc tanhl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc expf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc exp(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc expl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc exp2f(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc exp2(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc exp2l(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc expm1f(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc expm1(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc expm1l(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc logf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc logl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log10f(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log10(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log10l(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log2f(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log2(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log2l(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log1pf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log1p(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc log1pl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc logbf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc logb(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc logbl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc abs(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc abs(_ x: Int) -\u003e Int\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc abs(_ x: Int64) -\u003e Int64\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fabsf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fabs(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fabsl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cbrtf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cbrt(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cbrtl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc hypotf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc hypot(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc hypotl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc powf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc pow(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc powl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sqrtf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sqrt(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc sqrtl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc ceilf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc ceil(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc ceill(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc floorf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc floor(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc floorl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc roundf(_ x: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc round(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc roundl(_ x: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmodf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmod(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmodl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc remainderf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc remainder(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc remainderl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmaxf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmax(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmaxl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fminf(_ x: Float, _ y: Float) -\u003e Float\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fmin(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc fminl(_ x: Double, _ y: Double) -\u003e Double\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003emax(_:_:)\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003emin(_:_:)\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eObjectIdentifier\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eOptionSet\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eprecondition\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003epreconditionFailure\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eRandomNumberGenerator\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟠\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eRange\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eOnly \u003ccode\u003eRange\u0026lt;Int\u0026gt;\u003c/code\u003e is generally supported\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar lowerBound: Bound\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar upperBound: Bound\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc contains(_ element: Bound) -\u003e Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isEmpty: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc map\u0026lt;RE\u0026gt;(_ transform: (Bound) throws -\u003e RE) rethrows -\u003e [RE]\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eRawRepresentable\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟠\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eRegex\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ccode\u003einit(_ string: String)\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ccode\u003efunc matches(_ string: String) -\u003e [Match]\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ccode\u003efunc replace(_ string: String, with replacement: String) -\u003e String\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟠\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eRegex.Match\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ccode\u003evar count: Int\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003e\u003ccode\u003esubscript(index: Int) -\u003e MatchGroup\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟠\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eRegex.MatchGroup\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003e\u003ccode\u003evar substring: Substring?\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eResult\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟡\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eswap(_:_:)\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eDoes not support swapping values in arrays and other data structures\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eSet\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003einit()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(_ sequence: any Sequence\u0026lt;Element\u003e)\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003eSee \u003ccode\u003eCollection\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003eSee \u003ccode\u003eSetAlgebra\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eSetAlgebra\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003efunc contains(_ element: Element) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc union(_ other: Self) -\u0026gt; Self\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc intersection(_ other: Self) -\u0026gt; Self\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc symmetricDifference(_ other: Self) -\u0026gt; Self\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func insert(_ newMember: Element) -\u0026gt; (inserted: Bool, memberAfterInsert: Element)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func remove(_ member: Element) -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func update(with newMember: Element) -\u0026gt; Element?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func formUnion(_ other: Self)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func formIntersection(_ other: Self)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func formSymmetricDifference(_ other: Self)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc subtracting(_ other: Self) -\u0026gt; Self\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc isSubset(of other: Self) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc isDisjoint(with other: Self) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc isSuperset(of other: Self) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isEmpty: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emutating func subtract(_ other: Self)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc isStrictSubset(of other: Self) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc isStrictSuperset(of other: Self) -\u0026gt; Bool\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eString\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eKotlin strings are **not** mutable\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(data: Data, encoding: StringEncoding)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(bytes: [UInt8], encoding: StringEncoding)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einit(contentsOf: URL)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar capitalized: String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar deletingLastPathComponent: String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc replacingOccurrences(of search: String, with replacement: String) -\u003e String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc components(separatedBy separator: String) -\u003e [String]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc trimmingCharacters(in set: CharacterSet) -\u003e String\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar utf8Data: Data\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc data(using: StringEncoding, allowLossyConversion: Bool = true) -\u003e Data?\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar utf8: [UInt8]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar utf16: [UInt8]\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar unicodeScalars: [UInt8]\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003eSee \u003ccode\u003eCollection\u003c/code\u003e\u003c/li\u003e\n            \u003cli\u003eSee \u003ccode\u003eSkipFoundation\u003c/code\u003e for additional string API from \u003ccode\u003eFoundation\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003estrlen\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003estrncmp\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n       \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eSubstring\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eSee \u003ccode\u003eString\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eSystemRandomNumberGenerator\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟡\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eTask\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003einit(priority: TaskPriority? = nil, operation: @escaping () async throws -\u003e Success)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func detached(priority: TaskPriority? = nil, operation: @escaping () async -\u003e Success) -\u003e Task\u0026lt;Success, Failure\u003e\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar value: Success\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efunc cancel()\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func yield() async\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evar isCancelled: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var isCancelled: Bool\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func checkCancellation() throws\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func sleep(nanoseconds duration: UInt64) async throws\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt8 \u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eThrowingDiscardingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003eThrowingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003etype(of:)\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eUInt8\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt8 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: UInt8 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt8\u0026gt;) -\u003e UInt8\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt8\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e UInt8\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eUInt16\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt16 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: UInt16 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt16\u0026gt;) -\u003e UInt16\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt16\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e UInt16\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eUInt32\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt32 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: UInt32 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt32\u0026gt;) -\u003e UInt32\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt32\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e UInt32\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eUInt\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n            \u003cli\u003eKotlin \u003ccode\u003eUInts\u003c/code\u003e are 32 bit\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: UInt \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt\u0026gt;) -\u003e UInt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e UInt\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e🟢\u003c/td\u003e\n      \u003ctd\u003e\n        \u003cdetails\u003e\n          \u003csummary\u003e\u003ccode\u003eUInt64\u003c/code\u003e\u003c/summary\u003e\n          \u003cul\u003e\n\u003cli\u003e\u003ccode\u003estatic var min: UInt64 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic var max: UInt64 \u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt64\u0026gt;) -\u003e UInt64\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatic func random(in range: Range\u0026lt;UInt64\u0026gt;, using gen: inout RandomNumberGenerator) -\u003e UInt64\u003c/code\u003e\u003c/li\u003e\n          \u003c/ul\u003e\n        \u003c/details\u003e \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ewithDiscardingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ewithTaskCancellationHandler\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ewithThrowingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ewithThrowingDiscardingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003ctd\u003e✅\u003c/td\u003e\n      \u003ctd\u003e\u003ccode\u003ewithThrowingTaskGroup\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\n## Topics\n\n### Collections\n\nCollections are perhaps the most complex part of the Swift standard library, and of SkipLib. Swift's comprehensive collection protocols allow `Array`, `Set`, `Dictionary`, `String`, and other types to all share a common set of API, including iteration, `map`, `reduce`, and much more.\n\nCorresponding Kotlin types - `List`, `Set`, `Map`, `String`, etc - do not share a similarly rich API set. As a result, SkipLib must duplicate collection protocol implementations in both `Collections.kt` and `String.kt`, and must duplicate `SetAlgebra` implementations in both `Set.kt` and `OptionSet.kt`.\n\nSee the explanatory comments in `Collections.kt` for more information on the design of SkipLib's internal collections support.\n\n#### Converting between Skip and Kotlin collections\n\nIt is important to note that Skip's `skip.lib.Array` is not the same as a Java/Kotlin `kotlin.Array`, so if you need to pass a Skip array into a Java API that expects a Java-style Array, you need to convert it like so:\n\n```swift\n#if SKIP\nlet skipArray: skip.lib.Array\u003cString\u003e = [\"ABC\", \"DEF\"]\nlet kotlinList: kotlin.collections.List\u003cString\u003e = skipArray.toList()\nlet kotlinArray: kotlin.Array\u003cString\u003e = kotlinList.toTypedArray()\njava.util.Arrays.sort(kotlinArray) // same as a Java array\n#endif\n```\n\n### Codable\n\nSkip is able to synthesize default `Codable` conformance for the Android versions of your Swift types. The Android versions will encode and decode exactly like their Swift source types. Skip also supports your custom `CodingKeys` as well as your custom `encode(to:)` and `init(from:)` functions for encoding and decoding. \n\nThere are, however, a few restrictions:\n\n- Skip cannot synthesize `Codable` conformance for enums that are not `RawRepresentable`. You must implement the required protocol functions yourself.\n- If you implement your own `encode` function or `init(from:)` decoding constructor and you use `CodingKeys`, you must declare your own `CodingKeys` enum. You cannot rely on the synthesized enum.\n- `Array`, `Set`, and `Dictionary` are fully supported, but nesting of these types is limited. So for example Skip can encode and decode `Array\u003cMyCodableType\u003e` and `Dictionary\u003cString, MyCodableType\u003e`, but not `Array\u003cDictionary\u003cString, MyCodableType\u003e\u003e`. Two forms of container nesting **are** currently supported: arrays-of-arrays - e.g. `Array\u003cArray\u003cMyCodableType\u003e\u003e` - and dictionaries-of-array-values - e.g. `Dictionary\u003cString, Array\u003cMyCodableType\u003e\u003e`. In practice, other nesting patters are rare.\n- When calling `decode`, **you must supply a concrete type literal to decode**. This applies to both top-level `Decoders` like `JSONDecoder` as well as containers like `KeyedDecodingContainer`. The following will work:\n\n    ```swift\n    let object = try decoder.decode(MyType.self, from: jsonData) \n    ```\n\n    But these examples will not work:\n\n    ```swift\n    let type = MyType.self\n    let object = try decoder.decode(type, from: jsonData)\n\n    // T is a generic type\n    let object = try decoder.decode(T.self, from: jsonData)\n    ```\n\nIt is common for developers to take advantage of `Decodable`-typed generic functions to be able to decode arbitrary types, so this last limitation is the most onerous. You must consider it when writing your decoding code, and it often requires refactoring existing decoding code being ported to Skip.\n\nOne mechanism to ease this restriction and allow you to decode unknown generic types is to write `inline` decoding functions that take advantage of Kotlin's *reified types*. Inline functions, however, come with their own limitations and tradeoffs. You can read more about this topic in the [Kotlin language documentation](https://kotlinlang.org/docs/inline-functions.html#reified-type-parameters). Skip automatically converts any Swift function with the `@inline(__always)` attribute into a Kotlin inline function with reified generics. \n\nFor example, a function like the following **will work** with Skip, so long as you call it with a concrete `Response` type or with a generic `Response` type from another `inline` function:\n\n```swift\n@inline(__always) public func send\u003cR: Request, Response: Decodable\u003e(request: R) async throws -\u003e Response {\n    let data = try await download(request: request)\n    return try jsonDecoder.decode(Response.self, from: data)\n}\n```\n\nIt transpiles to code like:\n\n```kotlin\ninline suspend fun \u003creified R, reified Response\u003e send(request: R): Response where R: Request, Response: Decodable {\n    val data = download(request = request)\n    return jsonDecoder.decode(Response::class, from = data) \n} \n```\n\n## License\n\nThis software is licensed under the \n[Mozilla Public License 2.0](https://www.mozilla.org/MPL/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskiptools%2Fskip-lib","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskiptools%2Fskip-lib","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskiptools%2Fskip-lib/lists"}