import "Prelude" as Prelude import "JavaBuiltin" as Java import "Iterator" as Iterator import "Set" as Set import "MList" as MList importJava "java.util.Set" where data T a contains :: T a -> a -> Boolean size :: T a -> Integer isEmpty :: T a -> Boolean add :: T a -> a -> Boolean addAll :: T a -> [a] -> Boolean @JavaName addAll addAllS :: T a -> T a -> Boolean remove :: T a -> a -> Boolean removeAll :: T a -> [a] -> Boolean clear :: T a -> () @private iterator :: T a -> Iterator.T a @inline iter :: (a -> b) -> T a -> () iter f s = Iterator.iter f (iterator s) @inline iterB :: (a -> Boolean) -> T a -> Boolean iterB f s = Iterator.iterB f (iterator s) map :: (a -> b) -> T a -> T b map f set = result where result = createC (size set) iter (\x -> add result (f x)) set @inline mapFirst :: (a -> Maybe b) -> T a -> Maybe b mapFirst f s = Iterator.mapFirst f (iterator s) @inline fold :: (a -> b -> a) -> a -> T b -> a fold f init s = Iterator.fold f init (iterator s) importJava "gnu.trove.set.hash.THashSet" where @JavaName "" create :: () -> T a @JavaName "" createC :: Integer -> T a fromList :: [a] -> T a fromList l = do result = createC (Prelude.length l) Prelude.iter (\x -> Prelude.ignore (add result x)) l result toList :: T a -> [a] toList s = do result = MList.createC (size s) iter (MList.add result) s MList.freeze result singleton :: a -> T a singleton v = do result = createC 1 add result v result @inline freeze :: T a -> Set.T a freeze = Java.unsafeCoerce concatMap :: (a -> T b) -> T a -> T b concatMap f s = result where result = create () iter (\el -> addAllS result (f el)) s all :: (a -> Boolean) -> T a -> Boolean all f s = Iterator.iterB f (iterator s) filterInPlace :: (a -> Boolean) -> T a -> () filterInPlace p s = Iterator.filter p (iterator s)