package io.asyncdb

import cats.effect._
import io.netty.channel.{ChannelFuture, ChannelFutureListener}

package object netty {
  implicit class ChannelFutureOps(val future: ChannelFuture) extends AnyVal {
    def to[F[_]](implicit F: Concurrent[F]): F[ChannelFuture] = F.cancelable {
      k =>
        val f = future.addListener(new ChannelFutureListener {
          override def operationComplete(future: ChannelFuture): Unit = {
            if (future.isSuccess) k(Right(future)) else k(Left(future.cause()))
          }
        })
        F.delay(f.cancel(false))
    }
  }
}