Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def interruptable[F[_]: Concurrent: ContextShift](thunk: => A): F[A] = {
- val fa: F[A] = Concurrent[F] cancelable { cb =>
- val done = new AtomicBoolean(false)
- val t = new Thread { () =>
- try {
- val result = thunk
- done.set(true)
- cb(Right(result))
- } catch {
- case NonFatal(e) =>
- done.set(true)
- cb(Left(e))
- case t: Throwable =>
- done.set(true)
- throw t
- }
- }
- t.setDaemon(true)
- t.setName("interruptable-thingy-todo")
- t.start()
- Sync[F] delay {
- while (!done.get()) {
- t.interrupt()
- }
- }
- }
- fa.guarantee(ContextShift[F].shift)
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement