package monocle.std import monocle.function.{At, Empty} import monocle.{Lens, Prism} import scalaz.{ISet, Order} object iset extends ISetInstances trait ISetInstances { implicit def emptyISet[A]: Empty[ISet[A]] = new Empty[ISet[A]] { def empty = Prism[ISet[A], Unit](s => if(s.isEmpty) Some(()) else None)(_ => ISet.empty[A]) } implicit def atISet[A: Order]: At[ISet[A], A, Unit] = new At[ISet[A], A, Unit] { def at(a: A) = Lens[ISet[A], Option[Unit]](s => if(s member a) Some(()) else None)( optA => set => optA.fold(set delete a)(_ => set insert a) ) } }