Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Repo info
Activity
  • Sep 05 2019 14:43
    @typelevel-bot banned @jdegoes
  • Jan 31 2019 21:17
    codecov-io commented #484
  • Jan 31 2019 21:08
    scala-steward opened #484
  • Jan 31 2019 18:19
    andywhite37 commented #189
  • Jan 31 2019 02:41
    kamilongus starred typelevel/cats-effect
  • Jan 30 2019 00:01
    codecov-io commented #483
  • Jan 29 2019 23:51
    deniszjukow opened #483
  • Jan 29 2019 23:37
  • Jan 29 2019 23:22
  • Jan 29 2019 20:26
    Rui-L starred typelevel/cats-effect
  • Jan 29 2019 18:01
    jdegoes commented #480
  • Jan 29 2019 17:04
    thomaav starred typelevel/cats-effect
  • Jan 28 2019 17:43
    asachdeva starred typelevel/cats-effect
  • Jan 28 2019 07:12
    alexandru commented #480
  • Jan 28 2019 05:45
    codecov-io commented #482
  • Jan 28 2019 05:35
    daron666 opened #482
  • Jan 27 2019 13:56
    codecov-io commented #481
  • Jan 27 2019 13:46
    lrodero opened #481
  • Jan 27 2019 05:47
    codecov-io commented #460
  • Jan 27 2019 05:37
    codecov-io commented #460
Dmitry Polienko
@nigredo-tori

You probably want

res = Resouce.make(mutex.acquire)(_ => mutex.release).as(a)

AFAIK, *> can cause a cancellation check, so you might leak your mutex.

James Rockett
@jrockett6
@arosien Cool thank you I will take a look at that!
James Rockett
@jrockett6
Oh haha I just realized Scala with Cats has a whole chapter (ch 10) dedicated to this as well :smiley:
Dmitry Polienko
@nigredo-tori

@jrrockett, AFAICT, you want the monad you're working in to have two capabilities.

  1. It should be able to check if a file exists (by running some IO operations). Either[String, *] can't do that.
  2. It should have String errors with short-curcuiting. IO and so on can't do that.

So there is no such monad out of the box. However, this is achievable with monad transformers. Something like this:

private def parseArgs(args: List[String]): EitherT[IO, String, Unit] =
    for {
      _ <- EitherT.fromEither[IO](checkArgsEmpty(args))
      pair <- EitherT.fromEither[IO](args.sliding(2).toList)
      _ <- EitherT.fromEither[IO](checkIfPair(pair))
      _ <- EitherT.fromEither[IO](checkValidFlag(pair.head))
      _ <- checkValidPair(pair)
// ...

private def checkValidPair(argsPair: List[String]): EitherT[IO, String, Unit] = argsPair.head match {
  case "--f" => checkFileExists(argsPair.tail)
// ...

Here, EitherT is a transformer that transforms the IO monad by adding the second mentioned capability.

There are ways to reduce the fromEither noise in parseArgs, but that's not important right now. Also, checkFileExists should probably take a Blocker as a parameter (which should be passed through all the functions here).

James Rockett
@jrockett6
Cool that's exactly what I need! That thought process makes a lot of sense. I'll do a refresher on monad transformers
Adam Rosien
@arosien
@nigredo-tori thanks!
Fabio Labella
@SystemFw

@arosien @nigredo-tori

AFAIK, *> can cause a cancellation check, so you might leak your mutex.

make is uncancelable, which means that your acquire is uncancelable, so on one hand you won't leak it, but on the other you have an uninterruptible lock, which isn't great

withPermit on Semaphore has special logic to avoid this problem
Adam Rosien
@arosien
ah interesting. my idea was to try to avoid passing the actual Semaphore around, i was looking for the right interface to do it. i started with withPermit.
Luis Rodero-Merino
@lrodero

Hi, I created the #1122 PR to update tutorial to cats 2.1.4 and fix links.

Beyond that, I discussed with @marcraminv the contents of the current TCP echo server - concurrent system with Fibers section. And we conclude that most of it is hard to read and understand. As I'm the author it pains me to admit it :) , but it is likely we should replace it with something easier to follow. E.g. we considered implementing a solution for the producer-consumer problem. What do you think?

Luis Rodero-Merino
@lrodero
Also, any other comment or suggestion for the tutorial is welcome ;)
Anton Sviridov
@keynmol
Has anyone seen github actions being stuck on cats-effect build? I've opened a PR which seemingly doesn't touch anything and the JDK 11 build has been stuck for 45 minutes now: https://github.com/typelevel/cats-effect/pull/1123/checks?check_run_id=1018303390
Fabio Labella
@SystemFw
@mpilquist @RaasAhsan @djspiewak Do you reckon it's the same issue?
Raas Ahsan
@RaasAhsan
@keynmol @SystemFw I can't tell anymore, but it says the workflow finished in 7 minutes. was the adopt11 build just queued for 45 minutes or something?
Fabio Labella
@SystemFw
didn't check at the time, might well be :)
Anton Sviridov
@keynmol
I force-pushed for a different reason (commit email), which is a dumb thing to do when you're trying to demonstrate a stuck build :D basically previous build on adopt11 spent 45 minutes on " Run sbt ++2.12.11 ci"
Raas Ahsan
@RaasAhsan
ah :D do you know if it was stuck on a particular test?
thankfully actions keeps track of every workflow run
it seems like like all the tests passed and then got stuck before running mima checks
Daniel Spiewak
@djspiewak
on rare occaisions, Actions instances can die randomly
this used to happen a lot
what causes it is the underlying Azure Pipelines instance going away
when that happens, teh build just... hangs roughly forever
that sounds like what happens

Beyond that, I discussed with @marcraminv the contents of the current TCP echo server - concurrent system with Fibers section. And we conclude that most of it is hard to read and understand. As I'm the author it pains me to admit it :) , but it is likely we should replace it with something easier to follow. E.g. we considered implementing a solution for the producer-consumer problem. What do you think?

Producer-consumer seems a lot easier to follow! Like, I love the TCP echo server concept, but it's definitely difficult to follow and requires some setup.

Something I've struggled with sometimes is whether or not it's worth referencing ecosystem projects

Like, you wouldn't implement a TCP server from scratch with vanilla CE, you would use another library which builds on top of CE and exposes that kind of fucntionality, then you would implement an echo server
Daniel Spiewak
@djspiewak
Basically what I'm saying is it's hard to write tutorials :-)
Anand Krishnan
@iamanandkris
Hi is there a way to use ConcurrentEffect[F].start{...} inside Resource.use() in a safe way?
Gavin Bisesi
@Daenyth
Yes, but start is very low level, and you're better off using another abstraction
depending on what you want to do
fs2 allows a very high level and composable api for dealing with concurrency
basically, you want to spend your time writing business logic, not writing concurrency-safe low level stuff
Anand Krishnan
@iamanandkris
Yeah I have an aws client as resource that is pushed in from the top level. I need to use that resource in my business logic. One part of the business logic can be executed concurrently (which makes use of the above resource). So I want the resource to be freed only when the concurrent task also is completed. What are other options than start? I tried background get back the concurrent execution as a resource. That also is not completing the work somehow.
Gavin Bisesi
@Daenyth
Streams would make that easier, definitely
Does it have to be released before your app closes? Not appropriate to open/close on init/shutdown?
Anand Krishnan
@iamanandkris
Actually I assumed it will be better to start up a client for each request, not for the full app.
Daniel Spiewak
@djspiewak

Actually I assumed it will be better to start up a client for each request

Sounds relatively expensive. If the client is shareable across threads, then you're definitely better making it at app startup rather than per-request

Gavin Bisesi
@Daenyth
Depends what the client is and if you need to have multiple of them
If it's something like an http4s client, you absolutely want one for the whole process lifetime
because the resource is expensive to construct, and what it gives you is more efficient per-usage actions
(it does connection pooling, keep-alive, etc)
most resources you want to construct once and then pass down to your app already-alive
it's relatively rare that you really want to be dealing with Resource inside your biz logic
Anand Krishnan
@iamanandkris
Yeah I am not happy the way I coded it, thanks for the suggestion @Daenyth and @djspiewak I will try to make it application level.
Matt
@mattgibb
Hello awesome cats-effect team! Thanks for all your hard work :)
Adam Rosien
@arosien
they are awesome!
Luis Rodero-Merino
@lrodero

Basically what I'm saying is it's hard to write tutorials :-)

Yes, absolutely :) . So, ok, agreed. @marcraminv and I will try to work on it. Thanks for the feedback!

rnd4222
@rnd4222_gitlab
Do you guys use explicit Kleisli in a "tagless-final" code, or hide it behind another parametric type, having (say) F and G for a types with and without context?
I'm aware of cats-mtl, but what if you need to eventually provide a context and convert reader-like G to a non-reader F?