1 /* 2 * Copyright 2022 Google LLC 3 * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 package com.google.devtools.ksp 19 20 // TODO: garbage collect underlying sequence after exhaust. 21 class MemoizedSequence<T>(sequence: Sequence<T>) : Sequence<T> { 22 23 private val cache = arrayListOf<T>() 24 <lambda>null25 private val iter: Iterator<T> by lazy { 26 sequence.iterator() 27 } 28 29 private inner class CachedIterator() : Iterator<T> { 30 var idx = 0 hasNextnull31 override fun hasNext(): Boolean { 32 return idx < cache.size || iter.hasNext() 33 } 34 nextnull35 override fun next(): T { 36 if (idx == cache.size) { 37 cache.add(iter.next()) 38 } 39 val value = cache[idx] 40 idx += 1 41 return value 42 } 43 } 44 iteratornull45 override fun iterator(): Iterator<T> { 46 return CachedIterator() 47 } 48 } 49