github.com/biogo/biogo@v1.0.4/concurrent/lazy_example_test.go (about) 1 // Copyright ©2011-2012 The bíogo Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package concurrent_test 6 7 import ( 8 "github.com/biogo/biogo/concurrent" 9 10 "fmt" 11 ) 12 13 func ExampleLazily() { 14 sentence := "A sentence to be slowly ROT'ed." 15 16 ROT13 := func(b byte) byte { 17 c := b & ('a' - 'A') 18 i := b&^c - 'A' 19 if i < 26 { 20 return (i+13)%26 + 'A' | c 21 } 22 return b 23 } 24 25 mutator := concurrent.Lazily( 26 func(state ...interface{}) (interface{}, concurrent.State) { 27 b, c := []byte(state[0].(string)), state[1].(int) 28 b[c] = ROT13(b[c]) 29 ms := string(b) 30 return state[0], concurrent.State{ms, (c + 1) % len(ms)} 31 }, 32 0, // No lookahead 33 nil, // Perpetual evaluator 34 sentence, 0, // Initial state 35 ) 36 37 var r string 38 for i := 0; i < len(sentence)*2; i++ { 39 r = mutator().(string) 40 if i%10 == 0 { 41 fmt.Println(r) 42 } 43 } 44 fmt.Println(r) 45 // Output: 46 // A sentence to be slowly ROT'ed. 47 // N fragrapr to be slowly ROT'ed. 48 // N fragrapr gb or fybwly ROT'ed. 49 // N fragrapr gb or fybjyl EBG'rq. 50 // A sentencr gb or fybjyl EBG'rq. 51 // A sentence to be slbjyl EBG'rq. 52 // A sentence to be slowly ROT'eq. 53 // A sentence to be slowly ROT'ed. 54 }