{"id":23942967,"url":"https://github.com/ertugrulcetin/kezban","last_synced_at":"2025-09-07T07:41:41.340Z","repository":{"id":62433216,"uuid":"55172903","full_name":"ertugrulcetin/kezban","owner":"ertugrulcetin","description":"Utility library for Clojure and ClojureScript","archived":false,"fork":false,"pushed_at":"2022-12-13T07:38:12.000Z","size":392,"stargazers_count":44,"open_issues_count":0,"forks_count":4,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-01T06:48:12.932Z","etag":null,"topics":["clojure","clojurescript","lisp","utility","utility-library"],"latest_commit_sha":null,"homepage":"","language":"Clojure","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/ertugrulcetin.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":"2016-03-31T18:16:12.000Z","updated_at":"2025-07-27T13:31:41.000Z","dependencies_parsed_at":"2023-01-28T09:01:32.231Z","dependency_job_id":null,"html_url":"https://github.com/ertugrulcetin/kezban","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ertugrulcetin/kezban","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertugrulcetin%2Fkezban","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertugrulcetin%2Fkezban/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertugrulcetin%2Fkezban/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertugrulcetin%2Fkezban/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ertugrulcetin","download_url":"https://codeload.github.com/ertugrulcetin/kezban/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ertugrulcetin%2Fkezban/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":274010098,"owners_count":25206763,"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","status":"online","status_checked_at":"2025-09-07T02:00:09.463Z","response_time":67,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["clojure","clojurescript","lisp","utility","utility-library"],"created_at":"2025-01-06T05:17:21.595Z","updated_at":"2025-09-07T07:41:41.313Z","avatar_url":"https://github.com/ertugrulcetin.png","language":"Clojure","funding_links":[],"categories":["Miscellaneous"],"sub_categories":[],"readme":"# kezban [![Build Status](https://travis-ci.org/ertugrulcetin/kezban.svg?branch=master)](https://travis-ci.org/ertugrulcetin/kezban) [![GitHub License](https://img.shields.io/badge/license-Apache-blue.svg)](https://github.com/ertugrulcetin/kezban/blob/master/LICENSE)\n\nUtility library for **Clojure and ClojureScript**.\n\nThe library targets **Clojure 1.8** and above.\n\n## Leiningen\n\n[![Clojars Project](https://clojars.org/kezban/kezban/latest-version.svg)](https://clojars.org/kezban)\n\n## Usage\n\n### kezban.core\n\n```clojure\n;;use kezban.core\n(use 'kezban.core)\n```\n\n**when-let***\n\n```clojure\n\nuser=\u003e (when-let* [a 1 b 2 c 3]\n                  (println \"I \u003c3 Clojure\")\n                  a)\n=\u003e \"I \u003c3 Clojure\"\n=\u003e 1\n\n;;returns nil when one binding is nil or false\nuser=\u003e (when-let* [a 1 b nil c 3]\n                  (println \"Please print me!\")\n                  a)\n=\u003e nil                              \n```\n\n**if-let***\n\n```clojure\n\nuser=\u003e (if-let* [a 1 b 2 c (+ a b)]\n                c)\n=\u003e 3\n\n;;returns then part when one binding is nil or false\nuser=\u003e (if-let* [a 1 b nil c 3]\n                \"Nope not here\"\n                \"Here I Am!\")\n=\u003e \"Here I Am!\"         \n```\n\n**cond-as-\u003e**\n\n```clojure\n(cond-as-\u003e 1 n\n           true (+ n 1)\n           false (+ n 2)\n           true  (+  5 n))\n=\u003e 7\n```\n\n**-\u003e\u003e\u003e**\n\n```clojure\n;; Alternative to -\u003e, -\u003e\u003e and (comp) with one arg\n;; Applying Left-To-Right\n;; First Argument has to be a value(input)!\n\n;; comp equivalent: ((comp #(+ 1 %) #(+ % 1) inc) 5)\n;; standard equivalent (+ 1 (+ (inc 5) 1))\n\nuser=\u003e (-\u003e\u003e\u003e 5 inc #(+ % 1) #(+ 1 %)) ;;5 is the input\n=\u003e 8\n\n\n;; comp equivalent: ((comp inc second reverse) '(\"a\" 2 8 \"b\"))\n;; standard equivalent (inc (second (reverse '(\"a\" 2 8 \"b\"))))\n\nuser=\u003e (-\u003e\u003e\u003e '(\"a\" 2 8 \"b\") reverse second inc) ;;'(\"a\" 2 8 \"b\") is the input\n=\u003e 9\n```\n\n\n**nth-safe**\n\n```clojure\n\n(def coll [1 2 3 4 5])\n\nuser=\u003e (nth-safe coll 0)\n=\u003e 1\n\nuser=\u003e (nth-safe coll 12)\n=\u003e nil\n\nuser=\u003e (nth-safe coll 12 \"not-found-value\")\n=\u003e \"not-found-value\"\n```\n\n**nnth**\n\n```clojure\n\n(nnth [1 [2 3 [4 5]]] 1 2 1)\n=\u003e 5\n```\n\n**def-**\n```clojure\n\n(def- my-coll [1 2 3])\n=\u003e #'kezban.core/my-coll\n\n(:private (meta #'kezban.core/my-coll))\n=\u003e true\n```\n\n**xor**\n```clojure\n\n(xor false true nil)\n=\u003e true\n\n(xor false nil)\n=\u003e nil\n```\n\n**pprint-macro**\n```clojure\n\n(pprint-macro (when-let [a 1]\n                (println a)))\n(let*\n [temp__4657__auto__ 1]\n (if temp__4657__auto__ (do (let* [a temp__4657__auto__] (println a)))))\n=\u003e nil\n```\n\n**quoted?**\n```clojure\n\n(quoted? '(+ 1  2))\n=\u003e true\n\n(quoted? (+ 1  2))\n=\u003e false\n```\n\n**array?**\n```clojure\n\n(array? (int-array 1))\n=\u003e true\n\n(array? :int (int-array 1))\n=\u003e true\n```\n\n**lazy?**\n```clojure\n\n(lazy? (map inc [1 2 3]))\n=\u003e true\n```\n\n**any-pred**\n```clojure\n\n(filter (any-pred even? odd?) [2 4 5 7])\n=\u003e (2 4 5 7)\n```\n\n**try-\u003e and try-\u003e\u003e**\n```clojure\n\n(try-\u003e 5 inc dec str inc) ;;also thread last version: try-\u003e\u003e\n=\u003e nil\n```\n\n**multi-comp**\n```clojure\n\n(def data [{:v 12, :a 10} {:v 21, :a 113} {:v 1, :a 2} {:v 12, :a 223} {:v 100, :a 23} {:v 1, :a 113}])\n\n(sort #(multi-comp [:a :v] \u003e %1 %2) data)\n;or\n(sort #(multi-comp [:a :v] %2 %1) data)\n=\u003e ({:v 12, :a 223} {:v 21, :a 113} {:v 1, :a 113} {:v 100, :a 23} {:v 12, :a 10} {:v 1, :a 2})\n```\n\n**with-out**\n```clojure\n\n(with-out \n (println \"Normal out\") \n (.println (System/err) \"Error occurred!\"))\n=\u003e {:err \"Error occurred!\\n\", :out \"Normal out\\n\"}\n\n```\n\n**letm**\n```clojure\n\n(letm [a 1\n       b (+ a 1)])\n=\u003e {:a 1, :b 2}\n```\n\n**in?**\n```clojure\n\n(in? 3 [1 2 3 4])\n=\u003e true\n```\n\n**take-while-and-n-more**\n```clojure\n\n(take-while-and-n-more even? 2 [2 4 6 7 9 13 15])\n=\u003e (2 4 6 7 9)\n```\n\n**dissoc-in**\n```clojure\n\n(dissoc-in {:a {:b {:c 1 :d 2}}} [:a :b :d])\n=\u003e {:a {:b {:c 1}}}\n```\n\n**with-timeout**\n```clojure\n\n(with-timeout 100\n              (Thread/sleep 1500))\n=\u003e CompilerException java.util.concurrent.TimeoutException\n\n(with-timeout 1000\n              (Thread/sleep 500)\n              5)\n=\u003e 5\n```\n\n**url-\u003efile**\n```clojure\n\n(url-\u003efile \"http://file.url\" (io/file \"your file path to get content\"))\n=\u003e returns your file instance\n```\n\n**cond-let**\n```clojure\n\n(cond-let [a 5\n           b (+ a 1)]\n\n          (even? a)\n          (println \"a is odd\")\n\n          (even? b)\n          (println \"b is even\"))\nb is even\n=\u003e nil\n```\n\n**keywordize**\n```clojure\n\n(keywordize \"hey Whats Up?\")\n=\u003e :hey-whats-up?\n```\n\n**source-clj-file**\n```clojure\n\n(source-clj-file 'clojure.string)\n=\u003e returns clojure.string's namespace source code in string\n```\n\n**time***\n```clojure\n\n;;unlike time, time* allows you to provide more than one form\n(time* \n  (Thread/sleep 2500)\n  12)\n  \n=\u003e {:duration 2505.328818, :result 12}\n```\n\n**process-lazy-seq**\n```clojure\n\n(process-lazy-seq (fn [i]\n                    (println (inc i))) 10000 (range))\n                    \n;; we can process 10000 data at time and not getting OutOfMemory Exception\n```\n\n\n**when-no-aot**\n```clojure\n\n;; binding will happen when *compile-files* set to false\n(def db-conn (when-no-aot (create-db-connection!)))\n\n```\n\n**defay**\n```clojure\n\n(defay current-time  (println \"Hi!\") (System/currentTimeMillis))\n;; Hi!\n;;=\u003e 1587327846466\n\n@current-time\n\n;;=\u003e 1587327846466\n\n;; Expands to this:\n(def current-time (delay (println \"Hi!\")\n                         (System/currentTimeMillis)))\n\n(when-not *compile-files* @current-time)\n\n```\n\n**locals**\n```clojure\n\n(defn my-fn\n  [a]\n  (let [b 2]\n    (locals)))\n\n(my-fn 1)\n;;=\u003e {a 1, b 2}\n```\n\n**prog1**\n```clojure\n\n(prog1 (+ 1 2)\n  (println \"Result: \" \u003c\u003e))\n\n;;Result:  3\n;;=\u003e 3\n```\n\n\n**defm**\n```clojure\n(defm my-add [x y]\n  (println \"Result: \" (+ x y))\n  (+ x y))\n\n(my-add 1 2)\n;;Result:  3\n;;=\u003e 3\n\n(my-add 1 2)\n;;=\u003e 3\n```\n```clojure\n\nMemoized function, expands to this:\n\n(def my-add\n  (memoize\n    (fn [x y]\n      (println \"Result: \" (+ x y))\n      (+ x y))))\n```\n\n## License\n```\n  Copyright © 2022 Ertuğrul Çetin\n  \n  Licensed under the Apache License, Version 2.0 (the \"License\");\n  you may not use this file except in compliance with the License.\n  You may obtain a copy of the License at\n  \n  http://www.apache.org/licenses/LICENSE-2.0\n  \n  Unless required by applicable law or agreed to in writing, software\n  distributed under the License is distributed on an \"AS IS\" BASIS,\n  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n  See the License for the specific language governing permissions and\n  limitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fertugrulcetin%2Fkezban","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fertugrulcetin%2Fkezban","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fertugrulcetin%2Fkezban/lists"}