All Downloads are FREE. Search and download functionalities are using the official Maven repository.

scalaz.syntax.PointedSyntax.scala Maven / Gradle / Ivy

The newest version!
package org.specs2.internal.scalaz
package syntax

/** Wraps a value `self` and provides methods related to `Pointed` */
trait PointedOps[F[_],A] extends Ops[F[A]] {
  implicit def F: Pointed[F]
  ////
  ////
}

trait ToPointedOps0 {
  implicit def ToPointedOpsUnapply[FA](v: FA)(implicit F0: Unapply[Pointed, FA]) =
    new PointedOps[F0.M,F0.A] { def self = F0(v); implicit def F: Pointed[F0.M] = F0.TC }

}

trait ToPointedOps extends ToPointedOps0 with ToFunctorOps {
  implicit def ToPointedOps[F[_],A](v: F[A])(implicit F0: Pointed[F]) =
    new PointedOps[F,A] { def self = v; implicit def F: Pointed[F] = F0 }

  ////
  implicit def PointedIdV[A](v: => A) = new PointedIdV[A] {
    lazy val self = v
  }

  trait PointedIdV[A] extends Ops[A] {
    def point[F[_] : Pointed]: F[A] = Pointed[F].point(self)
    def pure[F[_] : Pointed]: F[A] = Pointed[F].point(self)
    def η[F[_] : Pointed]: F[A] = Pointed[F].point(self)
  }
  ////
}

trait PointedSyntax[F[_]] extends FunctorSyntax[F] { 
  implicit def ToPointedOps[A](v: F[A]): PointedOps[F, A] = new PointedOps[F,A] { def self = v; implicit def F: Pointed[F] = PointedSyntax.this.F }

  def F: Pointed[F]
  ////
  def point[A](a: => A)(implicit F: Pointed[F]): F[A] = F.point(a)

  /** Alias for `point` */
  def pure[A](a: => A)(implicit F: Pointed[F]): F[A] = F.point(a)
  def η[A](a: => A)(implicit F: Pointed[F]): F[A] = F.point(a)

  implicit def PointedIdV[A](v: => A) = new PointedIdV[A] {
    lazy val self = v
  }

  trait PointedIdV[A] extends Ops[A] {
    def point(implicit F: Pointed[F]): F[A] = Pointed[F].point(self)

    /** Alias for `point` */
    def pure(implicit F: Pointed[F]): F[A] = Pointed[F].point(self)

    def η(implicit F: Pointed[F]): F[A] = Pointed[F].point(self)
  }
  ////
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy