fix #48 flows
This commit is contained in:
		
							parent
							
								
									1a90b25b1e
								
							
						
					
					
						commit
						9aae33d564
					
				@ -160,23 +160,32 @@ Great: the generator is not executed until collected bu the `f.take()` call, whi
 | 
			
		||||
 | 
			
		||||
Important difference from the channels or like, every time you collect the flow, you collect it anew:
 | 
			
		||||
 | 
			
		||||
    var isStarted = false
 | 
			
		||||
    val f = flow {
 | 
			
		||||
            emit("start")
 | 
			
		||||
            isStarted = true
 | 
			
		||||
            (1..4).forEach { emit(it) }
 | 
			
		||||
    }
 | 
			
		||||
    // flow is not yet started, e.g. not got execited, 
 | 
			
		||||
    // that is called 'cold':
 | 
			
		||||
    assertEquals( false, isStarted )
 | 
			
		||||
 | 
			
		||||
    // let's collect flow:
 | 
			
		||||
    val result = []
 | 
			
		||||
    for( x in f ) result += x
 | 
			
		||||
    println(result)
 | 
			
		||||
 | 
			
		||||
    // let's collect it once again:
 | 
			
		||||
    assertEquals( true, isStarted)
 | 
			
		||||
 | 
			
		||||
    // let's collect it once again, it should be the same:
 | 
			
		||||
    println(f.toList())
 | 
			
		||||
 | 
			
		||||
    // and again:
 | 
			
		||||
    //assertEquals( result, f.toList() )
 | 
			
		||||
    assertEquals( result, f.toList() )
 | 
			
		||||
 | 
			
		||||
    >>> ["start", 1, 2, 3, 4]
 | 
			
		||||
    >>> ["start", 1, 2, 3, 4]
 | 
			
		||||
    >>> void
 | 
			
		||||
 | 
			
		||||
1
 | 
			
		||||
Notice that flow's lambda is not called until actual collection is started. Cold flows are
 | 
			
		||||
better in terms of resource consumption.
 | 
			
		||||
 | 
			
		||||
@ -23,10 +23,7 @@ class ObjFlowBuilder(val output: SendChannel<Obj>) : Obj() {
 | 
			
		||||
        val type = object : ObjClass("FlowBuilder") {}.apply {
 | 
			
		||||
            addFn("emit") {
 | 
			
		||||
                val data = requireOnlyArg<Obj>()
 | 
			
		||||
                println("well well $data")
 | 
			
		||||
                try {
 | 
			
		||||
                    println("builder ${thisAs<ObjFlowBuilder>().hashCode()}")
 | 
			
		||||
                    println("channel ${thisAs<ObjFlowBuilder>().output.hashCode()}")
 | 
			
		||||
                    val channel = thisAs<ObjFlowBuilder>().output
 | 
			
		||||
                    if( !channel.isClosedForSend )
 | 
			
		||||
                        channel.send(data)
 | 
			
		||||
@ -74,7 +71,6 @@ class ObjFlow(val producer: Statement) : Obj() {
 | 
			
		||||
            }
 | 
			
		||||
        }.apply {
 | 
			
		||||
            addFn("iterator") {
 | 
			
		||||
                println("called iterator!")
 | 
			
		||||
                ObjFlowIterator(thisAs<ObjFlow>().producer)
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@ -90,28 +90,20 @@ class TestCoroutines {
 | 
			
		||||
    fun testFlow2() = runTest {
 | 
			
		||||
        eval("""
 | 
			
		||||
                val f = flow {
 | 
			
		||||
                    println("Starting generator")
 | 
			
		||||
                        emit("start")
 | 
			
		||||
                        emit("start2")
 | 
			
		||||
                        println("Emitting")
 | 
			
		||||
                        (1..4).forEach { 
 | 
			
		||||
//                            println("you hoo "+it)
 | 
			
		||||
                            emit(it) 
 | 
			
		||||
                        }
 | 
			
		||||
                        println("Done emitting")
 | 
			
		||||
                }
 | 
			
		||||
                // let's collect flow:
 | 
			
		||||
                val result = []
 | 
			
		||||
//                for( x in f ) result += x
 | 
			
		||||
                println(result)
 | 
			
		||||
            
 | 
			
		||||
                for( x in f ) result += x
 | 
			
		||||
                    println(result)
 | 
			
		||||
                
 | 
			
		||||
                // let's collect it once again:
 | 
			
		||||
                println(f.toList())
 | 
			
		||||
                println(f.toList())
 | 
			
		||||
//                for( x in f ) println(x)
 | 
			
		||||
//                for( x in f ) println(x)
 | 
			
		||||
            
 | 
			
		||||
                //assertEquals( result, f.toList() )
 | 
			
		||||
                assertEquals( result, f.toList())
 | 
			
		||||
                assertEquals( result, f.toList())
 | 
			
		||||
        """.trimIndent())
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user