data-fix 0.3.1 → 0.3.2
raw patch · 3 files changed
+89/−7 lines, 3 filesdep ~basedep ~deepseqdep ~hashablenew-uploaderPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: base, deepseq, hashable, transformers, transformers-compat
API changes (from Hackage documentation)
+ Data.Fix: unwrapFix :: Fix f -> f (Fix f)
+ Data.Fix: unwrapMu :: Functor f => Mu f -> f (Mu f)
+ Data.Fix: unwrapNu :: Functor f => Nu f -> f (Nu f)
+ Data.Fix: wrapFix :: f (Fix f) -> Fix f
+ Data.Fix: wrapMu :: Functor f => f (Mu f) -> Mu f
+ Data.Fix: wrapNu :: Functor f => f (Nu f) -> Nu f
Files
- CHANGELOG.md +9/−0
- data-fix.cabal +6/−5
- src/Data/Fix.hs +74/−2
CHANGELOG.md view
@@ -1,3 +1,12 @@+## 0.3.2++- Add `(un)wrapFix/Mu/Nu`+- Support `transformers-0.6`++## 0.3.1++- Update bounds for GHC-9.0+ ## 0.3.0 - Rename `cata`, `ana` and `hylo` into `foldFix`, `unfoldFix` and `refold.
data-fix.cabal view
@@ -1,5 +1,5 @@ Name: data-fix-Version: 0.3.1+Version: 0.3.2 Cabal-Version: >= 1.10 License: BSD3 License-file: LICENSE@@ -29,8 +29,9 @@ || ==8.2.2 || ==8.4.4 || ==8.6.5- || ==8.8.3- || ==8.10.1+ || ==8.8.4+ || ==8.10.4+ || ==9.0.1 extra-source-files: CHANGELOG.md@@ -64,5 +65,5 @@ if !impl(ghc >=8.0) build-depends:- transformers >=0.3 && <0.6- , transformers-compat >=0.6.5 && <0.7+ transformers >=0.3 && <0.7+ , transformers-compat >=0.6.5 && <0.8
src/Data/Fix.hs view
@@ -57,16 +57,22 @@ hoistFix', foldFix, unfoldFix,+ wrapFix,+ unwrapFix, -- * Mu - least fixed point Mu (..), hoistMu, foldMu, unfoldMu,+ wrapMu,+ unwrapMu, -- * Nu - greatest fixed point Nu (..), hoistNu, foldNu, unfoldNu,+ wrapNu,+ unwrapNu, -- * Refolding refold, -- * Monadic variants@@ -84,7 +90,7 @@ import Prelude (Eq (..), Functor (..), Monad (..), Ord (..), Read (..), Show (..), showParen, showString, ($), (.), (=<<)) #ifdef __GLASGOW_HASKELL__-#if! HAS_POLY_TYPEABLE+#if !HAS_POLY_TYPEABLE import Prelude (const, error, undefined) #endif #endif@@ -110,7 +116,7 @@ -- $setup -- >>> :set -XDeriveFunctor--- >>> import Prelude (showChar, Int, Num (..))+-- >>> import Prelude -- >>> import Data.Functor.Classes -- >>> data ListF a b = Nil | Cons a b deriving (Show, Functor) --@@ -158,6 +164,28 @@ unfoldFix :: Functor f => (a -> f a) -> a -> Fix f unfoldFix f = go where go = Fix . fmap go . f +-- | Wrap 'Fix'.+--+-- >>> let x = unfoldFix (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> wrapFix (Cons 10 x)+-- Fix (Cons 10 (Fix (Cons 0 (Fix (Cons 1 (Fix (Cons 2 (Fix Nil))))))))+--+-- @since 0.3.2+--+wrapFix :: f (Fix f) -> Fix f+wrapFix = Fix++-- | Unwrap 'Fix'.+--+-- >>> let x = unfoldFix (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> unwrapFix x+-- Cons 0 (Fix (Cons 1 (Fix (Cons 2 (Fix Nil)))))+--+-- @since 0.3.2+--+unwrapFix :: Fix f -> f (Fix f)+unwrapFix = unFix+ ------------------------------------------------------------------------------- -- Functor instances -------------------------------------------------------------------------------@@ -275,6 +303,28 @@ unfoldMu :: Functor f => (a -> f a) -> a -> Mu f unfoldMu f x = Mu $ \mk -> refold mk f x +-- | Wrap 'Mu'.+--+-- >>> let x = unfoldMu (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> wrapMu (Cons 10 x)+-- unfoldMu unFix (Fix (Cons 10 (Fix (Cons 0 (Fix (Cons 1 (Fix (Cons 2 (Fix Nil)))))))))+--+-- @since 0.3.2+--+wrapMu :: Functor f => f (Mu f) -> Mu f+wrapMu fx = Mu $ \f -> f (fmap (foldMu f) fx)++-- | Unwrap 'Mu'.+--+-- >>> let x = unfoldMu (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> unwrapMu x+-- Cons 0 (unfoldMu unFix (Fix (Cons 1 (Fix (Cons 2 (Fix Nil))))))+--+-- @since 0.3.2+--+unwrapMu :: Functor f => Mu f -> f (Mu f)+unwrapMu = foldMu (fmap wrapMu)+ ------------------------------------------------------------------------------- -- Nu -------------------------------------------------------------------------------@@ -319,6 +369,28 @@ -- unfoldNu unFix (Fix (Cons 0 (Fix (Cons 1 (Fix (Cons 2 (Fix (Cons 3 (Fix Nil))))))))) unfoldNu :: (a -> f a) -> a -> Nu f unfoldNu = Nu++-- | Wrap 'Nu'.+--+-- >>> let x = unfoldNu (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> wrapNu (Cons 10 x)+-- unfoldNu unFix (Fix (Cons 10 (Fix (Cons 0 (Fix (Cons 1 (Fix (Cons 2 (Fix Nil)))))))))+--+-- @since 0.3.2+--+wrapNu :: Functor f => f (Nu f) -> Nu f+wrapNu = unfoldNu (fmap unwrapNu)++-- | Unwrap 'Nu'.+--+-- >>> let x = unfoldNu (\i -> if i < 3 then Cons i (i + 1) else Nil) (0 :: Int)+-- >>> unwrapNu x+-- Cons 0 (unfoldNu unFix (Fix (Cons 1 (Fix (Cons 2 (Fix Nil))))))+--+-- @since 0.3.2+--+unwrapNu :: Functor f => Nu f -> f (Nu f)+unwrapNu (Nu f x) = fmap (Nu f) (f x) ------------------------------------------------------------------------------- -- refold