Skip to content

Commit 1446b71

Browse files
committed
Disable significant indentation
1 parent 84ff584 commit 1446b71

22 files changed

+638
-166
lines changed

.scalafmt.conf

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
runner.dialect = scala3
2-
version = "3.5.0"
2+
runner.dialectOverride.allowSignificantIndentation = false
3+
version = "3.7.2"
34
maxColumn = 140
45
align.preset = some
56
align.tokens.add = [

app/src/main/scala/com/kubukoz/next/Analysis.scala

+29-8
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,46 @@ import cats.implicits.*
88
import cats.effect.kernel.MonadCancel
99

1010
trait Analysis[F[_]] {
11-
def getAnalysis(trackUri: TrackUri): F[GetAudioAnalysisOutput]
11+
12+
def getAnalysis(
13+
trackUri: TrackUri
14+
): F[GetAudioAnalysisOutput]
15+
1216
}
1317

1418
object Analysis {
1519

16-
def apply[F[_]](implicit F: Analysis[F]): Analysis[F] = F
20+
def apply[F[_]](
21+
implicit F: Analysis[F]
22+
): Analysis[F] = F
23+
24+
def instance[F[_]: SpotifyApi]: Analysis[F] = new {
1725

18-
def instance[F[_]: SpotifyApi]: Analysis[F] = new:
19-
def getAnalysis(trackUri: TrackUri): F[GetAudioAnalysisOutput] = SpotifyApi[F].getAudioAnalysis(trackUri.id)
26+
def getAnalysis(
27+
trackUri: TrackUri
28+
): F[GetAudioAnalysisOutput] = SpotifyApi[F].getAudioAnalysis(trackUri.id)
29+
30+
}
2031

2132
// "best-effort" cache of the underlying instance. Only has one slot and no concurrency guarantees.
22-
def cached[F[_]: Ref.Make](underlying: Analysis[F])(using MonadCancel[F, ?]): F[Analysis[F]] = {
33+
def cached[F[_]: Ref.Make](
34+
underlying: Analysis[F]
35+
)(
36+
using MonadCancel[F, ?]
37+
): F[Analysis[F]] = {
2338
enum State {
2439
case Initial
25-
case HasResult(key: TrackUri, result: GetAudioAnalysisOutput)
40+
case HasResult(
41+
key: TrackUri,
42+
result: GetAudioAnalysisOutput
43+
)
2644
}
2745

2846
Ref[F].of(State.Initial: State).map { state =>
29-
new:
30-
def getAnalysis(trackUri: TrackUri): F[GetAudioAnalysisOutput] = MonadCancel[F].uncancelable { poll =>
47+
new {
48+
def getAnalysis(
49+
trackUri: TrackUri
50+
): F[GetAudioAnalysisOutput] = MonadCancel[F].uncancelable { poll =>
3151
poll(state.get.flatMap {
3252
case State.HasResult(`trackUri`, result) => result.pure[F]
3353
case _ => underlying.getAnalysis(trackUri)
@@ -37,6 +57,7 @@ object Analysis {
3757
.as(analysis)
3858
}
3959
}
60+
}
4061
}
4162
}
4263

app/src/main/scala/com/kubukoz/next/ConfigLoader.scala

+32-9
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,40 @@ import fs2.io.file.Path
1717
import fs2.io.file.Flags
1818

1919
trait ConfigLoader[F[_]] {
20-
def saveConfig(config: Config): F[Unit]
20+
21+
def saveConfig(
22+
config: Config
23+
): F[Unit]
24+
2125
def loadConfig: F[Config]
2226
}
2327

2428
object ConfigLoader {
25-
def apply[F[_]](using F: ConfigLoader[F]): ConfigLoader[F] = F
29+
30+
def apply[F[_]](
31+
using F: ConfigLoader[F]
32+
): ConfigLoader[F] = F
2633

2734
def cached[F[_]: Ref.Make: FlatMap]: ConfigLoader[F] => F[ConfigLoader[F]] =
2835
underlying =>
2936
underlying.loadConfig.flatMap(Ref[F].of(_)).map { ref =>
3037
new ConfigLoader[F] {
31-
def saveConfig(config: Config): F[Unit] = underlying.saveConfig(config) *> ref.set(config)
38+
def saveConfig(
39+
config: Config
40+
): F[Unit] = underlying.saveConfig(config) *> ref.set(config)
3241
val loadConfig: F[Config] = ref.get
3342
}
3443
}
3544

36-
def withCreateFileIfMissing[F[_]: UserOutput: Console: MonadThrow](configPath: Path): ConfigLoader[F] => ConfigLoader[F] = {
45+
def withCreateFileIfMissing[F[_]: UserOutput: Console: MonadThrow](
46+
configPath: Path
47+
): ConfigLoader[F] => ConfigLoader[F] = {
3748

3849
val validInput = "Y"
3950

40-
def askToCreateFile(originalException: NoSuchFileException): F[Config] =
51+
def askToCreateFile(
52+
originalException: NoSuchFileException
53+
): F[Config] =
4154
for {
4255
_ <- UserOutput[F].print(UserMessage.ConfigFileNotFound(configPath, validInput))
4356
_ <- Console[F].readLine.map(_.trim).ensure(originalException)(_.equalsIgnoreCase(validInput))
@@ -64,11 +77,17 @@ object ConfigLoader {
6477
UserOutput[F].print(UserMessage.SavedConfig(configPath))
6578
}
6679

67-
def saveConfig(config: Config): F[Unit] = underlying.saveConfig(config)
80+
def saveConfig(
81+
config: Config
82+
): F[Unit] = underlying.saveConfig(config)
6883
}
6984
}
7085

71-
def default[F[_]: Files: MonadThrow](configPath: Path)(using fs2.Compiler[F, F]): ConfigLoader[F] =
86+
def default[F[_]: Files: MonadThrow](
87+
configPath: Path
88+
)(
89+
using fs2.Compiler[F, F]
90+
): ConfigLoader[F] =
7291
new ConfigLoader[F] {
7392

7493
private val createOrOverwriteFile: Pipe[F, Byte, Nothing] = bytes =>
@@ -77,7 +96,9 @@ object ConfigLoader {
7796
Files[F].writeAll(configPath, Flags.Write)
7897
)
7998

80-
def saveConfig(config: Config): F[Unit] =
99+
def saveConfig(
100+
config: Config
101+
): F[Unit] =
81102
fs2
82103
.Stream
83104
.emit(config)
@@ -97,6 +118,8 @@ object ConfigLoader {
97118

98119
}
99120

100-
extension [F[_]: Applicative](cl: ConfigLoader[F]) def configAsk: Config.Ask[F] = Config.askLiftF(cl.loadConfig)
121+
extension [F[_]: Applicative](
122+
cl: ConfigLoader[F]
123+
) def configAsk: Config.Ask[F] = Config.askLiftF(cl.loadConfig)
101124

102125
}

app/src/main/scala/com/kubukoz/next/Login.scala

+20-5
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,32 @@ import fs2.io.net.Network
1515

1616
trait Login[F[_]] {
1717
def server: F[OAuth.Tokens]
18-
def refreshToken(token: RefreshToken): F[Token]
18+
19+
def refreshToken(
20+
token: RefreshToken
21+
): F[Token]
22+
1923
}
2024

2125
object Login {
22-
def apply[F[_]](using F: Login[F]): Login[F] = F
26+
27+
def apply[F[_]](
28+
using F: Login[F]
29+
): Login[F] = F
2330

2431
def ember[F[_]: UserOutput: Config.Ask: Network: Async](
2532
oauth: OAuth[F]
2633
): Login[F] =
2734
new Login[F] {
2835

29-
def refreshToken(token: RefreshToken): F[Token] = oauth.refreshToken(token)
36+
def refreshToken(
37+
token: RefreshToken
38+
): F[Token] = oauth.refreshToken(token)
3039

31-
def mkServer(config: Config, route: HttpRoutes[F]) =
40+
def mkServer(
41+
config: Config,
42+
route: HttpRoutes[F]
43+
) =
3244
EmberServerBuilder
3345
.default[F]
3446
.withHttpApp(route.orNotFound)
@@ -57,7 +69,10 @@ object Login {
5769

5870
}
5971

60-
def routes[F[_]: MonadThrow](saveCode: OAuth.Code => F[Unit], finishServer: F[Unit]): HttpRoutes[F] = {
72+
def routes[F[_]: MonadThrow](
73+
saveCode: OAuth.Code => F[Unit],
74+
finishServer: F[Unit]
75+
): HttpRoutes[F] = {
6176
val dsl = new Http4sDsl[F] {}
6277
import dsl.*
6378

app/src/main/scala/com/kubukoz/next/LoginProcess.scala

+26-6
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,20 @@ trait LoginProcess[F[_]] {
1414
}
1515

1616
object LoginProcess {
17-
def apply[F[_]](using F: LoginProcess[F]): LoginProcess[F] = F
17+
18+
def apply[F[_]](
19+
using F: LoginProcess[F]
20+
): LoginProcess[F] = F
1821

1922
def instance[F[_]: UserOutput: ConfigLoader: Monad](
2023
loginAlg: Login[F],
21-
tokensLens: Lens[Config, (Option[Token], Option[RefreshToken])]
24+
tokensLens: Lens[
25+
Config,
26+
(
27+
Option[Token],
28+
Option[RefreshToken]
29+
)
30+
]
2231
): LoginProcess[F] = new LoginProcess[F] {
2332

2433
def login: F[Unit] = for {
@@ -31,19 +40,28 @@ object LoginProcess {
3140

3241
}
3342

34-
given [F[_]: Applicative]: Monoid[LoginProcess[F]] with
43+
given [F[_]: Applicative]: Monoid[LoginProcess[F]] with {
3544

3645
override val empty: LoginProcess[F] = new LoginProcess[F] {
3746
val login: F[Unit] = Applicative[F].unit
3847
}
3948

40-
override def combine(x: LoginProcess[F], y: LoginProcess[F]): LoginProcess[F] = new LoginProcess[F] {
49+
override def combine(
50+
x: LoginProcess[F],
51+
y: LoginProcess[F]
52+
): LoginProcess[F] = new LoginProcess[F] {
4153
val login: F[Unit] = x.login *> y.login
4254
}
4355

44-
extension [F[_]: Monad](loginProcess: LoginProcess[F])
56+
}
57+
58+
extension [F[_]: Monad](
59+
loginProcess: LoginProcess[F]
60+
) {
4561

46-
def orRefresh(refresh: RefreshTokenProcess[F]): LoginProcess[F] = new LoginProcess[F] {
62+
def orRefresh(
63+
refresh: RefreshTokenProcess[F]
64+
): LoginProcess[F] = new LoginProcess[F] {
4765

4866
override val login: F[Unit] =
4967
refresh
@@ -55,4 +73,6 @@ object LoginProcess {
5573

5674
}
5775

76+
}
77+
5878
}

app/src/main/scala/com/kubukoz/next/Main.scala

+15-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,11 @@ enum Choice {
2727
case Login
2828
case SkipTrack
2929
case DropTrack
30-
case FastForward(percentage: Int)
30+
31+
case FastForward(
32+
percentage: Int
33+
)
34+
3135
case JumpSection
3236
case Switch
3337
case Move
@@ -74,7 +78,13 @@ object Main extends CommandIOApp(name = "spotify-next", header = "spotify-next:
7478
rawClient: Client[F],
7579
oauthKernel: OAuth.Kernel[F]
7680
)(
77-
tokensLens: Lens[Config, (Option[Token], Option[RefreshToken])]
81+
tokensLens: Lens[
82+
Config,
83+
(
84+
Option[Token],
85+
Option[RefreshToken]
86+
)
87+
]
7888
) = {
7989
val login = Login.ember[F](OAuth.fromKernel[F](rawClient, oauthKernel))
8090

@@ -134,7 +144,9 @@ object Main extends CommandIOApp(name = "spotify-next", header = "spotify-next:
134144
.map(_.split("\\s+").toList)
135145
.onComplete(fs2.Stream.exec(IO.println("Bye!")))
136146

137-
def reportError(e: Throwable): IO[Unit] =
147+
def reportError(
148+
e: Throwable
149+
): IO[Unit] =
138150
Console[IO].errorln("Command failed with exception: ") *> IO(e.printStackTrace())
139151

140152
fs2.Stream.exec(IO.println("Loading REPL...")) ++

0 commit comments

Comments
 (0)