Packages

  • package root
    Definition Classes
    root
  • package ca
    Definition Classes
    root
  • package dvgi
    Definition Classes
    ca
  • package managerial

    Managerial is a library for managing resource lifecycle monadically.

    Managerial is a library for managing resource lifecycle monadically.

    The main entry points to the library are found in Managed$.

    The following is a full-fledged usage example:

    import ca.dvgi.managerial.Managed
    import ca.dvgi.managerial._
    
    object Main extends App {
    
      val server = for {
        // create a Managed[Unit] for side effects
        _ <- Managed.eval(println("Starting setup..."))(println("Finished teardown"))
    
        // create Managed[Settings] that doesn't require teardown
        settings <- Managed.setup(Settings(8080, 7070))
    
        // create Managed[HealthCheckServer], which requires teardown
        healthCheckServer <- Managed(new HealthCheckServer(settings))(_.stop())
    
        // Managed#from expects a type class instance for Teardown[T], instead of having teardown specified explicitly.
        // ca.dvgi.managerial provides Teardown[AutoCloseable].
        apiServer <- Managed.from(new ApiServer(settings))
    
        // once the ApiServer is started, the HealthCheckServer can show it's ready
        _ <- Managed.eval(healthCheckServer.markReady())(healthCheckServer.markUnready())
    
        // evalSetup and evalTeardown allow for side-effects during only setup or only teardown
        _ <- Managed.evalSetup(println("Startup is finished!"))
      } yield apiServer
    
      // builds the Managed stack and registers a JVM shutdown hook to do automatic teardown
      server.useUntilShutdown()
    }
    
    case class Settings(healthCheckPort: Int, apiPort: Int)
    
    class HealthCheckServer(settings: Settings) {
      println("Started HealthCheckServer")
      def stop(): Unit = {
        println("Stopped HealthCheckServer")
      }
      def markReady(): Unit = println("Marked HealthCheckServer Ready")
      def markUnready(): Unit = println("Marked HealthCheckServer Unready")
    }
    
    class ApiServer(settings: Settings) extends AutoCloseable {
      import scala.concurrent.ExecutionContext.Implicits.global
      import scala.concurrent.duration.Duration
      import scala.concurrent.Await
      import scala.concurrent.Future
      val fakeServer = new Thread {
        override def run: Unit = {
          Await.ready(Future.never, Duration.Inf)
        }
      }
      fakeServer.start()
      println("Started ApiServer")
      def close(): Unit = {
        println("Stopped ApiServer")
      }
    }
p

ca

dvgi

package dvgi

Ungrouped