suztomoの日記

To be a good software engineer

Evaluate iteratee:

Divergent are iteratees which never become Done state, not even when it is receiving EOF.

*Main> run $ enum diverge "abcadf"
Nothing
diverge :: IterV el Int
diverge = Cont step where
    step :: (StreamG el -> IterV el Int)
    step e = Cont step
run $ enum diverge "abcadf"

-- This step is bound to diverge
run $ enum (Cont step) "abcadf"

run $ enum (step (El 'a')) "bcadf"

run $ enum (Cont step) "bcadf"

run $ enum (Cont step) "bcadf"

run $ enum (step (El 'b')) "cadf"

run $ enum (Cont step) "cadf"

run $ enum (step (El 'c')) "adf"

run $ enum (Cont step) "adf"

run $ enum (step (El 'a')) "adf"
...

run $ enum (Cont step) "f"

run $ enum (step (El 'f')) []

-- Enum returns the iteratee when the feeding array becomes empty
run $ (step (El 'f'))

run $ Cont step

-- using the secodn rule of run
run' (step EOF)

run' (Cont step)

-- Usign the second rule of run'
Nothing