announcements

Project/library announcements ONLY - use threaded replies for discussions. Do not cross post here from other channels. Consider #events or #news-and-articles for other announcements.
plexus 2021-03-09T05:32:18.286800Z

There's a new release of Kaocha, a modern and extensible test runner, featuring many improvements and fixes. Thanks to @actuallyalys_slack, @dharrigan. @socksy, and Rob Hanlon for your contributions! https://github.com/lambdaisland/kaocha/blob/main/CHANGELOG.md#10829-2021-03-08--a88ebda

πŸ‘ 4
1
❀️ 9
plexus 2021-03-09T06:46:17.289Z

lambdaisland/glogi 1.0.83 is out. GlΓΆgi is a ClojureScript logging library based on goog.log. This version handles some upstream breaking changes, and adds a lambdaisland.glogc namespace for cross-platform logging, which dispatches to io.pedestal.log on Clojure. https://github.com/lambdaisland/glogi

πŸ‘ 8
1
❀️ 2
raspasov 2021-03-09T07:44:22.291500Z

New release of saberstack/loop {:mvn/version "0.2.2"}. This is a bug fix release which fixes a concurrency bug. Loop allows you to take control of your core.async loops with just a bit of state (one atom). Start/stop a go-loop from the REPL or β€œre-define” a running go-loop by starting a new one with the same :id https://github.com/saberstack/loop

πŸ˜‹ 1
blak3mill3r 2021-03-09T22:40:04.312400Z

Brilliant! I look forward to trying this out.

πŸ‘ 1
raspasov 2021-03-10T03:37:48.313900Z

@blak3mill3r great, let me know how it goes

Mark Wardle 2021-03-09T11:07:58.303Z

Hi. Pleased to announce hermes 0.4 release - an open source and clojure-based SNOMED CT terminology library and microservice https://github.com/wardle/hermes I use it in my electronic health record software running here in the UK - and it is part of a suite of clojure services to support electronic health and care records - answering the 'who', 'what', 'why' and 'when' of health and care. Now with much faster import and indexing, and support for the expression constraint language (e.g. answering complex queries such as does my patient have a diagnosis that is a lung disease associated with oedema) for supporting both direct care / rules / decision support and analytics. I use it to show specialist pages like specialised summaries for motor neurone disease or multiple sclerosis so the clinician sees the right information at the right time.

πŸ‘€ 5
πŸ‡¬πŸ‡§ 2
πŸ‘Œ 8
1
Mark Wardle 2021-03-09T11:08:08.303100Z

