Skip to content

Commit 2d2e74d

Browse files
committed
Exploit path dependent types and get generic companion type to work
1 parent 9fc531a commit 2d2e74d

File tree

3 files changed

+23
-33
lines changed

3 files changed

+23
-33
lines changed

core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactory.scala

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -22,36 +22,10 @@ import scala.annotation.implicitNotFound
2222
Implicit not found for LoggerFactory[${F}].
2323
Information can be found here: https://log4cats.github.io/logging-capability.html
2424
""")
25-
trait LoggerFactory[F[_]] extends LoggerFactoryGen[F, SelfAwareStructuredLogger[F]]
26-
object LoggerFactory extends LoggerFactoryCompanion {
27-
def apply[F[_]: LoggerFactory]: LoggerFactory[F] = implicitly
25+
trait LoggerFactory[F[_]] extends LoggerFactoryGen[F] {
26+
type LoggerType = SelfAwareStructuredLogger[F]
2827
}
2928

30-
private[log4cats] trait LoggerFactoryCompanion {
31-
def getLogger[F[_]](implicit
32-
lf: LoggerFactory[F],
33-
name: LoggerName
34-
): SelfAwareStructuredLogger[F] =
35-
lf.getLogger
36-
def getLoggerFromName[F[_]](name: String)(implicit
37-
lf: LoggerFactory[F]
38-
): SelfAwareStructuredLogger[F] =
39-
lf.getLoggerFromName(name)
40-
41-
def getLoggerFromClass[F[_]](clazz: Class[_])(implicit
42-
lf: LoggerFactory[F]
43-
): SelfAwareStructuredLogger[F] =
44-
lf.getLoggerFromClass(clazz)
45-
46-
def create[F[_]](implicit
47-
lf: LoggerFactory[F],
48-
name: LoggerName
49-
): F[SelfAwareStructuredLogger[F]] =
50-
lf.create
51-
def fromName[F[_]](name: String)(implicit lf: LoggerFactory[F]): F[SelfAwareStructuredLogger[F]] =
52-
lf.fromName(name)
53-
def fromClass[F[_]](clazz: Class[_])(implicit
54-
lf: LoggerFactory[F]
55-
): F[SelfAwareStructuredLogger[F]] =
56-
lf.fromClass(clazz)
57-
}
29+
object LoggerFactory extends LoggerFactoryGenCompanion {
30+
def apply[F[_]: LoggerFactory]: LoggerFactory[F] = implicitly
31+
}

core/shared/src/main/scala/org/typelevel/log4cats/LoggerFactoryGen.scala

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,27 @@
1616

1717
package org.typelevel.log4cats
1818

19-
trait LoggerFactoryGen[F[_], LoggerType] {
19+
trait LoggerFactoryGen[F[_]] {
20+
type LoggerType <: Logger[F]
2021
def getLogger(implicit name: LoggerName): LoggerType = getLoggerFromName(name.value)
2122
def getLoggerFromClass(clazz: Class[_]): LoggerType = getLoggerFromName(clazz.getName)
2223
def create(implicit name: LoggerName): F[LoggerType] = fromName(name.value)
2324
def fromClass(clazz: Class[_]): F[LoggerType] = fromName(clazz.getName)
2425
def getLoggerFromName(name: String): LoggerType
2526
def fromName(name: String): F[LoggerType]
2627
}
28+
29+
private[log4cats] trait LoggerFactoryGenCompanion {
30+
def getLogger[F[_]](implicit lf: LoggerFactoryGen[F], name: LoggerName): lf.LoggerType =
31+
lf.getLogger
32+
def getLoggerFromName[F[_]](name: String)(implicit lf: LoggerFactoryGen[F]): lf.LoggerType =
33+
lf.getLoggerFromName(name)
34+
def getLoggerFromClass[F[_]](clazz: Class[_])(implicit lf: LoggerFactoryGen[F]): lf.LoggerType =
35+
lf.getLoggerFromClass(clazz)
36+
def create[F[_]](implicit lf: LoggerFactoryGen[F], name: LoggerName): F[lf.LoggerType] =
37+
lf.create
38+
def fromName[F[_]](name: String)(implicit lf: LoggerFactoryGen[F]): F[lf.LoggerType] =
39+
lf.fromName(name)
40+
def fromClass[F[_]](clazz: Class[_])(implicit lf: LoggerFactoryGen[F]): F[lf.LoggerType] =
41+
lf.fromClass(clazz)
42+
}

slf4j/src/main/scala/org/typelevel/log4cats/slf4j/Slf4jFactory.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ trait Slf4jFactory[F[_]] extends LoggerFactory[F] {
2525
def fromSlf4j(logger: JLogger): F[SelfAwareStructuredLogger[F]]
2626
}
2727

28-
object Slf4jFactory extends LoggerFactoryCompanion {
28+
object Slf4jFactory extends LoggerFactoryGenCompanion {
2929
def apply[F[_]: Slf4jFactory]: Slf4jFactory[F] = implicitly
3030

3131
def getLoggerFromSlf4j[F[_]](logger: JLogger)(implicit

0 commit comments

Comments
 (0)