packages feed

compactable 0.1.1.1 → 0.1.2.0

raw patch · 2 files changed

+64/−24 lines, 2 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Control.Compactable: instance (Control.Arrow.ArrowApply a, Control.Arrow.ArrowPlus a) => Control.Compactable.CompactFold (Control.Arrow.ArrowMonad a)
- Control.Compactable: instance (Control.Arrow.ArrowApply a, Control.Arrow.ArrowPlus a) => Control.Compactable.Compactable (Control.Arrow.ArrowMonad a)
- Control.Compactable: instance GHC.Base.Alternative f => GHC.Base.Alternative (Control.Compactable.MonadSum f)
- Control.Compactable: instance GHC.Base.Applicative f => GHC.Base.Applicative (Control.Compactable.MonadSum f)
- Control.Compactable: instance GHC.Base.Functor f => GHC.Base.Functor (Control.Compactable.MonadSum f)
- Control.Compactable: instance GHC.Base.Monad f => GHC.Base.Monad (Control.Compactable.MonadSum f)
- Control.Compactable: instance GHC.Base.MonadPlus f => GHC.Base.MonadPlus (Control.Compactable.MonadSum f)
- Control.Compactable: instance GHC.Base.MonadPlus f => GHC.Base.Monoid (Control.Compactable.MonadSum f a)
+ Control.Compactable: instance (Control.Arrow.ArrowPlus a, Control.Arrow.ArrowApply a) => Control.Compactable.CompactFold (Control.Arrow.ArrowMonad a)
+ Control.Compactable: instance (Control.Arrow.ArrowPlus a, Control.Arrow.ArrowApply a) => Control.Compactable.Compactable (Control.Arrow.ArrowMonad a)
+ Control.Compactable: instance (Control.Compactable.Compactable f, GHC.Base.Alternative f, GHC.Base.Monad f, Control.Compactable.Compactable g, GHC.Base.Alternative g, GHC.Base.Monad g) => Control.Compactable.CompactFold (Data.Functor.Product.Product f g)
+ Control.Compactable: instance (GHC.Base.Alternative a, GHC.Base.Monad a) => Control.Compactable.CompactFold (Data.Monoid.Alt a)
+ Control.Compactable: instance (GHC.Base.Alternative a, GHC.Base.Monad a) => Control.Compactable.CompactFold (GHC.Generics.Rec1 a)
+ Control.Compactable: instance (GHC.Base.Alternative f, GHC.Base.Monad f) => Control.Compactable.CompactFold (GHC.Generics.M1 i c f)
+ Control.Compactable: instance (GHC.Base.Alternative f, GHC.Base.Monad f, GHC.Base.Alternative g, GHC.Base.Monad g) => Control.Compactable.CompactFold (f GHC.Generics.:*: g)
+ Control.Compactable: instance (GHC.Base.Functor a, GHC.Base.Functor b) => Control.Compactable.Compactable (a GHC.Generics.:*: b)
+ Control.Compactable: instance (GHC.Base.Functor f, GHC.Base.Functor g) => Control.Compactable.Compactable (f GHC.Generics.:.: g)
+ Control.Compactable: instance (GHC.Base.Monoid m, Control.Monad.Trans.Error.Error m) => Control.Compactable.CompactFold (Data.Either.Either m)
+ Control.Compactable: instance Control.Compactable.CompactFold Control.Applicative.ZipList
+ Control.Compactable: instance Control.Compactable.CompactFold Data.Proxy.Proxy
+ Control.Compactable: instance Control.Compactable.CompactFold Data.Semigroup.Option
+ Control.Compactable: instance Control.Compactable.CompactFold GHC.Generics.U1
+ Control.Compactable: instance Control.Compactable.CompactFold GHC.Types.IO
+ Control.Compactable: instance Control.Compactable.Compactable Control.Applicative.ZipList
+ Control.Compactable: instance Control.Compactable.Compactable GHC.Generics.U1
+ Control.Compactable: instance GHC.Base.Alternative f => GHC.Base.Alternative (Control.Compactable.AltSum f)
+ Control.Compactable: instance GHC.Base.Alternative f => GHC.Base.Monoid (Control.Compactable.AltSum f a)
+ Control.Compactable: instance GHC.Base.Applicative f => GHC.Base.Applicative (Control.Compactable.AltSum f)
+ Control.Compactable: instance GHC.Base.Functor a => Control.Compactable.Compactable (Data.Monoid.Alt a)
+ Control.Compactable: instance GHC.Base.Functor a => Control.Compactable.Compactable (GHC.Generics.Rec1 a)
+ Control.Compactable: instance GHC.Base.Functor f => Control.Compactable.Compactable (GHC.Generics.M1 i c f)
+ Control.Compactable: instance GHC.Base.Functor f => GHC.Base.Functor (Control.Compactable.AltSum f)
+ Control.Compactable: instance GHC.Base.Monad a => Control.Compactable.Compactable (Control.Applicative.WrappedMonad a)
+ Control.Compactable: instance GHC.Base.MonadPlus a => Control.Compactable.CompactFold (Control.Applicative.WrappedMonad a)
- Control.Compactable: compactFold :: (CompactFold f, MonadPlus f, Foldable g) => f (g a) -> f a
+ Control.Compactable: compactFold :: (CompactFold f, Monad f, Alternative f, Foldable g) => f (g a) -> f a
- Control.Compactable: mfold' :: (Foldable f, MonadPlus m) => f a -> m a
+ Control.Compactable: mfold' :: (Foldable f, Alternative m) => f a -> m a
- Control.Compactable: mlefts :: (Bifoldable f, MonadPlus m) => f a b -> m a
+ Control.Compactable: mlefts :: (Bifoldable f, Alternative m) => f a b -> m a
- Control.Compactable: mrights :: (Bifoldable f, MonadPlus m) => f a b -> m b
+ Control.Compactable: mrights :: (Bifoldable f, Alternative m) => f a b -> m b
- Control.Compactable: separateFold :: (CompactFold f, MonadPlus f, Bifoldable g) => f (g a b) -> (f a, f b)
+ Control.Compactable: separateFold :: (CompactFold f, Monad f, Alternative f, Bifoldable g) => f (g a b) -> (f a, f b)

