{"id":13439774,"url":"https://github.com/mattgathu/cute","last_synced_at":"2025-12-12T15:36:00.228Z","repository":{"id":57614940,"uuid":"97342172","full_name":"mattgathu/cute","owner":"mattgathu","description":"Macro for Python-esque comprehensions in Rust","archived":false,"fork":false,"pushed_at":"2019-03-30T06:35:55.000Z","size":607,"stargazers_count":336,"open_issues_count":10,"forks_count":9,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-10-07T15:48:05.303Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://mattgathu.github.io/cute","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/mattgathu.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}},"created_at":"2017-07-15T21:02:28.000Z","updated_at":"2024-09-22T00:48:09.000Z","dependencies_parsed_at":"2022-09-11T03:00:47.536Z","dependency_job_id":null,"html_url":"https://github.com/mattgathu/cute","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattgathu%2Fcute","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattgathu%2Fcute/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattgathu%2Fcute/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattgathu%2Fcute/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattgathu","download_url":"https://codeload.github.com/mattgathu/cute/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":221739747,"owners_count":16872782,"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":[],"created_at":"2024-07-31T03:01:16.984Z","updated_at":"2025-12-12T15:35:55.194Z","avatar_url":"https://github.com/mattgathu.png","language":"Rust","funding_links":[],"categories":["Libraries","Rust","库 Libraries","Repository","库"],"sub_categories":["Macro","Macro Macro","宏","宏 Macro"],"readme":"# Cute\n\n[![Build Status](https://travis-ci.org/mattgathu/cute.svg?branch=master)](https://travis-ci.org/mattgathu/cute)\n[![Build status](https://ci.appveyor.com/api/projects/status/pt592bgkx2mkt56m?svg=true)](https://ci.appveyor.com/project/mattgathu/cute)\n[![Crates.io](https://img.shields.io/crates/v/cute.svg)](https://crates.io/crates/cute)\n[![docs.rs](https://docs.rs/cute/badge.svg)](https://docs.rs/cute)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nMacro for Python-esque list comprehensions in Rust.\n\n The `c!` macro implements list and hashmap comprehensions similar to those found in Python,\n allowing for conditionals and nested comprehensions.\n\n # Python Syntax\n\n ```python\n squares = [x*x for x in range(10)]\n\n even_squares = [x*x for x in range(10) if x % 2 == 0]\n\n squares_dict = {key:key*key for key in range(10)}\n ```\n\n # c! Syntax\n\n ```rust\n let squares = c![x*x, for x in 0..10];\n\n let even_squares = c![x*x, for x in 0..10, if x % 2 == 0];\n \n let squares_hashmap = c!{key =\u003e key*key, for key in 0..10};\n\n ```\n\n Note `c!`'s has the comprehension's parts, comma-separated.\n\n # Examples\n\n Simpe comprehension\n\n ```rust\n #[macro_use(c)]\n extern crate cute;\n\n let v = [1,2,3,4];\n let v_squared = c![x*x, for x in v];\n\n ```\n Conditional filtering\n\n ```rust\n let squares = c![x*x, for x in 0..10, if x % 2 == 0];\n assert_eq!(squares, vec![0, 4, 16, 36, 64]);\n ```\n \n Nested Comprehensions\n\n ```rust\n let nested = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]];\n let flat: Vec\u003cusize\u003e = c![x, for x in y, for y in nested];\n assert_eq!(flat, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);\n ``` \n \n ```rust\n let nested = vec![vec![1,2,3], vec![4,5,6], vec![7,8,9]];\n let even_flat: Vec\u003cusize\u003e = c![x, for x in y, for y in nested, if x % 2 == 0];\n assert_eq!(even_flat, vec![2, 4, 6, 8]);\n ```\n\n Comprehensions over Iterators\n\n ```rust\n let vec: Vec\u003ci32\u003e = vec![-4, -2, 0, 2, 4];\n let output: Vec\u003ci32\u003e = c![x*2, for x in vec.iter()];\n assert_eq!(output, vec![-8, -4, 0, 4, 8]);\n ``` \n \n ```rust\n let vec: Vec\u003ci32\u003e = vec![-4, -2, 0, 2, 4];\n let output: Vec\u003ci32\u003e = c![x, for x in vec.iter(), if *x \u003e= 0i32];\n assert_eq!(output, vec![0, 2, 4]);\n ``` \n \n Function Application\n\n ```rust\n let vec: Vec\u003ci32\u003e = vec![-4, -2, 0, 2, 4];\n let output: Vec\u003ci32\u003e = c![x.abs(), for x in vec.iter()];\n assert_eq!(output, vec![4, 2, 0, 2, 4]);\n ```\n\n ```rust\n fn square(x:i32) -\u003e i32 {\n        x*x\n }\n       \n let vec: Vec\u003ci32\u003e = vec![-4, -2, 0, 2, 4];\n let squares: Vec\u003ci32\u003e = c![square(x), for x in vec];\n assert_eq!(squares, vec![16, 4, 0, 4, 16]);\n ```\n \nHashMap Comprehensions (Dictionary Comprehensions)\n\n```rust\n// simple hashmap comprehension\n\nlet squares_hashmap = c!{key =\u003e key*key, for key in 0..10};\n\n```\n\n```rust\n// hashmap comprehension from an Iterator\n// NOTE: we have to perform dereferencing: *key\n\nlet map = c!{*key =\u003e key*key, for key in vec![1,2].iter()};\n\n```\n\n```rust\n// conditional hashmap comprehension\n\nlet v: Vec\u003c(\u0026str, i32)\u003e = vec![(\"one\", 1), (\"two\", 2), (\"three\", 3)];\nlet map = c!{key =\u003e val, for (key, val) in v, if val == 1 || val == 2};\n\nlet mut expected: HashMap\u003c\u0026str, i32\u003e = HashMap::new();\nexpected.insert(\"one\", 1);\nexpected.insert(\"two\", 2);\n\nassert_eq!(map, expected);\n```\n\n```rust\n// conditional hashmap comprehension from an Iterator\n// NOTE: we perform deferencing when using values\n\nlet map = c!{*key =\u003e key*key, for key in vec![1,2].iter(), if *key % 2 == 0};\nlet mut e: HashMap\u003ci32, i32\u003e = HashMap::new();\ne.insert(2, 4);\n\nassert_eq!(map, e);\n```\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattgathu%2Fcute","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattgathu%2Fcute","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattgathu%2Fcute/lists"}