The other linked projects are concierge (https://github.com/wardle/concierge - integration with legacy enterprise APIs in NHS in Wales, UK), nhspd (https://github.com/wardle/nhspd - providing UK geographical services mapping postcodes to administrative regions/indices of socio-economic deprivation - I've used extensively in our research output on outcomes in multiple sclerosis), trud (https://github.com/wardle/trud - providing sane access to the UK NHS' reference data) and clods (https://github.com/wardle/clods - providing a library and microservice for UK health and care organisations. These essentially drive a tonne of logic in my health and care software - e..g find local GPs or hospitals etc. I've never been able to create so much functionality with so little code so thank you clojure!

schmee 2021-03-09T17:18:32.306200Z

I don’t work in healthcare so I have no idea about the functionality, but it was really interesting to take a look at this codebase, thanks for sharing! :thumbsup:

Mark Wardle 2021-03-09T17:44:14.306600Z

Thanks! Well I have only recently started using clojure in the last year so I hope you mean "good" interesting and not "oh crumbs" interesting...

nilern 2021-03-09T18:17:08.307500Z

Debuting Monnit, just another monads library https://github.com/nilern/monnit

4
🐟 6
mccraigmccraig 2021-03-10T08:57:05.314500Z

i like the formulation with the various effect operations implemented as different types @nilern ... food for thought - are you heading towards a general purpose effect-combining approach like fused-effects &c ?

nilern 2021-03-10T12:01:56.315200Z

So https://github.com/nilern/taksi is my async library, the goal is something similar to Scalaz ZIO and Concurrent ML. I also have a freer monad with higher-order effects for maximum expressivity https://github.com/nilern/fell but I am not sure whether that is even a good idea; the ZIO/polysemy approach might not support backtracking with scoped resources or whatever but that is hardly called for in web apps.

nilern 2021-03-10T12:08:32.315600Z

Obviously those should not be used yet and fell doesn't even use monnit ATM

mccraigmccraig 2021-03-10T12:39:13.315900Z

this looks great - and i haven't really grokked the free/freer stuff yet, having a clojure should help me with that πŸ™‚

nilern 2021-03-10T13:03:47.316300Z

It's hard and dynamic typing probably makes it even harder. Again, not sure if bringing such a thing into Clojure is even a good idea.

mccraigmccraig 2021-03-10T13:12:14.316500Z

well i won't be able to discuss that point until i've grokked them πŸ™‚

mccraigmccraig 2021-03-10T13:12:48.316700Z

but even if free/freer is not the route, i do think that there's a lot of scope for bringing effectful stuff into clojure

nilern 2021-03-10T13:58:05.317300Z

Yes and the re-frame (-style) effects processing is very clunky, surely we can do better than that

lodin 2021-03-10T14:00:51.317500Z

@nilern How do you know which monad to use in mlet?

nilern 2021-03-10T14:09:27.317700Z

(mlet [a (foo 5)] ... just becomes (bind (foo 5) (fn [a] ... and bind is a protocol method. The mlet bindings could even use different monads but don't do that (seems that in Haskell do is not just syntactic sugar after all since using different monads in one do is a type error).

lodin 2021-03-10T14:12:11.317900Z

(In Haskell it is just sugar since bind has the type m a -> (a -> m b) -> m b; the m cannot change.)

lodin 2021-03-10T14:17:16.318100Z

Now I see. While you have a multimethod pure, you actually use regular function for the particular monad.

nilern 2021-03-10T14:17:26.318300Z

(I see it now.)

nilern 2021-03-10T14:19:02.318500Z

Yes there is no magic to emulate return value polymorphism for pure.

lodin 2021-03-10T14:19:03.318700Z

The docs for mlet is a bit misleading I think, unless I'm missing something.

nilern 2021-03-10T14:23:00.318900Z

You found a bug in the docstring, the pure part would not work (unless you e.g. :refer monnit.option/pure)

lodin 2021-03-10T14:25:36.319100Z

To make it work you'd have to save away the result of e.g. (foo 0) and pass that as the first argument to pure.

nilern 2021-03-10T14:33:45.319300Z

Actually (type a). algo.monads implicitly wraps the body in the right pure and Cats sets a dynamic Var to a MonadContext so that (pure 0) usually just works (but there have been bugs).

nilern 2021-03-10T14:39:15.319500Z

One of my motivations is to avoid any indirections and tricks like that. Even the pure multimethod is just for situations where pure must actually be polymorphic like helper fns/macros.

lodin 2021-03-10T14:44:49.319700Z

Unfortunately that approach doesn't work well with lazy evaluation, eg if you use it in a function that you use with map. Then the context might be missing, or even the wrong context, when running the function.

nilern 2021-03-10T14:48:57.319900Z

As I said earlier I usually see dynamic Vars as a code smell. The Reader monad should be less fragile (but the Cats implementation uses dynamic Vars 🀯).

nilern 2021-03-10T17:55:33.320900Z

I put out 0.1.2 with docstring improvements https://cljdoc.org/d/com.deepbeginnings/monnit/0.1.2/api/monnit.core (thanks @lodin.johan!)

schmee 2021-03-09T19:00:22.308500Z

haha, definitely the first one πŸ˜„

πŸ‘ 1
lilactown 2021-03-09T19:48:29.309200Z

as an experienced clojurian I don't really understand what the value prop of the lib is in practice; do you have any examples of how it should be used?

lilactown 2021-03-09T19:49:20.309600Z

in the tests I see e.g. fmap/flat-map/sconcat used on vectors, but I don't see the benefit of that over the clojure.core seq ops

lilactown 2021-03-09T19:50:15.309800Z

just to clarify: this isn't a dig btw, I'm genuinely curious. it sounds like you have some concrete use cases for this and went and built a lib to handle it

nilern 2021-03-09T20:22:39.310100Z

The point is not that it is somehow better to use fmap than mapv or something. I built this mostly as a basis for other libs that do stuff like async IO, parsing or algebraic effects. But the included monads can automate the plumbing around error handling, context parameters and immutable state.

lilactown 2021-03-09T20:25:16.310300Z

yeah! I've been banging on my own experiments w/ async IO and effects in my spare time, and find myself having to do a lot of complex stuff with dynamic bindings, which is why I'm interested in learning how I could use more formal patterns in those efforts

lilactown 2021-03-09T20:25:27.310500Z

maybe I should just wait for you to announce your other libs πŸ˜„

nilern 2021-03-09T20:26:32.310700Z

It's a polarized topic; I think nil and exceptions promote bad error handling and that dynamic Vars are usually a code smell while other people think it's cool and I've just had too much Haskell.

nilern 2021-03-09T20:32:25.310900Z

Yeah I hope the other libs will be more exciting or at least mindblowing

mccraigmccraig 2021-03-09T21:02:35.311200Z

lol, I've also been working on a monad lib @nilern ... not quite ready yet, but taking shape... https://github.com/mccraigmccraig/promisefx

nilern 2021-03-09T21:06:40.311500Z

I did say "just another monads library"

mccraigmccraig 2021-03-09T21:08:05.311700Z

must be a mini-zeitgeist