1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.app.tracing
18 
19 /** Utilities to trace automatically computations happening for each element of a list. */
20 object ListenersTracing {
21 
22     /**
23      * Like [forEach], but outputs a trace for each element.
24      *
25      * The ideal usage of this is to debug what's taking long in a list of Listeners. For example:
26      * ```
27      * listeners.forEach { it.dispatch(state) }
28      * ```
29      *
30      * often it's tricky to udnerstand which listener is causing delays. This can be used instead to
31      * log how much each listener is taking:
32      * ```
33      * listeners.forEachTraced(TAG) { it.dispatch(state) }
34      * ```
35      */
forEachTracednull36     inline fun <T : Any> List<T>.forEachTraced(tag: String = "", f: (T) -> Unit) {
37         forEach { traceSection({ "$tag#${it::javaClass.get().name}" }) { f(it) } }
38     }
39 }
40