{"id":17717559,"url":"https://github.com/al8n/skl","last_synced_at":"2026-03-16T22:32:40.383Z","repository":{"id":45781394,"uuid":"458729407","full_name":"al8n/skl","owner":"al8n","description":"A lock-free thread-safe concurrent SkipMap implementation based on ARENA skiplist which helps develop MVCC memtable for LSM-Tree.","archived":false,"fork":false,"pushed_at":"2025-02-24T04:03:14.000Z","size":841,"stargazers_count":57,"open_issues_count":5,"forks_count":7,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-02T09:17:04.662Z","etag":null,"topics":["bitcask","bitcask-storage-engine","embedded","inmemory","inmemory-db","key-value","key-value-database","key-value-store","lock-free","memtable","mvcc","rust","skiplist","sstable","thread-safe","write-ahead-log","write-ahead-logging"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/al8n.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE-APACHE","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},"funding":{"github":"al8n","patreon":"al8n","ko_fi":"al8n9434"}},"created_at":"2022-02-13T06:28:10.000Z","updated_at":"2025-03-15T13:03:04.000Z","dependencies_parsed_at":"2024-05-02T19:25:23.847Z","dependency_job_id":"90c07797-e9fc-4f3b-b09c-8dc7c8de2d68","html_url":"https://github.com/al8n/skl","commit_stats":{"total_commits":100,"total_committers":4,"mean_commits":25.0,"dds":"0.030000000000000027","last_synced_commit":"25b1a605c7831979dd4770556151f235bd461856"},"previous_names":["al8n/skl"],"tags_count":7,"template":false,"template_full_name":"al8n/template-rs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al8n%2Fskl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al8n%2Fskl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al8n%2Fskl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al8n%2Fskl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/al8n","download_url":"https://codeload.github.com/al8n/skl/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247234921,"owners_count":20905854,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["bitcask","bitcask-storage-engine","embedded","inmemory","inmemory-db","key-value","key-value-database","key-value-store","lock-free","memtable","mvcc","rust","skiplist","sstable","thread-safe","write-ahead-log","write-ahead-logging"],"created_at":"2024-10-25T14:26:30.134Z","updated_at":"2026-03-16T22:32:40.352Z","avatar_url":"https://github.com/al8n.png","language":"Rust","funding_links":["https://github.com/sponsors/al8n","https://patreon.com/al8n","https://ko-fi.com/al8n9434"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n    \u003ch1\u003eSKL\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[\u003cimg alt=\"github\" src=\"https://img.shields.io/badge/github-al8n/skl-8da0cb?style=for-the-badge\u0026logo=Github\" height=\"22\"\u003e][Github-url]\n\u003cimg alt=\"LoC\" src=\"https://img.shields.io/endpoint?url=https%3A%2F%2Fgist.githubusercontent.com%2Fal8n%2F327b2a8aef9003246e45c6e47fe63937%2Fraw%2Fskl\" height=\"22\"\u003e\n[\u003cimg alt=\"Build\" src=\"https://img.shields.io/github/actions/workflow/status/al8n/skl/ci.yml?style=for-the-badge\u0026logo=Github-Actions\u0026label=CI\" height=\"22\"\u003e][CI-url]\n[\u003cimg alt=\"codecov\" src=\"https://img.shields.io/codecov/c/gh/al8n/skl?style=for-the-badge\u0026token=aek5JwyaAZ\u0026logo=codecov\" height=\"22\"\u003e][codecov-url]\n\n[\u003cimg alt=\"docs.rs\" src=\"https://img.shields.io/badge/docs.rs-skl-66c2a5?style=for-the-badge\u0026labelColor=555555\u0026logo=data:image/svg+xml;base64,PHN2ZyByb2xlPSJpbWciIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoIGZpbGw9IiNmNWY1ZjUiIGQ9Ik00ODguNiAyNTAuMkwzOTIgMjE0VjEwNS41YzAtMTUtOS4zLTI4LjQtMjMuNC0zMy43bC0xMDAtMzcuNWMtOC4xLTMuMS0xNy4xLTMuMS0yNS4zIDBsLTEwMCAzNy41Yy0xNC4xIDUuMy0yMy40IDE4LjctMjMuNCAzMy43VjIxNGwtOTYuNiAzNi4yQzkuMyAyNTUuNSAwIDI2OC45IDAgMjgzLjlWMzk0YzAgMTMuNiA3LjcgMjYuMSAxOS45IDMyLjJsMTAwIDUwYzEwLjEgNS4xIDIyLjEgNS4xIDMyLjIgMGwxMDMuOS01MiAxMDMuOSA1MmMxMC4xIDUuMSAyMi4xIDUuMSAzMi4yIDBsMTAwLTUwYzEyLjItNi4xIDE5LjktMTguNiAxOS45LTMyLjJWMjgzLjljMC0xNS05LjMtMjguNC0yMy40LTMzLjd6TTM1OCAyMTQuOGwtODUgMzEuOXYtNjguMmw4NS0zN3Y3My4zek0xNTQgMTA0LjFsMTAyLTM4LjIgMTAyIDM4LjJ2LjZsLTEwMiA0MS40LTEwMi00MS40di0uNnptODQgMjkxLjFsLTg1IDQyLjV2LTc5LjFsODUtMzguOHY3NS40em0wLTExMmwtMTAyIDQxLjQtMTAyLTQxLjR2LS42bDEwMi0zOC4yIDEwMiAzOC4ydi42em0yNDAgMTEybC04NSA0Mi41di03OS4xbDg1LTM4Ljh2NzUuNHptMC0xMTJsLTEwMiA0MS40LTEwMi00MS40di0uNmwxMDItMzguMiAxMDIgMzguMnYuNnoiPjwvcGF0aD48L3N2Zz4K\" height=\"20\"\u003e][doc-url]\n[\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/v/skl?style=for-the-badge\u0026logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPg0KPHN2ZyB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4PSIwcHgiIHk9IjBweCINCgkgdmlld0JveD0iMCAwIDUxMiA1MTIiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPGc+DQoJPGc+DQoJCTxwYXRoIGQ9Ik0yNTYsMEwzMS41MjgsMTEyLjIzNnYyODcuNTI4TDI1Niw1MTJsMjI0LjQ3Mi0xMTIuMjM2VjExMi4yMzZMMjU2LDB6IE0yMzQuMjc3LDQ1Mi41NjRMNzQuOTc0LDM3Mi45MTNWMTYwLjgxDQoJCQlsMTU5LjMwMyw3OS42NTFWNDUyLjU2NHogTTEwMS44MjYsMTI1LjY2MkwyNTYsNDguNTc2bDE1NC4xNzQsNzcuMDg3TDI1NiwyMDIuNzQ5TDEwMS44MjYsMTI1LjY2MnogTTQzNy4wMjYsMzcyLjkxMw0KCQkJbC0xNTkuMzAzLDc5LjY1MVYyNDAuNDYxbDE1OS4zMDMtNzkuNjUxVjM3Mi45MTN6IiBmaWxsPSIjRkZGIi8+DQoJPC9nPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPGc+DQo8L2c+DQo8Zz4NCjwvZz4NCjxnPg0KPC9nPg0KPC9zdmc+DQo=\" height=\"22\"\u003e][crates-url]\n[\u003cimg alt=\"crates.io\" src=\"https://img.shields.io/crates/d/skl?color=critical\u0026logo=data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNjQ1MTE3MzMyOTU5IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjM0MjEiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3guNzc4MTA2OS4wLmkzIiB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIj48ZGVmcz48c3R5bGUgdHlwZT0idGV4dC9jc3MiPjwvc3R5bGU+PC9kZWZzPjxwYXRoIGQ9Ik00NjkuMzEyIDU3MC4yNHYtMjU2aDg1LjM3NnYyNTZoMTI4TDUxMiA3NTYuMjg4IDM0MS4zMTIgNTcwLjI0aDEyOHpNMTAyNCA2NDAuMTI4QzEwMjQgNzgyLjkxMiA5MTkuODcyIDg5NiA3ODcuNjQ4IDg5NmgtNTEyQzEyMy45MDQgODk2IDAgNzYxLjYgMCA1OTcuNTA0IDAgNDUxLjk2OCA5NC42NTYgMzMxLjUyIDIyNi40MzIgMzAyLjk3NiAyODQuMTYgMTk1LjQ1NiAzOTEuODA4IDEyOCA1MTIgMTI4YzE1Mi4zMiAwIDI4Mi4xMTIgMTA4LjQxNiAzMjMuMzkyIDI2MS4xMkM5NDEuODg4IDQxMy40NCAxMDI0IDUxOS4wNCAxMDI0IDY0MC4xOTJ6IG0tMjU5LjItMjA1LjMxMmMtMjQuNDQ4LTEyOS4wMjQtMTI4Ljg5Ni0yMjIuNzItMjUyLjgtMjIyLjcyLTk3LjI4IDAtMTgzLjA0IDU3LjM0NC0yMjQuNjQgMTQ3LjQ1NmwtOS4yOCAyMC4yMjQtMjAuOTI4IDIuOTQ0Yy0xMDMuMzYgMTQuNC0xNzguMzY4IDEwNC4zMi0xNzguMzY4IDIxNC43MiAwIDExNy45NTIgODguODMyIDIxNC40IDE5Ni45MjggMjE0LjRoNTEyYzg4LjMyIDAgMTU3LjUwNC03NS4xMzYgMTU3LjUwNC0xNzEuNzEyIDAtODguMDY0LTY1LjkyLTE2NC45MjgtMTQ0Ljk2LTE3MS43NzZsLTI5LjUwNC0yLjU2LTUuODg4LTMwLjk3NnoiIGZpbGw9IiNmZmZmZmYiIHAtaWQ9IjM0MjIiIGRhdGEtc3BtLWFuY2hvci1pZD0iYTMxM3guNzc4MTA2OS4wLmkwIiBjbGFzcz0iIj48L3BhdGg+PC9zdmc+\u0026style=for-the-badge\" height=\"22\"\u003e][crates-url]\n\n\n\u003cimg alt=\"wakatime\" src=\"https://wakatime.com/badge/user/9203ce16-5227-4320-acdb-c8b6135e4730/project/9e07939d-5f12-4f23-bc46-5e1430137b9f.svg?style=for-the-badge\u0026color=e5928d\" height=\"22\"\u003e\n\u003cimg alt=\"license\" src=\"https://img.shields.io/badge/License-Apache%202.0/MIT-blue.svg?style=for-the-badge\u0026fontColor=white\u0026logoColor=f5c076\u0026logo=data:image/svg+xml;base64,PCFET0NUWVBFIHN2ZyBQVUJMSUMgIi0vL1czQy8vRFREIFNWRyAxLjEvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkIj4KDTwhLS0gVXBsb2FkZWQgdG86IFNWRyBSZXBvLCB3d3cuc3ZncmVwby5jb20sIFRyYW5zZm9ybWVkIGJ5OiBTVkcgUmVwbyBNaXhlciBUb29scyAtLT4KPHN2ZyBmaWxsPSIjZmZmZmZmIiBoZWlnaHQ9IjgwMHB4IiB3aWR0aD0iODAwcHgiIHZlcnNpb249IjEuMSIgaWQ9IkNhcGFfMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCAwIDI3Ni43MTUgMjc2LjcxNSIgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgc3Ryb2tlPSIjZmZmZmZmIj4KDTxnIGlkPSJTVkdSZXBvX2JnQ2FycmllciIgc3Ryb2tlLXdpZHRoPSIwIi8+Cg08ZyBpZD0iU1ZHUmVwb190cmFjZXJDYXJyaWVyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KDTxnIGlkPSJTVkdSZXBvX2ljb25DYXJyaWVyIj4gPGc+IDxwYXRoIGQ9Ik0xMzguMzU3LDBDNjIuMDY2LDAsMCw2Mi4wNjYsMCwxMzguMzU3czYyLjA2NiwxMzguMzU3LDEzOC4zNTcsMTM4LjM1N3MxMzguMzU3LTYyLjA2NiwxMzguMzU3LTEzOC4zNTcgUzIxNC42NDgsMCwxMzguMzU3LDB6IE0xMzguMzU3LDI1OC43MTVDNzEuOTkyLDI1OC43MTUsMTgsMjA0LjcyMywxOCwxMzguMzU3UzcxLjk5MiwxOCwxMzguMzU3LDE4IHMxMjAuMzU3LDUzLjk5MiwxMjAuMzU3LDEyMC4zNTdTMjA0LjcyMywyNTguNzE1LDEzOC4zNTcsMjU4LjcxNXoiLz4gPHBhdGggZD0iTTE5NC43OTgsMTYwLjkwM2MtNC4xODgtMi42NzctOS43NTMtMS40NTQtMTIuNDMyLDIuNzMyYy04LjY5NCwxMy41OTMtMjMuNTAzLDIxLjcwOC0zOS42MTQsMjEuNzA4IGMtMjUuOTA4LDAtNDYuOTg1LTIxLjA3OC00Ni45ODUtNDYuOTg2czIxLjA3Ny00Ni45ODYsNDYuOTg1LTQ2Ljk4NmMxNS42MzMsMCwzMC4yLDcuNzQ3LDM4Ljk2OCwyMC43MjMgYzIuNzgyLDQuMTE3LDguMzc1LDUuMjAxLDEyLjQ5NiwyLjQxOGM0LjExOC0yLjc4Miw1LjIwMS04LjM3NywyLjQxOC0xMi40OTZjLTEyLjExOC0xNy45MzctMzIuMjYyLTI4LjY0NS01My44ODItMjguNjQ1IGMtMzUuODMzLDAtNjQuOTg1LDI5LjE1Mi02NC45ODUsNjQuOTg2czI5LjE1Miw2NC45ODYsNjQuOTg1LDY0Ljk4NmMyMi4yODEsMCw0Mi43NTktMTEuMjE4LDU0Ljc3OC0zMC4wMDkgQzIwMC4yMDgsMTY5LjE0NywxOTguOTg1LDE2My41ODIsMTk0Ljc5OCwxNjAuOTAzeiIvPiA8L2c+IDwvZz4KDTwvc3ZnPg==\" height=\"22\"\u003e\n\n1. A lock-free thread-safe concurrent `SkipMap` implementation based on ARENA skiplist which helps develop MVCC memtable for LSM-Tree.\n2. A lock-free thread-safe concurrent memory map based on-disk `SkipMap`.\n\n\u003c/div\u003e\n\n## Installation\n\n- Only use heap backend (suppport `no_std`)\n  \n    ```toml\n    [dependencies]\n    skl = \"0.22\"\n    ```\n\n- Enable memory map backend\n\n    ```toml\n    [dependencies]\n    skl = { version = \"0.22\", features = [\"memmap\"] }\n    ```\n\n## Features\n\n- **MVCC and 3D access**: Builtin MVCC (multiple versioning concurrency control) and key-value-version access support.\n- **Customable Statefull Comparator**: Not limited by `Borrow` and the stateless comparator like `HashMap` or `BTreeMap`, `SkipMap` supports statefull custom comparators.\n- **Multiple Maps**: Users can create multiple `SkipMap`s on the same ARENA.\n- **Lock-free and Concurrent-Safe:** `SkipMap` provide lock-free operations, ensuring efficient concurrent access without the need for explicit locking mechanisms.\n- **Extensible for Key-Value Database Developers:** Designed as a low-level crate, `SkipMap` offer a flexible foundation for key-value database developers. You can easily build your own memtable or durable storage using these structures.\n- **Memory Efficiency:** These data structures are optimized for minimal memory overhead. They operate around references, avoiding unnecessary allocations and deep copies, which can be crucial for efficient memory usage.\n  - **Segment tracker:** Builtin segment recollection support, a lock-free freelist helps reuse free segments.\n  - **Prefix compression:**\n    - Same key will only be stored once.\n    - Keys with common prefix will be stored once (longest one must be inserted first).\n    - (experimental) Keys are sub-slice of negeibours will be stored once (require `CompressionPolicy::High`).\n  - **Discard tracker:** Builtin discard tracker, which will track discarded bytes to help end-users decide when to compact or rewrite.\n- **Efficient Iteration:** Enjoy fast forward and backward iteration through the elements in your `SkipMap`. Additionally, bounded iterators are supported, allowing you to traverse only a specified range of elements efficiently.\n- **Snapshot Support:** Create snapshots of your `SkipMap`, offering a read-only view of the contents at a specific moment in time. Snapshots provide a consistent view of the data, enabling implementations of transactional semantics and other use cases where data consistency is crucial.\n- **Memory Management Options:**\n  - **Heap Allocation:** Memory allocation is handled by Rust's allocator, ensuring all data resides in RAM.\n  - **Mmap:** Data can be mapped to a disk file by the operating system, making it suitable for durable storage.\n  - **Mmap Anonymous:** Mapped to anonymous memory (virtual memory) by the OS, ideal for large in-memory memtables, optimizing memory utilization.\n\n## Examples\n\nPlease see [examples](https://github.com/al8n/skl/tree/main/examples) folder for more details.\n\n## Q \u0026 A\n\n- Does the on-disk version `SkipMap` ensure crash safety or power failure resilience?\n  \n  No, If you really need a crash safe, power failure resilience, concurrent-safe and durable ordered write-ahead log implementation,\n  see [`orderwal`](https://github.com/al8n/orderwal) project.\n  \n  On-disk version `SkipMap` does not ensure crash safety or power failure resilience. Hence, it is not recommended to directly\n  use the `SkipMap` as a durable database. It is recommended to use the on-disk version `SkipMap` as a final frozen file for quick lookup.\n\n## Related projects\n\n- [`aol`](https://github.com/al8n/aol): Yet another generic purpose, append-only write-ahead log implementation.\n- [`orderwal`](https://github.com/al8n/orderwal): A generic-purpose, atomic, ordered, zero-copy, concurrent-safe, pre-allocate style (memory map) write-ahead-log for developing databases.\n\n## Tests\n\n- `test`:\n\n    ```sh\n    cargo test --all-features\n    ```\n\n- `miri` (Stack Borrows)\n\n    ```sh\n    MIRIFLAGS=\"-Zmiri-strict-provenance -Zmiri-disable-isolation -Zmiri-symbolic-alignment-check\" \\\n    RUSTFLAGS = \"--cfg all_skl_tests\" \\\n    cargo miri test --all-features\n    ```\n\n- `miri` (Tree Borrows)\n\n    ```sh\n    MIRIFLAGS=\"-Zmiri-strict-provenance -Zmiri-disable-isolation -Zmiri-symbolic-alignment-check -Zmiri-tree-borrows\" \\\n    RUSTFLAGS = \"--cfg all_skl_tests\" \\\n    cargo miri test --all-features\n    ```\n\n## Support Platforms\n\nSee `cross` section in [GitHub CI file](https://github.com/al8n/skl/blob/main/.github/workflows/ci.yml#L69).\n\n## Pedigree\n\nThis code is inspired and modified based on Cockroachdb's pebble arenaskl and Dgraph's badger skl code:\n\nhttps://github.com/cockroachdb/pebble/tree/master/internal/arenaskl\n\nhttps://github.com/dgraph-io/badger/tree/master/skl\n\nThe pebble's arenaskl code is based on Andy Kimball's arenaskl code:\n\nhttps://github.com/andy-kimball/arenaskl\n\nThe arenaskl code is based on the skiplist found in Badger, a Go-based\nKV store:\n\nhttps://github.com/dgraph-io/badger/tree/master/skl\n\nThe skiplist in Badger is itself based on a C++ skiplist built for\nFacebook's RocksDB:\n\nhttps://github.com/facebook/rocksdb/tree/master/memtable\n\n#### License\n\n`skl` is under the terms of both the MIT license and the\nApache License (Version 2.0).\n\nSee [LICENSE-APACHE](LICENSE-APACHE), [LICENSE-MIT](LICENSE-MIT) for details.\n\nCopyright (c) 2022 Al Liu.\n\n[Github-url]: https://github.com/al8n/skl/\n[CI-url]: https://github.com/al8n/skl/actions/workflows/ci.yml\n[doc-url]: https://docs.rs/skl\n[crates-url]: https://crates.io/crates/skl\n[codecov-url]: https://app.codecov.io/gh/al8n/skl/\n[rustc-url]: https://github.com/rust-lang/rust/blob/master/RELEASES.md\n[license-apache-url]: https://opensource.org/licenses/Apache-2.0\n[license-mit-url]: https://opensource.org/licenses/MIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fal8n%2Fskl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fal8n%2Fskl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fal8n%2Fskl/lists"}