{"id":3022,"url":"https://github.com/ankurp/Cent","last_synced_at":"2025-08-03T12:31:53.662Z","repository":{"id":56905752,"uuid":"51703963","full_name":"ankurp/Cent","owner":"ankurp","description":"Extensions for Swift Standard Types and Classes","archived":false,"fork":false,"pushed_at":"2023-01-12T20:24:36.000Z","size":100,"stargazers_count":227,"open_issues_count":6,"forks_count":39,"subscribers_count":13,"default_branch":"master","last_synced_at":"2024-05-29T17:50:14.095Z","etag":null,"topics":["dictionary-extensions","range-extensions","swift","xcode"],"latest_commit_sha":null,"homepage":"https://www.dollarswift.org#cent-usage","language":"Swift","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/ankurp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-02-14T17:08:03.000Z","updated_at":"2024-05-28T12:11:08.000Z","dependencies_parsed_at":"2023-02-09T13:16:18.887Z","dependency_job_id":null,"html_url":"https://github.com/ankurp/Cent","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ankurp%2FCent","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ankurp%2FCent/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ankurp%2FCent/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ankurp%2FCent/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ankurp","download_url":"https://codeload.github.com/ankurp/Cent/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228543250,"owners_count":17934450,"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":["dictionary-extensions","range-extensions","swift","xcode"],"created_at":"2024-01-05T20:16:29.198Z","updated_at":"2024-12-07T00:31:12.152Z","avatar_url":"https://github.com/ankurp.png","language":"Swift","funding_links":[],"categories":["Utility"],"sub_categories":["Web View","Other free courses"],"readme":"Cent [![Build Status](https://travis-ci.org/ankurp/Cent.svg?branch=master)](https://travis-ci.org/ankurp/Cent) ![CocoaPods](https://img.shields.io/cocoapods/v/Cent.svg)\n===========\n[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/ankurp/Dollar?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n\nCent is a library that extends certain Swift object types using the extension feature and gives its two cents to Swift language.\n\n[Dollar](https://github.com/ankurp/Dollar) is a Swift library that provides useful functional programming helper methods without extending any built in objects. It is similar to [Lo-Dash](https://lodash.com) or [Underscore.js](http://underscorejs.org) in Javascript.\n\n## Contents ##\n\n- [Setup](#setup)\n- [API Documentation](http://www.dollarswift.org)\n- [Usage](#cent-usage)\n  - [Array](#array-extensions)\n  - [Date](#date-extensions)  \n  - [Dictionary](#dictionary-extensions)\n  - [Int](#int-extensions)\n  - [String](#string-extensions)\n  - [Range](#range-extensions)\n- [Contributing](#contributing)\n\n# Setup #\n\n## Using [cocoapods](http://cocoapods.org/) version 0.36.x or greater\n\nAdd `pod 'Cent'` to your `Podfile` and run `pod install`. Add `use_frameworks!` to the end of the `Podfile`. Requires cocoapod version 0.36.x or greater.\n\n## Using [Swift Package Manager](https://github.com/apple/swift-package-manager)\n\nAdd the following dependency `.Package(url: \"https://github.com/ankurp/Cent\", majorVersion: 6, minor: 0)` to your `Package.swift` file and then run `swift build`. Requires swift version 2.2 or greater that you can install from https://swift.org\n\n## Using `git submodule`\n\n1. If you are using git then add Cent as a submodule using `git submodule add https://github.com/ankurp/Cent.git`. If not using git download the project using `git clone https://github.com/ankurp/Cent.git` in your project folder.\n2. Open the `Cent` folder. Drag Cent.xcodeproj, inside the Cent folder, into the file navigator of your Xcode project.\n3. In Xcode, navigate to the target configuration window by clicking on the blue project icon, and selecting the application target under the \"Targets\" heading in the sidebar.\n4. In the tab bar at the top of that window, open the \"Build Phases\" panel.\n5. Expand the \"Link Binary with Libraries\" group, and add Cent.framework.\n6. In your project file `import Cent` and you can call all of the helper functions.\n\n## Support for Xcode and Swift\n\n* For Xcode 9 (Swift 4) user version `7.0.0`\n* For Xcode 8 (Swift 3) user version `6.0.4`\n* For Xcode 7 (Swift 2) use version `4.1.0` or `5.2.0`\n* For Xcode 6.3 (Swift 1.2) use version `3.0.3`\n* For Xcode 6.1 and 6.2 (Swift 1.1) use version `2.2.0`\n\n## Communication ##\n\n- If you **need help**, use [gitter.im](https://gitter.im/ankurp/Dollar) or post a question on [Stack Overflow](http://stackoverflow.com/questions/tagged/dollar.swift) with tag `dollar.swift`.\n- If you'd like to **ask a general question**, use [Stack Overflow](http://stackoverflow.com/questions/tagged/dollar.swift).\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n\n# Cent Usage #\n\n## Array Extensions ##\n\n### `\u003c\u003c elem: Element -\u003e [Element]`\n\nOverloaded operator to append element to an array or append elements from another array into the first array. Return array with the element appended in the end.\n\n```swift\nvar array = [1, 2, 3]\narray \u003c\u003c 4\n=\u003e [1, 2, 3, 4]\narray \u003c\u003c [5, 6]\n=\u003e [1, 2, 3, 4, 5, 6]\n```\n\n### `at(indexes: Int...) -\u003e [Element]`\n\nCreates an array of elements from the specified indexes, or keys, of the collection.\n\n```swift\nlet array = [\"foo\", \"spam\", \"bar\", \"eggs\"]\nlet some = array.at(1, 3)\n=\u003e [\"spam\", \"eggs\"]\n```\n\n### `each(callback: (Element) -\u003e ()) -\u003e [Element]`\n\nFor each item in the array invoke the callback by passing the elem\n\n```swift\nlet array = [\"foo\", \"spam\", \"bar\", \"eggs\"]\narray.each {\n  print($0)\n}\n=\u003e [\"foo\", \"spam\", \"bar\", \"eggs\"]\n```\n\n### `eachWithIndex(callback: (Int, Element) -\u003e ()) -\u003e [Element]`\n\nFor each item in the array invoke the callback by passing the elem along with the index\n\n```swift\nlet array = [\"foo\", \"spam\", \"bar\", \"eggs\"]\narray.each { (index, elem)\n  print(\"\\(index) - \\(elem)\")\n}\n=\u003e [\"foo\", \"spam\", \"bar\", \"eggs\"]\n```\n\n### `cycle\u003cU\u003e(times: Int, callback: (Element) -\u003e U)`\n\nCycles through the array definetly or indefinetly passing each element into the callback function. The second parameter is to specify how many times to cycle through the array. If left out it will cycle indefinetly.\n\n```swift\n[1, 2, 3].cycle(2) {\n  print($0)\n}\n// Prints the following\n123123\n\n[1, 2, 3].cycle {\n  print($0)\n}\n// Cycles in an infinite loop\n```\n\n### `every(callback: (Element) -\u003e Bool) -\u003e Bool`\n\nChecks if the given callback returns true value for all items in the array.\n\n```swift\n[\"angry\", \"hungry\"].every { (a: String) -\u003e (Bool) in \n  a.hasSuffix(\"gry\") \n}\n=\u003e true\n```\n\n### `indexOf\u003cT: Equatable\u003e(value: T) -\u003e Int`\n\nGets the index at which the first occurrence of value is found.\n\n```swift\nlet array = [\"foo\", \"spam\", \"bar\", \"eggs\"]\narray.indexOf(\"spam\")\n=\u003e 1\narray.indexOf(\"None\")\n=\u003e nil\n```\n\n### `fetch(index: Int, orElse: T? = .None) -\u003e T!`\n\nGet element from an array at the given index which can be negative to find elements from the end of the array. A default value can be returned if indexing out of bounds.\n\n\n```swift\nlet arr = [1, 2, 3, 4, 5, 6, 7, 8]\narr.fetch(100)\n=\u003e nil\n\narr.fetch(100, orElse: 42)\n=\u003e 42\n\narr.fetch(-1)\n=\u003e 8\n```\n\n### `findIndex(callback: (Element) -\u003e Bool) -\u003e Int?`\n\nThis method is like find except that it returns the index of the first element that passes the callback check.\n\n```swift\nlet ind: int? = [\"foo\", \"bar\", \"spam\", \"eggs\"].findIndex {\n  $0.length == 4\n}\nind! == 2 \n=\u003e true\n```\n\n### `findLastIndex(callback: (Element) -\u003e Bool) -\u003e Int?`\n\nThis method is like findIndex except that it iterates over elements of the array from right to left.\n\n```swift\nlet ind: int? = [\"foo\", \"bar\", \"spam\", \"eggs\"].findLastIndex {\n  $0.length == 4 \n}\nind! == 3 \n=\u003e true\n```\n\n### `first() -\u003e Element?`\n\nGets the first element in the array.\n\n```swift\nlet first = [\"foo\", \"bar\"].first()\n=\u003e \"foo\"\n```\n\n### `flatten() -\u003e [Element]`\n\nFlattens a nested array of any depth.\n\n```swift\nlet unFlattened = [\"foo\", [\"bar\"], [[\"spam\"]], [[[\"eggs\"]]] ]\nlet flattened = unFlattened.flatten() \n=\u003e [\"foo\", \"bar\", \"spam\", \"eggs\"]\n```\n\n### `get(index: Int) -\u003e Element?`\n\nGet element at index\n\n```swift\nlet element = [\"foo\", \"bar\"].get(0)\nelement!\n=\u003e \"foo\"\n\nlet nothing = [\"foo\", \"bar\"].get(1000)\n=\u003e nil\n```\n\n### `initial(numElements: Int? = 1) -\u003e [Element]`\n\nGets all but the last element or last n elements of an array.\n\n```swift\nlet initial = [\"foo\", \"bar\", \"spam\"].initial(2) \n=\u003e [\"foo\"]\n```\n\n### `last() -\u003e Element?`\n\nGets the last element from the array.\n\n```swift\nlet last = [\"foo\", \"bar\"].last() \n=\u003e \"bar\"\n```\n\n### `rest(numElements: Int? = 1) -\u003e [Element]`\n\nThe opposite of initial this method gets all but the first element or first n elements of an array.\n\n```swift\nlet rest = [\"foo\", \"bar\", \"spam\"].rest(2)\n=\u003e [\"spam\"]\n```\n\n### `min\u003cT: Comparable\u003e() -\u003e T?`\n\nRetrieves the minimum value in an array.\n\n```swift\nlet min = [ 0, 1, 2 ].min()\n=\u003e 0\n```\n\n### `max\u003cT: Comparable\u003e() -\u003e T?`\n\nRetrieves the maximum value in an array.\n\n```swift\nlet max = [ 0, 1, 2].max()\n=\u003e 2\n```\n\n### `remove\u003cT: Equatable\u003e(value: T) -\u003e T?`\n\nRemove element from array\n\n```swift\nvar arr = [\"A\", \"B\", \"C\", \"D\", \"E\"]\narr.remove(\"B\")\n=\u003e [\"A\", \"C\", \"D\", \"E\"]\n```\n\n### `contains\u003cT:Equatable\u003e(value: T) -\u003e Bool`\n\nChecks if a given value is present in the array.\n\n```swift\nvar arr = [\"A\", \"B\", \"C\", \"D\", \"E\"]\narr.contains(\"C\")\n=\u003e true\narr.contains(\"Z\")\n=\u003e false\n```\n\n### `zipObject\u003cT\u003e(values: [T]) -\u003e [Element:T]`\n\nCreates an object composed from arrays of keys and values.\n\n```swift\nlet keys = [\"A\", \"B\", \"C\"]\nlet vals = [1,2,3]\nkeys.zipObject(vals)\n=\u003e [\"A\":1,\"B\":2,\"C\":3]\n```\n\n### `isNotEmpty`\n\nChecks if the array has one or more elements.\n\n```swift\nlet arr = [1,2,3]\narr.isNotEmpty\n=\u003e true\n```\n\n\n## Character Extensions ##\n\n### `\"A\".description -\u003e String`\n\nGet string description of Character\n\n```swift\nlet ch: Character = \"A\"\nlet str = ch.description\n=\u003e \"A\"\n```\n\n### `\"A\".ord -\u003e Int`\n\nGet int representation of character\n\n```swift\nCharacter(\"A\").ord\n=\u003e 65\n```\n\n\n## Date Extensions ##\n\n### `Date.from(#year: Int, month: Int, day: Int) -\u003e NSDate`\n\nReturns a new Date given the year month and day\n\n```swift\nlet date = Date.from(2014, 1, 1) \n=\u003e \"Jan 1, 2014, 12:00 AM\"\n```\n\n### `Date.from(#unix: Double) -\u003e NSDate`\n\nReturns a new Date given the unix timestamp (timeIntervalSince1970)\n\n```swift\nlet date = Date.from(unix: 1_388_552_400.0)\n=\u003e \"Jan 1, 2014, 12:00 AM\"\n```\n\n### `Date.parse(dateStr: String, format: String = \"yyyy-MM-dd\") -\u003e NSDate`\n\nParses the date based on the format and return a new Date\n\n```swift\nlet parsedDate = Date.parse(\"2014-01-01\", format: \"yyyy-MM-dd\")\n=\u003e \"Jan 1, 2014, 12:00 AM\"\n```\n\n### `Date.unix(date: NSDate = NSDate()) -\u003e Double`\n\nReturns the unix timestamp of the date passed in or the current unix timestamp\n\n```swift\nlet currentUnix = Date.unix()\n=\u003e 1,388,552,400.0\n\nvar otherNSDate = Date()\nlet otherUnix = Date.unix(otherDate)\n=\u003e 1,388,552,400.0\n```\n\n### `Int.hour.fromNow` et al.\n\nUse the following syntax to calculate dates and times based on the user's current calendar. \n\n```swift\n1.day.ago\n=\u003e \"Apr 10, 2015, 11:51 AM\"\n4.hours.fromNow\n=\u003e \"Apr 11, 2015, 3:51 PM\"\n```\n\n## Dictionary Extensions ##\n\n### `merge\u003cK, V\u003e(dictionaries: Dictionary\u003cK, V\u003e...)`\n\nMerges the dictionary with dictionaries passed. The latter dictionaries will override values of the keys that are already set\n\n```swift\nvar dic = [\"foo\": \"bar\"] \nlet anotherDic = [\"foo\": \"baz\", \"spam\": \"eggs\"]\ndic.merge(anotherDic)\n=\u003e [\"foo\": \"baz\", \"spam\": \"eggs\"]\n```\n\n## Int Extensions ##\n\n### `times(callback: (Int) -\u003e ())`\n\nInvoke a callback n times with callback that takes index\n\n```swift\n5.times { (a: Int) -\u003e () in print(\"\\(a) \") } \n=\u003e 0 1 2 3 4  \n```\n\n### `times (function: () -\u003e ())`\n\nInvoke a callback n times\n\n```swift\n5.times { print(\"Na\") } \n=\u003e \"NaNaNaNaNa\"\n```\n\n### `char -\u003e Character`\n\nGet ASCII character from integer\n\n```swift\n65.char\n=\u003e \"A\"\n```\n\n### `isEven`\n\nCheck if int is even\n\n```swift\n2.isEven\n=\u003e true\n\n1.isEven\n=\u003e false\n```\n\n### `isOdd`\n\nCheck if int is odd\n\n```swift\n3.isOdd\n=\u003e true\n\n2.isOdd\n=\u003e false\n```\n\n### `digits() -\u003e [Int]`\n\nSplits the int into array of digits\n\n```swift\n4208.digits()\n=\u003e [4, 2, 0, 8]\n```\n\n### `lcm() -\u003e Int`\n\nLCM method return least common multiple with number passed\n\n```swift\n3.lcm(10)\n=\u003e 30\n\n3.lcm(9)\n=\u003e 9\n```\n\n### `gcd() -\u003e Int`\n\nGCD method return greatest common denominator with number passed\n\n```swift\n3.gcd(10)\n=\u003e 1\n\n3.gcd(9)\n=\u003e 3\n```\n\n### `random() -\u003e Int`\n\nReturns random number from 0 upto but not including value of integer\n\n```swift\n3.random()\n=\u003e 2\n\n3.random()\n=\u003e 1\n```\n\n### `factorial() -\u003e Int`\n\nReturns factorial of integer\n\n```swift\n3.factorial()\n=\u003e 6\n\n0.factorial()\n=\u003e 1\n```\n\n### `isIn(interval) -\u003e Bool`\n\nReturns true if i is in interval or range\n\n```swift\n5.isIn(1...10)\n=\u003e true\n\n10.isIn(1..\u003c10)\n=\u003e false\n```\n\n### `next() -\u003e Int`\n\nGet the next int\n\n```swift\n10.next()\n=\u003e 11\n```\n\n### `prev() -\u003e Int`\n\nGet the previous int\n\n```swift\n10.prev()\n=\u003e 9\n```\n\n### `upTo(limit: Int, callback: () -\u003e ())`\n\nInvoke the callback from int up to and including limit\n\n```swift\n3.upTo(5) {\n  print(\"Hi\")\n}\nPrints \"HiHiHi\"\n```\n\n### `downTo(limit: Int, callback: () -\u003e ())`\n\nInvoke the callback from int down to and including limit\n\n```swift\n3.downTo(0) {\n  print(\"Hi\")\n}\nPrints \"HiHiHiHi\"\n```\n\n## String Extensions ##\n\n### `.length`\n\nGet the length of the string\n\n```swift\n\"Hello\".length\n=\u003e 5\n```\n\n### `.camelCase`\n\nGet the camel case representation of the string\n\n```swift\n\"__Dollar and cent-- dollarANDCent\".camelCase\n=\u003e \"dollarAndCentDollarAndCent\"\n```\n\n### `.kebabCase`\n\nGet the kebab case representation of the string\n\n```swift\n\"__Dollar and cent-- dollarANDCent\".kebabCase\n=\u003e \"dollar-and-cent-dollar-and-cent\"\n```\n\n### `.snakeCase`\n\nGet the snake case representation of the string\n\n```swift\n\"__Dollar and cent-- dollarANDCent\".snakeCase\n=\u003e \"dollar_and_cent_dollar_and_cent\"\n```\n\n### `.startCase`\n\nGet the start case representation of the string\n\n```swift\n\"__Dollar and cent-- dollarANDCent\".startCase\n=\u003e \"Dollar And Cent Dollar And Cent\"\n```\n\n### `=~ str: String -\u003e Bool`\n\nDoes a regex match of whether regex string on the right is matches the string on the left\n\n```swift\n\"Dollar\" =~ \"oll\"\n=\u003e true\n```\n\n### `* n: Int -\u003e String`\n\nGet string concatenated `n` times\n\n```swift\n\"Hi Swift! \" * 3\n=\u003e \"Hi Swift! Hi Swift! Hi Swift! \"\n```\n\n### `[i: Int] -\u003e Character?`\n\nGet character at a subscript\n\n```swift\n\"Hello World\"[6] == \"W\"\n=\u003e true\n\n\"Hi\"[5]\n=\u003e nil\n```\n\n### `[str: String] -\u003e String?`\n\nReturns the substring based on the first regex match passed in the subscript\n\n```swift\nlet proj = \"Dollar and Cent\"\nproj[\"^.+[^and Cent]\"]\n=\u003e {Some: \"Dollar\"}\n```\n\n\n### `[r: Range\u003cInt\u003e] -\u003e String`\n\nGet substring using subscript notation and by passing a range\n\n```swift\n\"Hello World\"[0..\u003c5] == \"Hello\" \n=\u003e true\n```\n\n### `indexOf(char: Character) -\u003e Int?`\n\nGet the start index of character\n\n```swift\n\"hello world\".indexOf(Character(\"o\"))!\n=\u003e 4\n```\n\n\n### `indexOf(str: String) -\u003e Int?`\n\nGet the start index of string\n\n```swift\n\"hello world\".indexOf(\"llo\")!\n=\u003e 2\n\n\"hello world\".indexOf(\"illo\")\n=\u003e nil\n```\n\n### `indexOf(pattern: String) -\u003e Int?`\n\nGet the start index of regex pattern inside the string\n\n```swift\n\"hello world\".indexOf(\".llo\")!\n=\u003e 1\n```\n\n### `split(delimiter: Character) -\u003e [String]`\n\nGet an array from string split using the delimiter character\n\n```swift\n\"Hello World\".split(\" \") \n=\u003e [\"Hello\", \"World\"]\n```\n\n### `lstring() -\u003e String`\n\nGet string without leading spaces\n\n```swift\nlet leadingSpace = \"  Hello\"\nleadingSpace.lstrip()\n=\u003e \"Hello\"\n```\n\n### `rstring() -\u003e String`\n\nGet string without trailing spaces\n\n```swift\nlet trailingSpace = \"Hello   \"\ntrailingSpace.rstrip()\n=\u003e \"Hello\"\n```\n\n### `strip() -\u003e String`\n\nGet string without leading or trailing spaces\n\n```swift\nlet spaces = \"   Hello   \"\nspaces.strip()\n=\u003e \"Hello\"\n```\n\n## Regex ##\n\n### `init`\n\nInit with regex pattern as string\n\n```swift\nRegex.init(\"^Hello.World$\") // Regex that matches \"Hello World\"\n```\n\n### `matches(testStr: String) -\u003e [AnyObject]`\n\nReturn matches based on String passed.\n\n```swift\nlet re = Regex.init(\"^Hello.World$\")\nre.matches(\"Hello World\")\n```\n\n### `test(testStr: String) -\u003e Bool`\n\n```swift\nlet re = Regex.init(\"^Hello.World$\")\nre.test(\"Hello World\")\n=\u003e true\n\nre.test(\"Str\")\n=\u003e false\n```\n\n### `escapeStr(str: String) -\u003e String`\n\nEscape string with regex characters\n\n```swift\nRegex.escape(\"Hello.World\")\n=\u003e \"Hello\\.World\"\n```\n\n## Range Extensions ##\n\n### equals - `==`\n\nCheck the equality of two ranges\n\n```swift\n(1...5) == (1...5) \n=\u003e true\n\n(1..\u003c5) == (1...5) \n=\u003e false\n```\n\n### `eachWithIndex(callback: (T) -\u003e ())`\n\nFor each index in the range invoke the callback by passing the item in range\n\n```swift\n(1...5).eachWithIndex { (a: Int) -\u003e () in print(\"\\(a)\") } \n=\u003e 12345\n```\n\n### `each(callback: () -\u003e ())`\n\nFor each index in the range invoke the callback\n\n```swift\n(1...5).each { print(\"Na\") } \n=\u003e \"NaNaNaNaNa\"\n```\n\n# Contributing #\nIf you are interested in contributing checkout [CONTRIBUTING.md](https://github.com/ankurp/Cent/blob/master/CONTRIBUTING.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fankurp%2FCent","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fankurp%2FCent","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fankurp%2FCent/lists"}