Files

compactable.cabal view
@@ -1,5 +1,5 @@ name:                compactable-version:             0.1.1.1+version:             0.1.2.0 synopsis:            A typeclass for structures which can be catMaybed, filtered, and partitioned. description:         This provides polymorphic implimentations for filter, compact (catMaybes), and separate. It allows for higher performance implimentations to be used in place of defaults for all data structures, and endeavors to centerally document those implimentations. Compactable aims to be as general and unconstrained as possible, providing instances for non-Functors like Set, as well as some Contravariants (though not published here). Compactable fully subsumes Data.Witherable, offers more laws, and is more general. license:             BSD3
src/Control/Compactable.hs view
@@ -1,8 +1,11 @@ {-# LANGUAGE ConstrainedClassMethods    #-} {-# LANGUAGE DefaultSignatures          #-}+{-# LANGUAGE FlexibleContexts           #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures             #-} {-# LANGUAGE LambdaCase                 #-}+{-# LANGUAGE StandaloneDeriving         #-}+{-# LANGUAGE TypeOperators              #-}  module Control.Compactable   (@@ -34,7 +37,8 @@  import           Control.Applicative import           Control.Arrow-import           Control.Monad                   (MonadPlus (..), join)+import           Control.Monad                   (MonadPlus, join)+import           Control.Monad.Trans.Error       (Error) import           Control.Monad.Trans.Except import           Control.Monad.Trans.Maybe import           Data.Bifoldable@@ -46,12 +50,14 @@ import qualified Data.IntMap                     as IntMap import qualified Data.Map                        as Map import           Data.Maybe+import           Data.Monoid import           Data.Proxy import           Data.Semigroup import qualified Data.Sequence                   as Seq import qualified Data.Set                        as Set import qualified Data.Vector                     as V import           GHC.Conc+import           GHC.Generics import           Text.ParserCombinators.ReadP import           Text.ParserCombinators.ReadPrec @@ -274,6 +280,9 @@       go []     = pure []     {-# INLINE traverseMaybe #-} +instance Compactable ZipList where+  compact (ZipList xs) = ZipList $ compact xs+ instance Compactable IO where     compact = altDefaultCompact     {-# INLINABLE compact #-}@@ -295,7 +304,15 @@     {-# INLINABLE applyMaybe #-}     bindMaybe _ _ = Proxy     {-# INLINABLE bindMaybe #-}+    fmapEither _ _ = (Proxy, Proxy)+    {-# INLINABLE fmapEither #-}+    applyEither _ _ = (Proxy, Proxy)+    {-# INLINABLE applyEither #-}+    bindEither _ _ = (Proxy, Proxy)+    {-# INLINABLE bindEither #-} +instance Compactable U1+ instance Compactable Option where     compact (Option x) = Option (join x)     {-# INLINABLE compact #-}@@ -366,8 +383,16 @@     {-# INLINABLE compact #-}     fmapMaybe _ (Const r) = Const r     {-# INLINABLE fmapMaybe #-}+    applyMaybe _ (Const r) = Const r+    {-# INLINABLE applyMaybe #-}     bindMaybe (Const r) _ = Const r     {-# INLINABLE bindMaybe #-}+    fmapEither _ (Const r) = (Const r, Const r)+    {-# INLINABLE fmapEither #-}+    applyEither _ (Const r) = (Const r, Const r)+    {-# INLINABLE applyEither #-}+    bindEither (Const r) _ = (Const r, Const r)+    {-# INLINABLE bindEither #-}     filter _ (Const r) = Const r     {-# INLINABLE filter #-} @@ -379,25 +404,26 @@     filter = Set.filter     {-# INLINABLE filter  #-} -instance (ArrowApply a, ArrowPlus a) => Compactable (ArrowMonad a) where-    compact = compactFold-    {-# INLINE compact #-}-    separate = separateFold-    {-# INLINE separate #-}-+instance (ArrowPlus a, ArrowApply a) => Compactable (ArrowMonad a) where+instance Monad a => Compactable (WrappedMonad a) where+instance Functor a => Compactable (Rec1 a) where+instance Functor a => Compactable (Alt a) where+instance (Functor a, Functor b) => Compactable (a :*: b)+instance Functor f => Compactable (M1 i c f)+instance (Functor f, Functor g) => Compactable (f :.: g) -newtype MonadSum f a = MonadSum { unMonadSum :: f a }-    deriving (Functor, Applicative, Alternative, Monad, MonadPlus)+newtype AltSum f a = AltSum { unAltSum :: f a }+    deriving (Functor, Applicative, Alternative) -instance MonadPlus f => Monoid (MonadSum f a) where-    mempty = mzero-    MonadSum a `mappend` MonadSum b = MonadSum (mplus a b)+instance Alternative f => Monoid (AltSum f a) where+    mempty = empty+    AltSum a `mappend` AltSum b = AltSum (a <|> b)   {-| class `CompactFold` provides the same methods as `Compactable` but generalized to work on any `Foldable`. -When a type has MonadPlus (or similar) properties, we can extract the Maybe and the Either, and generalize to Foldable and Bifoldable.+When a type has Alternative (or similar) properties, we can extract the Maybe and the Either, and generalize to Foldable and Bifoldable.  Compactable can always be described in terms of CompactFold, because @@ -411,12 +437,12 @@ -} class Compactable f => CompactFold (f :: * -> *) where     compactFold :: Foldable g => f (g a) -> f a-    default compactFold :: (MonadPlus f, Foldable g) => f (g a) -> f a+    default compactFold :: (Monad f, Alternative f, Foldable g) => f (g a) -> f a     compactFold = (>>= mfold')     {-# INLINEABLE compactFold #-}      separateFold :: Bifoldable g => f (g a b) -> (f a, f b)-    default separateFold :: (MonadPlus f, Bifoldable g) => f (g a b) -> (f a, f b)+    default separateFold :: (Monad f, Alternative f, Bifoldable g) => f (g a b) -> (f a, f b)     separateFold xs = (xs >>= mlefts, xs >>= mrights)     {-# INLINEABLE separateFold #-} @@ -453,25 +479,39 @@     {-# INLINABLE traverseBifold #-}  -mfold' :: (Foldable f, MonadPlus m) => f a -> m a-mfold' = unMonadSum . foldMap (MonadSum . pure)+mfold' :: (Foldable f, Alternative m) => f a -> m a+mfold' = unAltSum . foldMap (AltSum . pure) -mlefts :: (Bifoldable f, MonadPlus m) => f a b -> m a-mlefts = unMonadSum . bifoldMap (MonadSum . pure) (const mempty)+mlefts :: (Bifoldable f, Alternative m) => f a b -> m a+mlefts = unAltSum . bifoldMap (AltSum . pure) (const mempty) -mrights :: (Bifoldable f, MonadPlus m) => f a b -> m b-mrights = unMonadSum . bifoldMap (const mempty) (MonadSum . pure)+mrights :: (Bifoldable f, Alternative m) => f a b -> m b+mrights = unAltSum . bifoldMap (const mempty) (AltSum . pure)   instance CompactFold [] where-    compactFold = concat . fmap F.toList+    compactFold = (>>= F.toList)     {-# INLINEABLE compactFold #-}  instance CompactFold Maybe+instance (Monoid m, Error m) => CompactFold (Either m)+instance CompactFold IO instance CompactFold ReadP instance CompactFold ReadPrec instance CompactFold STM-instance (ArrowApply a, ArrowPlus a) => CompactFold (ArrowMonad a)+instance CompactFold ZipList where+  compactFold (ZipList xs) = ZipList $ compactFold xs+  separateFold (ZipList xs) = bimap ZipList ZipList $ separateFold xs+instance CompactFold Option+instance CompactFold U1+instance CompactFold Proxy+instance (ArrowPlus a, ArrowApply a) => CompactFold (ArrowMonad a)+instance MonadPlus a => CompactFold (WrappedMonad a)+instance (Alternative a, Monad a) => CompactFold (Rec1 a)+instance (Alternative a, Monad a) => CompactFold (Alt a)+instance (Alternative f, Monad f, Alternative g, Monad g) => CompactFold (f :*: g)+instance (Compactable f, Alternative f, Monad f, Compactable g, Alternative g, Monad g) => CompactFold (FP.Product f g)+instance (Alternative f, Monad f) => CompactFold (M1 i c f)   fforMaybe :: (Compactable f, Functor f) => f a -> (a -> Maybe b) -> f b