+
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 0 additions & 15 deletions calico/src/main/scala/calico/html/HtmlTag.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ import cats.effect.kernel.Resource
import cats.effect.syntax.all.*
import cats.syntax.all.*
import org.scalajs.dom
import shapeless3.deriving.K0

final class HtmlTag[F[_], E] private[calico] (name: String, void: Boolean)(using F: Async[F]):

Expand All @@ -32,18 +31,4 @@ final class HtmlTag[F[_], E] private[calico] (name: String, void: Boolean)(using
def withSelf[M](mkModifier: E => M)(using M: Modifier[F, E, M]): Resource[F, E] =
build.toResource.flatTap(e => M.modify(mkModifier(e), e))

def apply[M <: Tuple](modifiers: M)(
using inst: K0.ProductInstances[Modifier[F, E, _], M]): Resource[F, E] =
inst.foldLeft(modifiers)(build.toResource) {
[a] => (r: Resource[F, E], m: Modifier[F, E, a], a: a) => r.flatTap(m.modify(a, _))
}

def withSelf[M <: Tuple](mkModifiers: E => M)(
using inst: K0.ProductInstances[Modifier[F, E, _], M]): Resource[F, E] =
build.toResource.flatTap { e =>
inst.foldLeft(mkModifiers(e))(Resource.pure(e)) {
[a] => (r: Resource[F, E], m: Modifier[F, E, a], a: a) => r.flatTap(m.modify(a, _))
}
}

private def build = F.delay(dom.document.createElement(name).asInstanceOf[E])
46 changes: 31 additions & 15 deletions calico/src/main/scala/calico/html/Modifier.scala
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import cats.effect.syntax.all.*
import cats.syntax.all.*
import fs2.concurrent.Signal
import org.scalajs.dom
import shapeless3.deriving.K0

trait Modifier[F[_], E, A]:
outer =>
Expand All @@ -37,6 +38,28 @@ trait Modifier[F[_], E, A]:
(b: B, e: E) => outer.modify(f(b), e)

object Modifier:
inline given forUnit[F[_], E]: Modifier[F, E, Unit] =
_forUnit.asInstanceOf[Modifier[F, E, Unit]]

private val _forUnit: Modifier[Id, Any, Unit] =
(_, _) => Resource.unit

given forTuple[F[_], E, M <: Tuple](
using inst: K0.ProductInstances[Modifier[F, E, _], M]
): Modifier[F, E, M] = (m, e) =>
inst.foldLeft(m)(Resource.unit[F]) {
[a] => (r: Resource[F, Unit], m: Modifier[F, E, a], a: a) => r *> m.modify(a, e)
}

given forOption[F[_], E, A](using M: Modifier[F, E, A]): Modifier[F, E, Option[A]] =
(as, e) => as.foldMapM(M.modify(_, e)).void

given forList[F[_], E, A](using M: Modifier[F, E, A]): Modifier[F, E, List[A]] =
(as, e) => as.foldMapM(M.modify(_, e)).void

given forResource[F[_], E, A](using M: Modifier[F, E, A]): Modifier[F, E, Resource[F, A]] =
(a, e) => a.flatMap(M.modify(_, e))

inline given [F[_], E]: Contravariant[Modifier[F, E, _]] =
_contravariant.asInstanceOf[Contravariant[Modifier[F, E, _]]]
private val _contravariant: Contravariant[Modifier[Id, Any, _]] = new:
Expand All @@ -62,11 +85,6 @@ object Modifier:
}

private trait Modifiers[F[_]](using F: Async[F]):
inline given forUnit[E]: Modifier[F, E, Unit] =
_forUnit.asInstanceOf[Modifier[F, E, Unit]]

private val _forUnit: Modifier[F, Any, Unit] =
(_, _) => Resource.unit

inline given forString[E <: fs2.dom.Node[F]]: Modifier[F, E, String] =
_forString.asInstanceOf[Modifier[F, E, String]]
Expand Down Expand Up @@ -99,20 +117,18 @@ private trait Modifiers[F[_]](using F: Async[F]):
private val _forStringOptionSignal: Modifier[F, dom.Node, Signal[F, Option[String]]] =
_forStringSignal.contramap(_.map(_.getOrElse("")))

given forResource[E <: fs2.dom.Node[F], A](
using M: Modifier[F, E, A]): Modifier[F, E, Resource[F, A]] =
(a, e) => a.flatMap(M.modify(_, e))
inline given forNode[N <: fs2.dom.Node[F], N2 <: fs2.dom.Node[F]]: Modifier[F, N, N2] =
_forNode.asInstanceOf[Modifier[F, N, N2]]

given forFoldable[E <: fs2.dom.Node[F], G[_]: Foldable, A](
using M: Modifier[F, E, A]): Modifier[F, E, G[A]] =
(ga, e) => ga.foldMapM(M.modify(_, e)).void
private val _forNode: Modifier[F, dom.Node, dom.Node] = (n2, n) =>
Resource.eval(F.delay(n.appendChild(n2)))

inline given forNode[N <: fs2.dom.Node[F], N2 <: fs2.dom.Node[F]]
inline given forNodeResource[N <: fs2.dom.Node[F], N2 <: fs2.dom.Node[F]]
: Modifier[F, N, Resource[F, N2]] =
_forNode.asInstanceOf[Modifier[F, N, Resource[F, N2]]]
_forNodeResource.asInstanceOf[Modifier[F, N, Resource[F, N2]]]

private val _forNode: Modifier[F, dom.Node, Resource[F, dom.Node]] = (n2, n) =>
n2.evalMap(n2 => F.delay(n.appendChild(n2)))
private val _forNodeResource: Modifier[F, dom.Node, Resource[F, dom.Node]] =
Modifier.forResource(using _forNode)

inline given forNodeSignal[
N <: fs2.dom.Node[F],
Expand Down
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载