diff --git a/Util.hs b/Util.hs
--- a/Util.hs
+++ b/Util.hs
@@ -7,7 +7,7 @@
 import Data.Foldable hiding (maximumBy, minimumBy)
 import Data.Function (flip)
 import Data.Functor.Classes
-import Data.List.NonEmpty (NonEmpty (..))
+import Data.List.NonEmpty (NonEmpty (..), (<|))
 import qualified Data.List.NonEmpty as NE
 import Data.Maybe
 import Data.Semigroup
@@ -131,3 +131,10 @@
 maximumBy, minimumBy :: Foldable f => (a -> a -> Ordering) -> f a -> Maybe a
 maximumBy f = foldr (\ a -> Just . fromMaybe a & \ b -> case f a b of GT -> a; _ -> b) Nothing
 minimumBy f = foldr (\ a -> Just . fromMaybe a & \ b -> case f a b of LT -> a; _ -> b) Nothing
+
+foldMapA :: (Applicative p, Monoid b, Foldable f) => (a -> p b) -> f a -> p b
+foldMapA f = foldr (liftA2 (<>) . f) (pure mempty)
+
+iterateM :: Monad m => Natural -> (a -> m a) -> a -> m (NonEmpty a)
+iterateM 0 _ x = pure (x:|[])
+iterateM k f x = (x <|) <$> (f x >>= iterateM (pred k) f)
diff --git a/Util/Bits.hs b/Util/Bits.hs
new file mode 100644
--- /dev/null
+++ b/Util/Bits.hs
@@ -0,0 +1,13 @@
+module Util.Bits where
+
+import Data.Bits
+import Data.Bool
+import Prelude ((==), (+), fromIntegral, id)
+import qualified Prelude
+
+(.&¬) :: Bits a => a -> a -> a
+a .&¬ b = a .&. complement b
+
+setBits :: (Bits a, Prelude.Integral n) => a -> [n]
+setBits = go 0 where go n a | zeroBits == a `shiftR` fromIntegral n = []
+                            | True = bool id (n:) (testBit a (fromIntegral n)) (go (n+1) a)
diff --git a/util.cabal b/util.cabal
--- a/util.cabal
+++ b/util.cabal
@@ -1,5 +1,5 @@
 name:                util
-version:             0.1.6.0
+version:             0.1.7.0
 synopsis:            Utilities
 -- description:         
 license:             BSD3
@@ -13,6 +13,7 @@
 
 library
   exposed-modules:     Util
+                     , Util.Bits
   -- other-modules:       
   -- other-extensions:    
   build-depends:       base >=4.9 && <5
