Skip to content
This repository has been archived by the owner on Apr 19, 2020. It is now read-only.
/ fastest Public archive

A Clojure library for non-deterministic and parallel branching

License

Notifications You must be signed in to change notification settings

jdevuyst/fastest

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Fastest

A Clojure library for non-deterministic and parallel branching.

This library contains several macros that take a variadic number of expressions for arguments. The expressions are evaluated in parallel and (at most) one of their resulting values is returned.

Fastest uses future to eagerly schedule tasks. When one of the expressions returns a satisfactory result, the (other) futures are canceled.

Setup

To start, create a Leiningen project and add the following dependency to project.clj:

Clojars Project

Next, load Fastest as follows:

(require '[fastest :as f])

Macros

(f/any expr1 expr2 expr3 ...)

Returns the value of the expression that returns the first result. (f/any) expands to nil.

(f/any* expr1 expr2 expr3 ...)

Waits for all the expressions to be evaluated and returns the value that was last returned. (f/any*) expands to nil.

(f/or expr1 expr2 expr3 ...)

Returns the first truthy value returned by any of the expressions. Or, if that fails, the last falsy value. (f/or) expands to nil.

(f/and expr1 expr2 expr3 ...)

Yields the first falsy value returned by any of the expressions. Or, if that fails, the first truthy value. (f/and) expands to true.

(f/some pred expr1 expr2 expr3 ...)

Yields the first value x returned by any of the expressions such that (pred x) is truthy. If that fails, f/some returns the last value such that (pred x) is falsy. (f/some pred) expands to nil.

Further information

Notice that expessions are not usually terminated forcibly when the futures are canceled. Every expression is responsible for checking (Thread/interrupted) if it wants to abort when its return value is no longer needed. The exception to this rule is when an expression calls certain blocking methods of Java, such as Thread/sleep, which raise an InterruptedException when (Thread/interrupted) holds.

License

Copyright © 2014 Jonas De Vuyst

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

About

A Clojure library for non-deterministic and parallel branching

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published