/* * Copyright (C) 2022 The Android Open Source Project * * 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 com.android.libraries.pcc.chronicle.api.cantrip /** * A [Cantrip] is a transformation of [Data], represented as a function mapping that data to a * mutated or null version of itself. */ interface Cantrip { /** Applies the [Cantrip] across a single [datum]. */ operator fun invoke(datum: Data): Data? } /** * Applies the [Cantrip] across all items in the [sequence]. * * If a given return value from the [Cantrip] is null, the data is omitted from the sequence. */ operator fun Cantrip.invoke(sequence: Sequence): Sequence = sequence.mapNotNull(::invoke) /** Applies the [Cantrip] across all items in the [List]. */ operator fun Cantrip.invoke(list: List): List = invoke(list.asSequence()).toList() /** Applies the [Cantrip] across all items in the [Set]. */ operator fun Cantrip.invoke(set: Set): Set = invoke(set.asSequence()).toSet()