cataquack/cataquack/src/main/scala/tf/bug/cats/Cat.scala

40 lines
1.2 KiB
Scala

package tf.bug.cats
import cats._
import cats.data._
import cats.implicits._
import scalax.collection.Graph
import scalax.collection.GraphPredef._, scalax.collection.GraphEdge._
import tf.bug.cataquack.{Read, Storage}
case class IDCat(id: Int, name: String, friends: Set[Int]) {
def asNode: CatNode = CatNode(id, name)
}
case class CatNode(id: Int, name: String)
object Cat {
def getCats[F[_]: Functor, T](s: Storage[F, T])(implicit read: Read[T, Vector[IDCat]]): F[Vector[IDCat]] = {
s.get("cats").map(read.apply)
}
def getCatGraphFromVec[F[_]: Functor, T](s: Storage[F, T])(implicit read: Read[T, Vector[IDCat]]): F[Graph[CatNode, UnDiEdge]] = {
getCats(s).map(cats => {
val emptyGraph = Graph.empty[CatNode, UnDiEdge]
cats.foldLeft(emptyGraph)((g, nc) => g ++ nc.friends.map(friendID => {
val fc = cats.find(_.id == friendID)
fc.map(rdc => {
val ncd = nc.asNode
val nrd = rdc.asNode
ncd ~ nrd
})
}).filter(_.isDefined).map(_.get))
})
}
def getCatGraph[F[_]: Functor, T](s: Storage[F, T])(implicit read: Read[T, Graph[CatNode, UnDiEdge]]): F[Graph[CatNode, UnDiEdge]] = {
s.get("cats").map(read.apply)
}
}