Cyclist is a tiny Clojure library that detects cyclic dependencies between named entities.
Cyclist is not a young library.
Cyclist artifacts are released to Clojars. If you are using Maven, add the following repository
definition to your pom.xml
:
<repository>
<id>clojars.org</id>
<url>http://clojars.org/repo</url>
</repository>
With Leiningen:
[clojurewerkz/cyclist "1.0.0"]
With Maven:
<dependency>
<groupId>clojurewerkz</groupId>
<artifactId>cyclist</artifactId>
<version>1.0.0</version>
</dependency>
Cyclist operates on maps with two keys: :name
and :dependencies
:
{:name :a :dependencies #{:b}}
{:name :b :dependencies #{:c}}
{:name :c :dependencies #{}}
clojurewerkz.cyclist.dependencies/has-cyclic-dependecies?
takes node and
a collection of all graph nodes and returns true if the graph has cyclic
dependencies:
(let [a {:name 'a :dependencies #{'b}}
b {:name 'b :dependencies #{'c}}
c {:name 'c :dependencies #{}}
xs [a b c]]
(cy/has-cyclic-dependencies? x xs))
;= false
(let [a {:name 'a :dependencies #{'b}}
b {:name 'b :dependencies #{'a}}
c {:name 'c :dependencies #{}}
xs [a b c]]
(cy/has-cyclic-dependencies? x xs))
;= true
clojurewerkz.cyclist.dependencies/detect
takes a collection of graph nodes
and returns the first one that has cyclic dependencies:
(let [a {:name 'a :dependencies #{'b}}
b {:name 'b :dependencies #{'c}}
c {:name 'c :dependencies #{}}
xs [a b c]]
(cy/detect xs))
;= nil
(let [a {:name 'a :dependencies #{'b}}
b {:name 'b :dependencies #{'a}}
c {:name 'c :dependencies #{}}
xs [a b c]]
(cy/detect xs))
;= {:name 'a :dependencies #{'b}}
(let [a {:name 'a :dependencies #{'b}}
b {:name 'b :dependencies #{'c}}
c {:name 'c :dependencies #{'a}}
xs [a b c]]
(cy/detect xs))
;= {:name 'a :dependencies #{'b}}
To subscribe for announcements of releases, important changes and so on, please follow @ClojureWerkz on Twitter.
Cyclic is built from the ground up for Clojure 1.4 and up.
Cyclist is part of the group of Clojure libraries known as ClojureWerkz, together with
Cyclist uses Leiningen 2. Make sure you have it installed and then run tests against supported Clojure versions using
lein all test
Then create a branch and make your changes on it. Once you are done with your changes and all tests pass, submit a pull request on GitHub.
Copyright (C) 2013-2016 Michael S. Klishin, Alex Petrov, and the ClojureWerkz team.
Double licensed under the Eclipse Public License (the same as Clojure) or the Apache Public License 2.0.