packages feed

util 0.1.13.0 → 0.1.14.0

raw patch · 3 files changed

+44/−3 lines, 3 filesdep +transformersPVP ok

version bump matches the API change (PVP)

Dependencies added: transformers

API changes (from Hackage documentation)

+ Util: count :: (Traversable f, Enum n) => f a -> f (n, a)
+ Util: countFrom :: (Traversable f, Enum n) => n -> f a -> f (n, a)
+ Util: loopM :: MonadFix m => (a -> m (a, b)) -> m b
+ Util.Bits: fromListBE :: Bits a => [Bool] -> a
+ Util.Bits: fromListLE :: Bits a => [Bool] -> a
+ Util.Bits: interleaveBits :: (Bits a, Bits b) => [a] -> b
+ Util.Bits: toListBE :: FiniteBits a => a -> [Bool]
+ Util.Bits: toListLE :: Bits a => a -> [Bool]

Files

Util.hs view
@@ -3,14 +3,17 @@ import Control.Applicative import Control.Category import Control.Monad+import Control.Monad.Fix+import Control.Monad.Trans.State (state, evalState) import Data.Bool import Data.Foldable hiding (maximumBy, minimumBy)-import Data.Function (flip)+import Data.Function (($), flip) import Data.Functor.Classes import Data.List.NonEmpty (NonEmpty (..)) import qualified Data.List.NonEmpty as NE import Data.Maybe import Data.Semigroup+import Data.Tuple (snd) import Data.Monoid (Monoid (..)) import Numeric.Natural @@ -173,6 +176,9 @@ iterateM 0 _ x = pure (x:|[]) iterateM k f x = (x NE.<|) <$> (f x >>= iterateM (pred k) f) +loopM :: MonadFix m => (a -> m (a, b)) -> m b+loopM f = fmap snd . mfix $ \ (a, _) -> f a+ infixl 3 <|, |>  (<|) :: Alternative f => a -> f a -> f a@@ -180,3 +186,9 @@  (|>) :: Alternative f => f a -> a -> f a xs |> x = xs <|> pure x++count :: (Traversable f, Enum n) => f a -> f (n, a)+count = countFrom (toEnum 0)++countFrom :: (Traversable f, Enum n) => n -> f a -> f (n, a)+countFrom n = flip evalState n . traverse (\ a -> state $ \ k -> ((k, a), succ k))
Util/Bits.hs view
@@ -1,9 +1,13 @@ module Util.Bits where  import Control.Applicative+import Control.Category import Data.Bits import Data.Bool-import Prelude ((==), (+), fromIntegral, id)+import Data.Foldable (Foldable (..))+import Data.List ((++), concat, repeat, take, transpose)+import Data.Maybe (Maybe (..), fromMaybe)+import Prelude (($), (==), (+), (-), compare, fmap, fromIntegral) import qualified Prelude import Util @@ -14,3 +18,26 @@ setBits = altMap pure ∘ go 0   where go n a | zeroBits == a `shiftR` fromIntegral n = []                | True = bool id (n:) (testBit a (fromIntegral n)) (go (n+1) a)++interleaveBits :: (Bits a, Bits b) => [a] -> b+interleaveBits = fromListLE . concat . transpose . pad False . fmap toListLE+  where+    pad :: a -> [[a]] -> [[a]]+    pad a₀ ass = [take l $ as ++ repeat a₀ | as <- ass]+      where l = fromMaybe 0 $ maximumBy compare (length <$> ass)++fromListLE :: Bits a => [Bool] -> a+fromListLE = foldr (\ b a -> bool zeroBits (bit 0) b .|. shiftL a 1) zeroBits++toListLE :: Bits a => a -> [Bool]+toListLE a | Just l <- bitSizeMaybe a = testBit a <$> [0..l-1]+           | otherwise = go a+  where+    go a | zeroBits == a = []+         | otherwise = testBit a 0 : go (shiftR a 1)++fromListBE :: Bits a => [Bool] -> a+fromListBE = foldl' (\ a b -> shiftL a 1 .|. bool zeroBits (bit 0) b) zeroBits++toListBE :: FiniteBits a => a -> [Bool]+toListBE a = [testBit a (l - k) | let l = finiteBitSize a, k <- [1..l]]
util.cabal view
@@ -1,5 +1,5 @@ name:                util-version:             0.1.13.0+version:             0.1.14.0 synopsis:            Utilities -- description:          license:             BSD3@@ -19,10 +19,12 @@   -- other-modules:          -- other-extensions:       build-depends:       base >=4.9 && <5+                     , transformers >=0.0.1 && <0.6   -- hs-source-dirs:         default-language:    Haskell2010   default-extensions:  NoImplicitPrelude                      , LambdaCase+                     , MonadComprehensions                      , GeneralizedNewtypeDeriving                      , DeriveFunctor                      , DeriveFoldable