Skip to content

Commit

Permalink
Merge branch 'wip/vector'
Browse files Browse the repository at this point in the history
  • Loading branch information
stew committed Apr 17, 2016
2 parents 51e25f6 + b10ed9e commit 159637d
Show file tree
Hide file tree
Showing 19 changed files with 630 additions and 29 deletions.
2 changes: 1 addition & 1 deletion build.sbt
Expand Up @@ -4,7 +4,7 @@ name := "dogs"

organization in Global := "org.typelevel"

scalaVersion in Global := "2.11.7"
scalaVersion in Global := "2.11.8"

resolvers in Global += Resolver.sonatypeRepo("snapshots")

Expand Down
2 changes: 1 addition & 1 deletion core/src/main/scala/dogs/Dequeue.scala
Expand Up @@ -3,6 +3,7 @@ package dogs
import Predef._
import cats._
import scala.{annotation,unchecked}
import cats.{Eq,Eval}

/**
* A Double-ended queue, based on the Bankers Double Ended Queue as
Expand Down Expand Up @@ -260,7 +261,6 @@ private[dogs] case object EmptyDequeue extends Dequeue[Nothing] { self =>

private[dogs] trait DequeueEqual[A] extends Eq[Dequeue[A]] {
implicit def A: Eq[A]

final override def eqv(a: Dequeue[A], b: Dequeue[A]): Boolean =
Eq[Streaming[A]].eqv(a.toStreaming, b.toStreaming)
}
Expand Down
5 changes: 5 additions & 0 deletions core/src/main/scala/dogs/List.scala
Expand Up @@ -7,6 +7,10 @@ import scala.annotation.{tailrec}
import dogs.syntax.birds._
import cats._

import org.scalacheck.Prop
import Prop._


/**
* Immutable, singly-linked list implementation.
*
Expand Down Expand Up @@ -470,6 +474,7 @@ sealed trait ListInstances extends ListInstances1 {
override def combine(l: List[A], r: List[A]) = l ::: r
}


implicit val listInstance: Traverse[List] with MonadCombine[List] with CoflatMap[List] =
new Traverse[List] with MonadCombine[List] with CoflatMap[List] {

Expand Down
4 changes: 2 additions & 2 deletions core/src/main/scala/dogs/Option.scala
Expand Up @@ -217,10 +217,10 @@ trait OptionInstances extends OptionInstances1 {
override def pure[A](x: A): Option[A] = Some(x)

override def map[A, B](fa: Option[A])(f: A => B): Option[B] =
fa.map(f)
fa map f

override def flatMap[A, B](fa: Option[A])(f: A => Option[B]): Option[B] =
fa.flatMap(f)
fa flatMap f

override def map2[A, B, Z](fa: Option[A], fb: Option[B])(f: (A, B) => Z): Option[Z] =
fa.flatMap(a => fb.map(b => f(a, b)))
Expand Down
1 change: 1 addition & 0 deletions core/src/main/scala/dogs/Set.scala
Expand Up @@ -5,6 +5,7 @@ import cats.{Eval,Order,Semigroup}
import cats.std.int._
import scala.annotation.tailrec
import scala.math
import cats.{Eval,Order,Semigroup}

/**
* An immutable, ordered, extesntional Set
Expand Down
3 changes: 3 additions & 0 deletions core/src/main/scala/dogs/syntax/foldable.scala
Expand Up @@ -17,6 +17,9 @@ final class FoldableOps[F[_], A](fa: F[A])(implicit F: Foldable[F]) {
lb.run
}

def toDogsVector: Vector[A] =
F.foldLeft[A, Vector[A]](fa, Vector.empty)(_ :+ _)

def toDogsMap[K,V](implicit K: Order[K], ev: A =:= (K,V)): Map[K,V] = {
F.foldLeft(fa, Map.empty[K,V])(_ + _)
}
Expand Down
6 changes: 3 additions & 3 deletions docs/src/site/index.md
Expand Up @@ -13,9 +13,9 @@ standard library.

### EXPERIMENTAL

This project is in its infancy, it should be considered pre-alpha, it
might never go anywhere, it could change drastically along the way if
it does go somewhere.
This project is in its infancy, it should be considered beta

### DATA STRUCTURES

Here is a list of the current structures present in dogs:

Expand Down
12 changes: 7 additions & 5 deletions tests/build.sbt
Expand Up @@ -3,11 +3,11 @@ import ScoverageSbtPlugin.ScoverageKeys._
name := "dogs-tests"

libraryDependencies ++= Seq (
"org.typelevel" %%% "cats-laws" % "0.4.1",
// "org.scalactic" %%% "scalactic" % "2.2.6",
"org.scalacheck" %%% "scalacheck" % "1.12.4",
"org.typelevel" %%% "discipline" % "0.4",
"org.scalatest" %%% "scalatest" % "3.0.0-M7" % "test",
"org.typelevel" %%% "cats-laws" % "0.4.1",
"org.scalacheck" %%% "scalacheck" % "1.12.4",
"org.scalatest" %%% "scalatest" % "3.0.0-M7" % "test",
"org.typelevel" %%% "catalysts-platform" % "0.0.2" % "test",
"org.typelevel" %%% "discipline" % "0.4" % "test",
compilerPlugin("org.spire-math" %% "kind-projector" % "0.6.3")
)

Expand Down Expand Up @@ -35,3 +35,5 @@ scalacOptions in (Compile, console) ~= (_.filterNot(Set("-Ywarn-unused-import","
scalacOptions in (Test, console) <<= (scalacOptions in (Compile, console))

coverageExcludedPackages := "dogs\\.tests\\.arbitrary\\..*"

testOptions in Test += Tests.Argument(TestFrameworks.ScalaTest, "-oDF")
18 changes: 18 additions & 0 deletions tests/src/main/scala/dogs/tests/arbitrary/ArbitraryVector.scala
@@ -0,0 +1,18 @@
package dogs
package tests.arbitrary

import Predef._
import org.scalacheck.{Gen, Arbitrary, Shrink}, Arbitrary.arbitrary

trait ArbitraryVector {
def vectorGen[A](implicit arbA: Arbitrary[A]): Gen[Vector[A]] =
Gen.listOf[A](arbitrary(arbA)).map(l => Vector(l:_*))

implicit def arbitraryVector[A: Arbitrary]: Arbitrary[Vector[A]] =
Arbitrary(vectorGen)

implicit def shrinkVector[A]: Shrink[Vector[A]] = Shrink { l =>
import scala.collection.immutable.{Vector => SVector}
implicitly[Shrink[SVector[A]]].shrink(l.toScalaVector).map(v => Vector(v:_*))
}
}
1 change: 1 addition & 0 deletions tests/src/main/scala/dogs/tests/arbitrary/all.scala
Expand Up @@ -7,3 +7,4 @@ trait AllArbitrary
with ArbitraryISet
with ArbitraryOption
with ArbitraryStreaming
with ArbitraryVector
1 change: 1 addition & 0 deletions tests/src/main/scala/dogs/tests/arbitrary/package.scala
Expand Up @@ -9,4 +9,5 @@ package object arbitrary {
object iset extends ArbitraryISet
object option extends ArbitraryOption
object streaming extends ArbitraryStreaming
object vector extends ArbitraryVector
}
4 changes: 4 additions & 0 deletions tests/src/test/scala/DListSpec.scala
Expand Up @@ -9,12 +9,16 @@ import cats.std.int._
import cats.laws.discipline.{TraverseTests, CoflatMapTests, MonadCombineTests, SerializableTests, CartesianTests}
import org.scalacheck._
import org.scalacheck.Prop.{forAll,secure}
import algebra.laws.{GroupLaws, OrderLaws}

class DListSpec extends SlowDogsSuite {
import DList._
import arbitrary.list._
import arbitrary.dlist._

checkAll("DList[Int]", GroupLaws[DList[Int]].monoid)
checkAll("DList[Int]", OrderLaws[DList[Int]].eqv)

checkAll("MonadCombine[DList]", MonadCombineTests[DList].monadCombine[Int,Int,Int])
checkAll("MonadCombine[DList]", SerializableTests.serializable(MonadCombine[DList]))
checkAll("Traverse[DList]", TraverseTests[DList].traverse[Int, Int, Int, DList[Int], Option, Option])
Expand Down
2 changes: 1 addition & 1 deletion tests/src/test/scala/DietSpec.scala
Expand Up @@ -6,7 +6,7 @@ import org.scalacheck.Prop.forAll
import org.scalacheck._
import org.scalatest.{FlatSpec, Matchers}
import syntax.range._
import algebra.Order
import cats.Order
import algebra.std.int._

import scala.Predef
Expand Down
2 changes: 1 addition & 1 deletion tests/src/test/scala/DogMatcher.scala
Expand Up @@ -4,7 +4,7 @@
package dogs
package tests

import algebra.Order
import cats.Order
import algebra.std.int._
import org.scalatest.matchers.{MatchResult, Matcher}
import dogs.Predef._
Expand Down
32 changes: 21 additions & 11 deletions tests/src/test/scala/DogsSuite.scala
@@ -1,13 +1,20 @@
package dogs
package tests

import Predef._

import catalysts.Platform

import cats._

import org.scalactic.anyvals.{PosZDouble, PosInt}
import org.scalatest.{FunSuite, PropSpec, Matchers}
import org.typelevel.discipline.scalatest.Discipline
import org.scalatest.prop.{Configuration, GeneratorDrivenPropertyChecks}
import org.typelevel.discipline.scalatest.Discipline

import org.scalacheck.{Arbitrary, Gen}

import scala.util.{Failure, Success, Try}

trait TestSettings extends Configuration with Matchers {

Expand All @@ -23,23 +30,26 @@ trait TestSettings extends Configuration with Matchers {

trait DogsSuite extends FunSuite
with Matchers
with DogMatcher
with GeneratorDrivenPropertyChecks
with TestSettings
with Discipline
with DogMatcher
with StrictDogsEquality {

implicit def eqTuple3[A: Eq, B: Eq, C: Eq](implicit A: Eq[A], B: Eq[B], C: Eq[C]): Eq[(A,B,C)] = new Eq[(A,B,C)] {
def eqv(l: (A,B,C), r: (A,B,C)) =
A.eqv(l._1, r._1) &&
B.eqv(l._2, r._2) &&
C.eqv(l._3, r._3)
}
implicit override val generatorDrivenConfig: PropertyCheckConfiguration =
checkConfiguration

implicit def eqTuple2[A: Eq, B: Eq](implicit A: Eq[A], B: Eq[B]): Eq[(A,B)] = new Eq[(A,B)] {
implicit def eqTuple2[A: Eq, B: Eq]: Eq[(A,B)] = new Eq[(A,B)] {
def eqv(l: (A,B), r: (A,B)) =
A.eqv(l._1, r._1) &&
B.eqv(l._2, r._2)
Eq[A].eqv(l._1, r._1) &&
Eq[B].eqv(l._2, r._2)
}

implicit def eqTuple3[A: Eq, B: Eq, C: Eq]: Eq[(A,B,C)] = new Eq[(A,B,C)] {
def eqv(l: (A,B,C), r: (A,B,C)) =
Eq[A].eqv(l._1, r._1) &&
Eq[B].eqv(l._2, r._2) &&
Eq[C].eqv(l._3,r._3)
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/src/test/scala/ListMatcherSpec.scala
Expand Up @@ -6,7 +6,7 @@ package dogs
package tests

import dogs.Predef._
import algebra.Order
import cats.Order
import algebra.std.int._
import org.scalatest.{FlatSpec, Matchers}

Expand Down
17 changes: 15 additions & 2 deletions tests/src/test/scala/ListSpec.scala
Expand Up @@ -9,17 +9,30 @@ import scala.collection.immutable.{Nil,List=>SList,::}
import cats.std.int._
import cats.laws.discipline.{TraverseTests, CoflatMapTests, ComonadTests, MonadCombineTests, FoldableTests/*, ReducibleTests*/,SerializableTests, CartesianTests}
import cats.laws.discipline.arbitrary._
import cats.laws.discipline.eq._
import algebra.laws.{GroupLaws, OrderLaws}

