40 lines
1.2 KiB
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)
|
|
}
|
|
|
|
}
|