associative 0.0.2 → 0.0.3
raw patch · 7 files changed
+55/−20 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Data.Associative.PartialMonoidOp: nonPartialMonoid :: forall a a' p f. (Profunctor p, Functor f) => p (MonoidOp a) (f (MonoidOp a')) -> p (PartialSemigroupOpT (Const a :: Type -> Type) a a, a) (f (PartialSemigroupOpT (Const a' :: Type -> Type) a' a', a'))
+ Data.Associative.PartialSemigroupOp: nonPartialSemigroup :: forall b a b' a' p f. (Profunctor p, Functor f) => p (SemigroupOp a b) (f (SemigroupOp a' b')) -> p (PartialSemigroupOpT (Const b :: Type -> Type) a b) (f (PartialSemigroupOpT (Const b' :: Type -> Type) a' b'))
Files
- associative.cabal +1/−1
- changelog.md +7/−0
- src/Data/Associative.hs +4/−3
- src/Data/Associative/MonoidOp.hs +1/−1
- src/Data/Associative/PartialMonoidOp.hs +13/−1
- src/Data/Associative/PartialSemigroupOp.hs +22/−10
- src/Data/Associative/SemigroupOp.hs +7/−4
associative.cabal view
@@ -1,6 +1,6 @@ cabal-version: 2.4 name: associative-version: 0.0.2+version: 0.0.3 synopsis: Partial Semigroup and Semigroup operations description: Partial Semigroup and Semigroup operations: Associative, Closed, Binary operation which may not be defined for all domains license: BSD-3-Clause
changelog.md view
@@ -1,3 +1,10 @@+0.0.3++* New `nonPartialSemigroup` isomorphism witnessing that `PartialSemigroupOpT (Const b) a b` is isomorphic to `SemigroupOp a b`+* New `nonPartialMonoid` isomorphism converting between `(PartialSemigroupOpT (Const a) a a, a)` and `MonoidOp a`+* Fixed name-shadowing warning in `psemigroupLawAssociative`+* Qualified all imports, ormolu formatting+ 0.0.2 * Wrapper values (`semigroupMaybe`, `semigroupDual`, `semigroupDown`, `semigroupIdentity`, `semigroupTuple`, `semigroupWrappedMonoid`, `semigroupFunction`, and their `psemigroup`/`monoid`/`pmonoid` counterparts) now take an explicit `SemigroupOp'` or `MonoidOp` parameter instead of using `Semigroup`/`Monoid` class constraints
src/Data/Associative.hs view
@@ -221,9 +221,10 @@ -- * @monoidLawAssociative@ / @pmonoidLawAssociative@ -- associativity of the binary operation -- -- * @monoidLawLeftIdentity@ / @pmonoidLawLeftIdentity@, @monoidLawRightIdentity@ / @pmonoidLawRightIdentity@ -- identity element laws-module Data.Associative (- module A-) where+module Data.Associative+ ( module A,+ )+where import Data.Associative.MonoidOp as A import Data.Associative.PartialMonoidOp as A
src/Data/Associative/MonoidOp.hs view
@@ -78,7 +78,7 @@ iso, lens, )-import Data.Associative.SemigroupOp (HasSemigroupOpT (..), SemigroupOp', op, runSemigroupOp, semigroupDual, semigroupDown, semigroupFunction, semigroupIdentity, semigroupLiftA2, semigroupMaybe, semigroupTuple, semigroupWrappedMonoid)+import Data.Associative.SemigroupOp (HasSemigroupOpT (..), SemigroupOp', op, runSemigroupOp, semigroupDown, semigroupDual, semigroupFunction, semigroupIdentity, semigroupLiftA2, semigroupMaybe, semigroupTuple, semigroupWrappedMonoid) import qualified Data.Associative.SemigroupOp as SG (semigroupSemigroup) import Data.Bits (Bits, FiniteBits, complement, xor, zeroBits, (.&.), (.|.)) import Data.Functor.Alt (Alt (..))
src/Data/Associative/PartialMonoidOp.hs view
@@ -13,6 +13,7 @@ -- * Isomorphism iPartialMonoidOp,+ nonPartialMonoid, -- * Running runPartialMonoidOp,@@ -78,27 +79,31 @@ iso, lens, review,+ view, ) import Data.Associative.MonoidOp (MonoidOp (..)) import Data.Associative.PartialSemigroupOp ( HasPartialSemigroupOpT (..), PartialSemigroupOp',+ PartialSemigroupOpT, iPartialSemigroupOp,+ nonPartialSemigroup, psemigroupDown, psemigroupDual, psemigroupFunction, psemigroupIdentity, psemigroupLiftA2, psemigroupMaybe,+ psemigroupSemigroup, psemigroupTuple, psemigroupWrappedMonoid, runPartialSemigroupOp,- psemigroupSemigroup, total, ) import Data.Associative.SemigroupOp (SemigroupOp') import Data.Bits (Bits, FiniteBits, complement, xor, zeroBits, (.&.), (.|.)) import Data.Functor.Alt (Alt (..))+import Data.Functor.Const (Const) import Data.Functor.Identity (Identity (..)) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap@@ -161,6 +166,13 @@ (\(PartialMonoidOp s e) -> (runPartialSemigroupOp s, e)) (\(f, e) -> PartialMonoidOp (review iPartialSemigroupOp f) e) {-# INLINE iPartialMonoidOp #-}++nonPartialMonoid :: Iso (PartialSemigroupOpT (Const a) a a, a) (PartialSemigroupOpT (Const a') a' a', a') (MonoidOp a) (MonoidOp a')+nonPartialMonoid =+ iso+ (\(s, e) -> MonoidOp (view nonPartialSemigroup s) e)+ (\(MonoidOp s e) -> (review nonPartialSemigroup s, e))+{-# INLINE nonPartialMonoid #-} -- | Extract the partial binary operation and run it. --
src/Data/Associative/PartialSemigroupOp.hs view
@@ -21,6 +21,7 @@ -- * Isomorphisms iPartialSemigroupOpT, iPartialSemigroupOp,+ nonPartialSemigroup, -- * Running runPartialSemigroupOpT,@@ -125,10 +126,12 @@ import Control.Monad.State.Class (MonadState (..)) import Control.Monad.Writer.Class (MonadWriter (..)) import Control.Selective (Selective (..), selectM)+import Data.Associative.SemigroupOp (SemigroupOp, SemigroupOp', op, runSemigroupOp) import Data.Bits (Bits, FiniteBits, complement, xor, (.&.), (.|.)) import Data.Functor.Alt (Alt (..)) import Data.Functor.Apply (Apply (..), liftF2) import Data.Functor.Bind (Bind (..))+import Data.Functor.Const (Const (..)) import Data.Functor.Extend (Extend (..)) import Data.Functor.Identity (Identity (..)) import Data.Functor.Plus (Plus (..))@@ -148,7 +151,6 @@ import Data.Profunctor (Choice (..), Profunctor (..), Strong (..)) import Data.Proxy (Proxy) import Data.Semigroup (Dual (..), WrappedMonoid (..))-import Data.Associative.SemigroupOp (SemigroupOp', runSemigroupOp) import Data.Semigroupoid (Semigroupoid (..)) import Data.Set (Set) import qualified Data.Set as Set@@ -223,6 +225,13 @@ (\k -> PartialSemigroupOpT (\a1 a2 -> Identity (k a1 a2))) {-# INLINE iPartialSemigroupOp #-} +nonPartialSemigroup :: Iso (PartialSemigroupOpT (Const b) a b) (PartialSemigroupOpT (Const b') a' b') (SemigroupOp a b) (SemigroupOp a' b')+nonPartialSemigroup =+ iso+ (\k -> op (\a1 a2 -> getConst (runPartialSemigroupOpT k a1 a2)))+ (\k -> totalT (\a1 a2 -> Const (runSemigroupOp k a1 a2)))+{-# INLINE nonPartialSemigroup #-}+ -- | Unwrap a 'PartialSemigroupOpT' to its underlying function. -- -- >>> runPartialSemigroupOpT addPos 3 4@@ -545,15 +554,15 @@ -- >>> runIdentity $ psemigroupLawAssociative addPos (-1) 2 3 -- True psemigroupLawAssociative :: (Monad f, Eq a) => PartialSemigroupOpT' f a -> a -> a -> a -> f Bool-psemigroupLawAssociative (PartialSemigroupOpT op) x y z = do- mxy <- op x y+psemigroupLawAssociative (PartialSemigroupOpT f) x y z = do+ mxy <- f x y lhs <- case mxy of Nothing -> pure Nothing- Just xy -> op xy z- myz <- op y z+ Just xy -> f xy z+ myz <- f y z rhs <- case myz of Nothing -> pure Nothing- Just yz -> op x yz+ Just yz -> f x yz pure (lhs == rhs) -- | 'Semigroup' associativity: @(p '<>' q) '<>' r == p '<>' (q '<>' r)@@@ -731,10 +740,13 @@ -- >>> run (psemigroupMaybe cat) (Just [1 :: Int]) Nothing -- Just (Just [1]) psemigroupMaybe :: SemigroupOp' a -> PartialSemigroupOp' (Maybe a)-psemigroupMaybe s = total (\mx my -> case (mx, my) of- (Nothing, y) -> y- (x, Nothing) -> x- (Just x, Just y) -> Just (runSemigroupOp s x y))+psemigroupMaybe s =+ total+ ( \mx my -> case (mx, my) of+ (Nothing, y) -> y+ (x, Nothing) -> x+ (Just x, Just y) -> Just (runSemigroupOp s x y)+ ) -- | Reverses the inner semigroup. --
src/Data/Associative/SemigroupOp.hs view
@@ -621,10 +621,13 @@ -- >>> run (semigroupMaybe cat) (Just [1 :: Int]) Nothing -- Just [1] semigroupMaybe :: SemigroupOp' a -> SemigroupOp' (Maybe a)-semigroupMaybe s = op (\mx my -> case (mx, my) of- (Nothing, y) -> y- (x, Nothing) -> x- (Just x, Just y) -> Just (runSemigroupOp s x y))+semigroupMaybe s =+ op+ ( \mx my -> case (mx, my) of+ (Nothing, y) -> y+ (x, Nothing) -> x+ (Just x, Just y) -> Just (runSemigroupOp s x y)+ ) -- | First-success on 'Maybe' via 'Alt'. --