class ListSpec extends DogsSuite {
import List._

implicit val xx: Eq[Int] = implicitly[Eq[Int]]

implicit val yy: Eq[(Int,Int,Int)] = eqTuple3

implicit val zz: Eq[List[(Int,Int,Int)]] = List.listEq

checkAll("Monoid[List[Int]]", GroupLaws[List[Int]].monoid)
checkAll("List[Int]", OrderLaws[List[Int]].eqv)

checkAll("List[Int]", CartesianTests[List].cartesian[Int, Int, Int])
checkAll("Cartesian[List]", SerializableTests.serializable(Cartesian[List]))

checkAll("List[Int]", CoflatMapTests[List].coflatMap[Int, Int, Int])
checkAll("CoflatMap[List]", SerializableTests.serializable(CoflatMap[List]))

checkAll("List[Int]", MonadCombineTests[List].monadCombine[Int, Int, Int])
checkAll("MonadCombine[List]", SerializableTests.serializable(MonadCombine[List]))

checkAll("List[Int] with Option", TraverseTests[List].traverse[Int, Int, Int, List[Int], Option, Option])
checkAll("Traverse[List]", SerializableTests.serializable(Traverse[List]))

Expand Down
2 changes: 1 addition & 1 deletion tests/src/test/scala/MapSpec.scala
Expand Up @@ -7,7 +7,7 @@ import org.scalacheck.Arbitrary.{arbitrary=>getArbitrary,_}
import org.scalacheck.Prop._
import org.scalatest._
import dogs.tests.arbitrary._
import algebra.Order
import cats.Order
import algebra.std.int._
import algebra.std.string._

Expand Down

0 comments on commit 159637d

Please sign in to comment.