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

atto-compat-cats_2.12.0.5.3.source-code.compat.scala Maven / Gradle / Ivy

package atto.compat

import atto._
import atto.parser.combinator._
import atto.syntax.parser._

import scala.{ List, Either, Left, Right }
import scala.language.higherKinds

import _root_.cats.{ Foldable, Functor, Monad, Monoid, SemigroupK }
import _root_.cats.data.{ NonEmptyList }

object cats extends CatsModes
               with CatsShims
               with CatsInstances

trait CatsModes {

  implicit val StdlibEithery = atto.compat.stdlib.StdlibEithery

  implicit val CatsNonEmptyListy: NonEmptyListy[NonEmptyList] =
    new NonEmptyListy[NonEmptyList] {
      def cons[A](a: A, as: List[A]): NonEmptyList[A] = NonEmptyList(a, as)
      def toList[A](as: NonEmptyList[A]): List[A] = as.head :: as.tail
    }

}

trait CatsShims {

  implicit def CatsFoldy[F[_]](implicit F: Foldable[F]) =
    new Foldy[F] {
      def toList[A](fa: F[A]) = F.toList(fa)
    }

}

trait CatsInstances {

  implicit val ParserMonad: Monad[Parser] =
    new Monad[Parser] {
      def pure[A](a: A): Parser[A] = ok(a)
      def flatMap[A,B](ma: Parser[A])(f: A => Parser[B]) = ma flatMap f
      override def map[A,B](ma: Parser[A])(f: A => B) = ma map f
      def tailRecM[A, B](a: A)(f: A => Parser[Either[A, B]]): Parser[B] =
        f(a).flatMap {
          case Left(a)  => tailRecM(a)(f)
          case Right(b) => pure(b)
        }
    }

  implicit val ParserSemigroupK: SemigroupK[Parser] =
    new SemigroupK[Parser] {
      def combineK[A](a: Parser[A], b: Parser[A]): Parser[A] = a | b
    }

  implicit def ParserMonoid[A]: Monoid[Parser[A]] =
    new Monoid[Parser[A]] {
      def combine(s1: Parser[A], s2: Parser[A]): Parser[A] = s1 | s2
      val empty: Parser[A] = err("zero")
    }

  implicit val ParseResultFunctor: Functor[ParseResult] =
    new Functor[ParseResult] {
      def map[A,B](ma: ParseResult[A])(f: A => B) =
        ma map f
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy