{"id":23335950,"url":"https://github.com/libsugar/tuplers","last_synced_at":"2025-04-09T20:52:09.925Z","repository":{"id":37930620,"uuid":"310514459","full_name":"libsugar/tuplers","owner":"libsugar","description":"Provides many useful tools related to tuples","archived":false,"fork":false,"pushed_at":"2024-11-29T05:28:07.000Z","size":340,"stargazers_count":18,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-21T10:53:45.750Z","etag":null,"topics":["no-std","rust-patterns","tuple","tuples","utils"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/tuples","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/libsugar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2020-11-06T06:44:22.000Z","updated_at":"2024-12-20T18:31:34.000Z","dependencies_parsed_at":"2024-11-17T23:31:11.435Z","dependency_job_id":null,"html_url":"https://github.com/libsugar/tuplers","commit_stats":{"total_commits":45,"total_committers":4,"mean_commits":11.25,"dds":0.4,"last_synced_commit":"69a4aa5f39fe22f9206c0bba754a67e47b753b0a"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libsugar%2Ftuplers","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libsugar%2Ftuplers/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libsugar%2Ftuplers/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/libsugar%2Ftuplers/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/libsugar","download_url":"https://codeload.github.com/libsugar/tuplers/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248111959,"owners_count":21049577,"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":["no-std","rust-patterns","tuple","tuples","utils"],"created_at":"2024-12-21T02:11:28.479Z","updated_at":"2025-04-09T20:52:09.880Z","avatar_url":"https://github.com/libsugar.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tuples\n\n![Rust](https://github.com/libsugar/tuplers/workflows/Rust/badge.svg)\n[![version](https://img.shields.io/crates/v/tuples)](https://crates.io/crates/tuples)\n[![documentation](https://docs.rs/tuples/badge.svg)](https://docs.rs/tuples)\n![LICENSE](https://img.shields.io/crates/l/tuples)\n\nProvides many useful tools related to tuples\n\n- Support no-std\n- Support wasm\n- Pre-generated, faster compilation\n- AsRef\n- AsMut\n- AsOption\n- AsResult\n- AsDeref\n- AsDerefMut\n- TupleGet\n- Transpose Option\n- Transpose Result\n- Cloned\n- Copied\n- Flatten\n- Combin\n- Split\n- Mapping\n- Iter\n- IntoIter\n- FromIter\n- Collect\n- Meta Trait\n- Shorthand Macro\n- Call\n- Apply\n- Swap\n- Sort\n- Permutations\n- Combinations\n\n## Examples\n\n- map\n\n  ```rust\n  let a = (1, 2, 3);\n  let b = a.map(|v| v * 3);\n  assert_eq!(b, (3, 6, 9));\n  ```\n\n- mapN\n\n  ```rust\n  let a = (1, 2, 3, 4, 5);\n  let b = a.map3(|v| v * 5);\n  assert_eq!(b, (1, 2, 3, 20, 5));\n  ```\n\n- map_all\n\n  ```rust\n  let a = (1, 2, 3);\n  let b = a.map_all(|v| v * 10, |v| v * 100, |v| v * 1000);\n  assert_eq!(b, (10, 200, 3000));\n  ```\n\n- as_ref\n\n  ```rust\n  let t = (5, 6, 7);\n  let (a, b, c) = t.as_ref();\n  assert_eq!(*a, 5);\n  assert_eq!(*b, 6);\n  assert_eq!(*c, 7);\n  ```\n\n- cloned\n\n  ```rust\n  let a = (\u00261, \u00262, \u00263);\n  let b = a.cloned();\n  assert_eq!(b, (1, 2, 3))\n  ```\n\n- flatten\n\n  ```rust\n  let a = ((1, 2, 3), (4, 5, 6), (7, 8, 9));\n  let b = a.flatten();\n  assert_eq!(b, (1, 2, 3, 4, 5, 6, 7, 8, 9));\n  ```\n\n- meta\n\n  ```rust\n  let a = (1, 2, 3, 4, 5);\n  assert_eq!(a.arity(), 5);\n\n  let b = ();\n  assert_eq!(b.arity(), 0);\n  ```\n\n- get\n\n  ```rust\n  let a = (1, 2, 3, 4, 5);\n  assert_eq!(*a.get(2), 3);\n\n  let mut a = (1, 2, 3, 4, 5);\n  *a.get_mut(3) = 6;\n  ```\n\n- iter\n\n  ```rust\n  let a = (1, 2, 3)\n      .into_iter()\n      .map(|v| v * 3)\n      .collect_tuple::\u003ctuple![3;]\u003e();\n  let b: (i32, i32, i32) = (3, 6, 9);\n  assert_eq!(a, b);\n  ```\n\n  ```rust\n  let a = (1, 2, 3)\n      .into_iter()\n      .map(|v| v * 3)\n      .try_collect_tuple::\u003ctuple![3;]\u003e();\n  let b: Option\u003c(i32, i32, i32)\u003e = Some((3, 6, 9));\n  assert_eq!(a, b);\n  ```\n\n  ```rust\n  let a = (1, 2, 3)\n      .into_iter()\n      .map(|v| v * 3)\n      .collect_tuple_try::\u003ctuple![3;]\u003e();\n  let b: (Option\u003ci32\u003e, Option\u003ci32\u003e, Option\u003ci32\u003e) = (Some(3), Some(6), Some(9));\n  assert_eq!(a, b);\n  ```\n\n- transpose\n\n  ```rust\n  let a = Some((1, 2, 3)).transpose();\n  assert_eq!(a, (Some(1), Some(2), Some(3)));\n\n  let b = (Some(1), Some(2), Some(3)).transpose();\n  assert_eq!(b, Some((1, 2, 3)));\n  ```\n\n  ```rust\n  let a: (Result\u003cu8, ()\u003e, Result\u003cu8, ()\u003e, Result\u003cu8, ()\u003e) = (Ok(1), Ok(2), Ok(3));\n  let b: Result\u003c(u8, u8, u8), ()\u003e = a.transpose();\n  assert_eq!(b, Ok((1, 2, 3)));\n  ```\n\n  ```rust\n  let a: (Result\u003cu8, i16\u003e, Result\u003cu8, i32\u003e, Result\u003cu8, i64\u003e) = (Ok(1), Err(-1), Ok(3));\n  let b: Result\u003c(u8, u8, u8), i64\u003e = a.transpose();\n  assert_eq!(b, Err(-1));\n  ```\n\n  ```rust\n  let a: (Result\u003cu8, i16\u003e, Result\u003cu8, i32\u003e, Result\u003cu8, i64\u003e) = (Ok(1), Err(-1), Ok(3));\n  let b = a.transpose1::\u003ci64\u003e();\n  assert_eq!(b, Err(-1));\n  ```\n\n- combin\n\n  ```rust\n  let a = (1, 2).push_right(3);\n  assert_eq!(a, (1, 2, 3));\n\n  let b = (2, 1).push_left(3);\n  assert_eq!(b, (3, 2, 1));\n\n  let c = (1, 2, 3).concat((4, 5, 6));\n  assert_eq!(c, (1, 2, 3, 4, 5, 6))\n  ```\n\n- split\n\n  - split_parts\n\n    ```rust\n    let t = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);\n\n    let a = t.split_2_parts();\n    assert_eq!(a, ((0, 1, 2, 3, 4), (5, 6, 7, 8, 9)));\n\n    let b = t.split_3_parts();\n    assert_eq!(b, ((0, 1, 2, 3), (4, 5, 6), (7, 8, 9)));\n\n    let c = t.split_4_parts();\n    assert_eq!(c, ((0, 1, 2), (3, 4, 5), (6, 7), (8, 9)));\n\n    let d = t.split_5_parts();\n    assert_eq!(d, ((0, 1), (2, 3), (4, 5), (6, 7), (8, 9)));\n    ```\n\n  - split_at\n\n    ```rust\n    let t = (1, 2, 3, 4, 5, 6);\n\n    let a = t.split_at_1();\n    assert_eq!(a, (1, (2, 3, 4, 5, 6)));\n\n    let b = t.split_at_3();\n    assert_eq!(b, ((1, 2, 3), (4, 5, 6)));\n\n    let c = t.split_at_5();\n    assert_eq!(c, ((1, 2, 3, 4, 5), 6));\n    ```\n\n  - split_by\n\n    ```rust\n    let t = (1, 2, 3, 4, 5, 6);\n    let t2 = (1, 2, 3, 4, 5);\n\n    let a = t.split_by_2();\n    assert_eq!(a, ((1, 2), (3, 4), (5, 6)));\n\n    let b = t2.split_by_2();\n    assert_eq!(b, ((1, 2), (3, 4), 5));\n\n    let c = t.split_by_3();\n    assert_eq!(c, ((1, 2, 3), (4, 5, 6)));\n\n    let d = t2.split_by_3();\n    assert_eq!(d, ((1, 2, 3), (4, 5)));\n\n    let e = t.split_by_6();\n    assert_eq!(e, ((1, 2, 3, 4, 5, 6)));\n    ```\n\n  - split_to_tuple_at\n\n    ```rust\n    let t = (1, 2, 3, 4, 5, 6);\n\n    let a = t.split_to_tuple_at_1();\n    assert_eq!(a, ((1,), (2, 3, 4, 5, 6)));\n\n    let b = t.split_to_tuple_at_3();\n    assert_eq!(b, ((1, 2, 3), (4, 5, 6)));\n\n    let c = t.split_to_tuple_at_5();\n    assert_eq!(c, ((1, 2, 3, 4, 5), (6,)));\n    ```\n\n  - split_to_tuple_by\n\n    ```rust\n    let t = (1, 2, 3, 4, 5, 6);\n    let t2 = (1, 2, 3, 4, 5);\n\n    let a = t.split_to_tuple_by_2();\n    assert_eq!(a, ((1, 2), (3, 4), (5, 6)));\n\n    let b = t2.split_to_tuple_by_2();\n    assert_eq!(b, ((1, 2), (3, 4), (5,)));\n\n    let c = t.split_to_tuple_by_3();\n    assert_eq!(c, ((1, 2, 3), (4, 5, 6)));\n\n    let d = t2.split_to_tuple_by_3();\n    assert_eq!(d, ((1, 2, 3), (4, 5)));\n\n    let e = t.split_to_tuple_by_6();\n    assert_eq!(e, (((1, 2, 3, 4, 5, 6),)));\n    ```\n\n- call\n\n  ```rust\n  let r = (1, 2, 3).call(|a, b, c| a + b + c);\n  assert_eq!(r, 6);\n  ```\n\n- apply\n\n  ```rust\n  let a = (1, 2, 3);\n  fn foo(a: i32, b: i32, c: i32) -\u003e i32 {\n      a + b + c\n  }\n  let r = foo.apply_tuple(a);\n  assert_eq!(r, 6)\n  ```\n\n- swap\n\n  ```rust\n  let mut a = (1, 2, 3, 4, 5);\n  a.swap(1, 3);\n  assert_eq!(a, (1, 4, 3, 2, 5));\n  ```\n\n- swap_n\n\n  **Not enabled by default**\n\n  ```toml\n  features = [\"tuple_swap_n\"]\n  ```\n\n  ```rust\n  let mut a = (1, 2, 3, 4, 5);\n  a.swap_1_3();\n  assert_eq!(a, (1, 4, 3, 2, 5));\n  ```\n\n- sort\n\n  Currently implemented sorting algorithm\n\n  - selection sort (default alias)\n\n  ***\n\n  - sort\n\n    ```rust\n    let mut a = (6, 2, 6, 8, 0, 5);\n    a.sort();\n    assert_eq!(a, (0, 2, 5, 6, 6, 8))\n    ```\n\n  - sort_desc\n\n    ```rust\n    let mut a = (6, 2, 6, 8, 0, 5);\n    a.sort_desc();\n    assert_eq!(a, (8, 6, 6, 5, 2, 0))\n    ```\n\n  - sort_by\n\n    ```rust\n    let mut a = (6, 2, 6, 8, 0, 5);\n    a.sort_by(|a, b|\n        if a \u003e b { core::cmp::Ordering::Less }\n        else { core::cmp::Ordering::Greater }\n    );\n    assert_eq!(a, (0, 2, 5, 6, 6, 8))\n    ```\n\n  - sort_by_key\n\n    ```rust\n    let mut a = ((6, 2), (6, 8), (0, 5));\n    a.sort_by_key(|a| a.1);\n    assert_eq!(a, ((6, 2), (0, 5), (6, 8)))\n    ```\n\n  - sort_by_key_desc\n\n    ```rust\n    let mut a = ((6, 2), (6, 8), (0, 5));\n    a.sort_by_key_desc(|a| a.1);\n    assert_eq!(a, ((6, 8), (0, 5), (6, 2)))\n    ```\n\n  ***\n\n  - sorted / sorted_xx\n\n    Variants of Transferring Ownership\n\n    ```rust\n    let a = (6, 2, 6, 8, 0, 5);\n    let a = a.sorted();\n    assert_eq!(a, (0, 2, 5, 6, 6, 8))\n    ```\n\n- permutations\n\n  ```rust\n  let a = (1, '2', \"3\");\n  let r = a.permutations_2();\n  assert_eq!(r, ((1, '2'), (1, \"3\"), ('2', 1), ('2', \"3\"), (\"3\", 1), (\"3\", '2')));\n  ```\n\n- combinations\n\n  ```rust\n  let a = (1, '2', \"3\", 4.0);\n  let r = a.combinations_2();\n  assert_eq!(r, ((1, '2'), (1, \"3\"), (1, 4.0), ('2', \"3\"), ('2', 4.0), (\"3\", 4.0)));\n  ```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibsugar%2Ftuplers","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibsugar%2Ftuplers","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibsugar%2Ftuplers/lists"}