// через приостанавливаемые (suspend) функции 
val fib=sequence {
  var a=1L; var b=1L; var c:Long
  while(true) {
    yield(a)
    c=a+b; a=b; b=c
  }
}
println(fib.take(20).toList())
// через генератор
val intseq1=generateSequence(1){it+1}
println(intseq1.take(10).toList())
println(intseq1.filter{it%2==0}.map{it*it}.take(10).toList()) // квадраты четных чисел
// через класс Lazy
typealias LazyList=Pair<Int,Lazy<Any> >
fun intseq(m:Int):LazyList=LazyList(m, lazy {intseq(m+1)} )
fun take(k:Int, x:LazyList):List<Int> = if(k==0) listOf() else listOf(x.first)+take(k-1, x.second.value as LazyList)
take(10,intseq(1))
