Option

Adding an Option effect in your stack allows to stop computations when necessary. If you create a value with some(a) this value will be used downstream but if you use none all computations will stop:

import org.atnos.eff._, all._, syntax.all._

/**
 * Stack declaration
 */
type S = Fx.fx1[Option]

// compute with this stack
val map: Map[String, Int] =
  Map("key1" -> 10, "key2" -> 20)

// get 2 keys from the map and add the corresponding values
def addKeys(key1: String, key2: String): Eff[S, Int] = for {
  a <- fromOption(map.get(key1))
  b <- fromOption(map.get(key2))
} yield a + b

(addKeys("key1", "key2").runOption.run, addKeys("key1", "missing").runOption.run)

> (Some(30),None)