https://github.com/nijohando/deferable
Finally block free deferred function utilities
https://github.com/nijohando/deferable
clojure clojurescript deferred-functions
Last synced: 12 days ago
JSON representation
Finally block free deferred function utilities
- Host: GitHub
- URL: https://github.com/nijohando/deferable
- Owner: nijohando
- License: epl-1.0
- Created: 2017-02-18T10:40:10.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2018-10-14T23:47:34.000Z (almost 8 years ago)
- Last Synced: 2025-10-29T05:39:48.042Z (9 months ago)
- Topics: clojure, clojurescript, deferred-functions
- Language: Clojure
- Size: 22.5 KB
- Stars: 4
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Deferable
[](https://clojars.org/jp.nijohando/deferable)
[](https://circleci.com/gh/nijohando/deferable)
Clojure(Script) deferred function library like golang's `defer`.
## Rationale
Main motivations for writing this library are:
* Providing deferred functions like golang's `defer`
* Available on both Clojure and ClojureScript
## Installation
#### Ligningen / Boot
```clojure
[jp.nijohando/deferable "0.2.1"]
```
#### Clojure CLI / deps.edn
```clojure
jp.nijohando/deferable {:mvn/version "0.2.1"}
```
## Usage
Clojure
```clojure
(require '[jp.nijohando.deferable :as d])
```
ClojureScript
```clojure
(require '[jp.nijohando.deferable :as d :include-macros true])
```
#### Deferred functions
`do*` block works similarly to the clojure `do` and `defer` can be used inside the block.
`defer` function is scheduled to be evaluated before the block returns value.
```clojure
(d/do*
(d/defer (println "2"))
(println "1"))
;;=> "1"
;;=> "2"
;;=> nil
```
Multiple `defer` forms are evaluated in LIFO order.
```clojure
(d/do*
(d/defer (println "3"))
(d/defer (println "2"))
(println "1"))
;;=> "1"
;;=> "2"
;;=> "3"
```
#### Deferred functions in async
`do**` block is similar to `do*` but designed for async programming like core.async.
Difference with`do*` is that Deferred functions are evaluated when calling `done` function passed to the first argument of the `do**` block.
```clojure
(require '[clojure.core.async :refer [go]])
(d/do** done
(d/defer (println "3"))
(go
(println "2")
(done))
(println "1"))
;;=> "1"
;;=> "2"
;;=> "3"
```
## License
© 2017-2018 nijohando
Distributed under the Eclipse Public License either version 1.0 or (at
your option) any later version.