Skip to content

Instantly share code, notes, and snippets.

@agaro1121
Last active December 26, 2016 06:30
Show Gist options
  • Save agaro1121/3c02bd9fafe137c7f17a6e1466157b9f to your computer and use it in GitHub Desktop.
Save agaro1121/3c02bd9fafe137c7f17a6e1466157b9f to your computer and use it in GitHub Desktop.
Magnet Pattern Implementation
package magnetpattern

import scala.language.implicitConversions

sealed trait Magnet {
  type Result
  def apply(): Result
}

object Magnet {
  implicit def fromSomething(something: Something): Magnet =
    new Magnet {
      override type Result = String
      override def apply(): Result = something.s
    }

  implicit def fromSomethingElse(somethingElse: SomethingElse): Magnet =
    new Magnet {
      override type Result = Int
      override def apply(): Result = somethingElse.i

    }
}

case class Something(s: String, i: Int)
case class SomethingElse(i: Int)


object Main extends App {

/**
* Could also be(for clarity):
* {{{
*   def doSomethingWithMagnet(magnet: Magnet): magnet.Result = magnet.apply()
* }}}
* */
  def doSomethingWithMagnet(magnet: Magnet): magnet.Result = magnet()


  val s = Something("johnny", 5)
  val se = SomethingElse(6)


  println(doSomethingWithMagnet(s))
  println(doSomethingWithMagnet(se))

}

Results:

johnny
6
@agaro1121
Copy link
Author

How to view implicit conversions in intellij:

image

image

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment