import "JavaBuiltin" as Java importJava "java.util.Iterator" where data T a hasNext :: T a -> Boolean next :: T a -> a remove :: T a -> () @inline iter :: (a -> b) -> T a -> () iter f it = loop () where loop _ = if hasNext it then do f (next it) loop () else () @inline iterI :: (Integer -> a -> b) -> T a -> () iterI f it = loop 0 where loop i = if hasNext it then do f i (next it) loop (Java.iadd i 1) else () @inline iterB :: (a -> Boolean) -> T a -> Boolean iterB f it = loop () where loop _ = if hasNext it then if f (next it) then loop () else False else True @inline filter :: (a -> Boolean) -> T a -> () filter f it = loop () where loop _ = if hasNext it then do if f (next it) then () else remove it loop () else () @inline mapFirst :: (a -> Maybe b) -> T a -> Maybe b mapFirst f it = loop () where loop _ = if hasNext it then match f (next it) with Nothing -> loop () r -> r else Nothing @inline fold :: (a -> b -> a) -> a -> T b -> a fold f init it = loop init where loop cur = if hasNext it then loop (f cur (next it)) else cur importJava "java.lang.Iterable" where data Iterable a iterator :: Iterable a -> T a