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) } }