/
ContextRequest.scala
52 lines (46 loc) · 1.96 KB
/
ContextRequest.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
* Copyright 2013 http4s.org
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.http4s
import cats._
import cats.syntax.all._
import cats.data.Kleisli
final case class ContextRequest[F[_], A](context: A, req: Request[F]) {
def mapK[G[_]](fk: F ~> G): ContextRequest[G, A] =
ContextRequest(context, req.mapK(fk))
@deprecated("Use context instead", "0.21.0")
def authInfo: A = context
}
object ContextRequest {
def apply[F[_]: Functor, T](
getContext: Request[F] => F[T]): Kleisli[F, Request[F], ContextRequest[F, T]] =
Kleisli(request => getContext(request).map(ctx => ContextRequest(ctx, request)))
implicit def contextRequestInstances[F[_]]: NonEmptyTraverse[ContextRequest[F, *]] =
new NonEmptyTraverse[ContextRequest[F, *]] {
override def foldLeft[A, B](fa: ContextRequest[F, A], b: B)(f: (B, A) => B): B =
f(b, fa.context)
override def foldRight[A, B](fa: ContextRequest[F, A], lb: Eval[B])(
f: (A, Eval[B]) => Eval[B]): Eval[B] =
f(fa.context, lb)
override def nonEmptyTraverse[G[_]: Apply, A, B](fa: ContextRequest[F, A])(
f: A => G[B]): G[ContextRequest[F, B]] =
f(fa.context).map(b => ContextRequest(b, fa.req))
def reduceLeftTo[A, B](fa: ContextRequest[F, A])(f: A => B)(g: (B, A) => B): B =
f(fa.context)
def reduceRightTo[A, B](fa: ContextRequest[F, A])(f: A => B)(
g: (A, Eval[B]) => Eval[B]): Eval[B] =
Eval.later(f(fa.context))
}
}