unfoldable-restricted 0.0.0 → 0.0.1
raw patch · 2 files changed
+78/−4 lines, 2 filesdep +transformersPVP ok
version bump matches the API change (PVP)
Dependencies added: transformers
API changes (from Hackage documentation)
+ Data.Unfoldable.Restricted: allBreadthFirst :: (UnfoldableR Unit t) => [t ()]
+ Data.Unfoldable.Restricted: allDepthFirst :: (UnfoldableR Unit t) => [t ()]
+ Data.Unfoldable.Restricted: allToDepth :: (UnfoldableR Unit t) => Int -> [t ()]
+ Data.Unfoldable.Restricted: biunfoldRestrictBF :: (BiUnfoldableR p q t, Unfolder f, p a, q b) => f a -> f b -> f (t a b)
+ Data.Unfoldable.Restricted: biunfoldRestrictBF_ :: (BiUnfoldableR Unit Unit t, Unfolder f) => f (t () ())
+ Data.Unfoldable.Restricted: biunfoldRestrict_ :: (BiUnfoldableR Unit Unit t, Unfolder f) => f (t () ())
+ Data.Unfoldable.Restricted: biunfoldrRestrict :: (BiUnfoldableR p q t, p a, q b) => (c -> Maybe (a, c)) -> (c -> Maybe (b, c)) -> c -> Maybe (t a b)
+ Data.Unfoldable.Restricted: fromList :: (UnfoldableR p t, p a) => [a] -> Maybe (t a)
+ Data.Unfoldable.Restricted: fromLists :: (BiUnfoldableR p q t, p a, q b) => [a] -> [b] -> Maybe (t a b)
+ Data.Unfoldable.Restricted: leftMost :: (UnfoldableR Unit t) => Maybe (t ())
+ Data.Unfoldable.Restricted: rightMost :: (UnfoldableR Unit t) => Maybe (t ())
+ Data.Unfoldable.Restricted: unfoldRestrictBF :: (UnfoldableR p t, Unfolder f, p a) => f a -> f (t a)
+ Data.Unfoldable.Restricted: unfoldRestrictBF_ :: (UnfoldableR Unit t, Unfolder f) => f (t ())
+ Data.Unfoldable.Restricted: unfoldRestrict_ :: (UnfoldableR Unit t, Unfolder f) => f (t ())
+ Data.Unfoldable.Restricted: unfoldrRestrict :: (UnfoldableR p t, p a) => (b -> Maybe (a, b)) -> b -> Maybe (t a)
Files
src/Data/Unfoldable/Restricted.hs view
@@ -4,11 +4,12 @@ , MultiParamTypeClasses , FunctionalDependencies , FlexibleInstances+ , FlexibleContexts #-} module Data.Unfoldable.Restricted where -import Data.Unfolder (Unfolder (choose))+import Data.Unfolder import Data.Constraint (Constraint) import Data.Constraint.Unit (Unit) @@ -17,16 +18,59 @@ import qualified Data.HashMap.Lazy as HashMap import qualified Data.HashSet as HashSet+import Data.Hashable (Hashable) -import Data.Hashable (Hashable)+import Data.Maybe (maybeToList, isNothing)+import Control.Monad.Trans.State +-- * Unfoldable+ class UnfoldableR (pred :: * -> Constraint) (t :: * -> *) | t -> pred where unfoldRestrict :: (pred a, Unfolder f) => f a -> f (t a) +unfoldRestrict_ :: (UnfoldableR Unit t, Unfolder f) => f (t ())+unfoldRestrict_ = unfoldRestrict (pure ())++unfoldRestrictBF :: (UnfoldableR p t, Unfolder f, p a) => f a -> f (t a)+unfoldRestrictBF = ala bfs unfoldRestrict++unfoldRestrictBF_ :: (UnfoldableR Unit t, Unfolder f) => f (t ())+unfoldRestrictBF_ = bfs unfoldRestrict_++unfoldrRestrict :: (UnfoldableR p t, p a) => (b -> Maybe (a, b)) -> b -> Maybe (t a)+unfoldrRestrict f z = terminate . flip runStateT z . unfoldRestrictBF . StateT $ maybeToList . f+ where+ terminate [] = Nothing+ terminate ((t, b):ts) = if isNothing (f b) then Just t else terminate ts++fromList :: (UnfoldableR p t, p a) => [a] -> Maybe (t a)+fromList = unfoldrRestrict uncons+ where+ uncons [] = Nothing+ uncons (a:as) = Just (a, as)++leftMost :: (UnfoldableR Unit t) => Maybe (t ())+leftMost = unfoldRestrict_++rightMost :: (UnfoldableR Unit t) => Maybe (t ())+rightMost = getDualA unfoldRestrict_++allDepthFirst :: (UnfoldableR Unit t) => [t ()]+allDepthFirst = unfoldRestrict_++allToDepth :: (UnfoldableR Unit t) => Int -> [t ()]+allToDepth d = limitDepth d unfoldRestrict_++allBreadthFirst :: (UnfoldableR Unit t) => [t ()]+allBreadthFirst = unfoldRestrictBF_+++-- * BiUnfoldable+ class BiUnfoldableR (predA :: * -> Constraint) (predB :: * -> Constraint)@@ -34,7 +78,36 @@ | t -> predA predB where biunfoldRestrict :: (predA a, predB b, Unfolder f) => f a -> f b -> f (t a b) +biunfoldRestrict_ :: (BiUnfoldableR Unit Unit t, Unfolder f) => f (t () ())+biunfoldRestrict_ = biunfoldRestrict (pure ()) (pure ()) +biunfoldRestrictBF :: (BiUnfoldableR p q t, Unfolder f, p a, q b) => f a -> f b -> f (t a b)+biunfoldRestrictBF = ala2 bfs biunfoldRestrict++biunfoldRestrictBF_ :: (BiUnfoldableR Unit Unit t, Unfolder f) => f (t () ())+biunfoldRestrictBF_ = bfs biunfoldRestrict_++biunfoldrRestrict :: ( BiUnfoldableR p q t+ , p a+ , q b+ ) => (c -> Maybe (a, c))+ -> (c -> Maybe (b, c))+ -> c -> Maybe (t a b)+biunfoldrRestrict fa fb z = terminate . flip runStateT z $+ biunfoldRestrictBF (StateT $ maybeToList . fa) (StateT $ maybeToList . fb)+ where+ terminate [] = Nothing+ terminate ((t, c):ts) = if isNothing (fa c) && isNothing (fb c)+ then Just t else terminate ts++fromLists :: (BiUnfoldableR p q t, p a, q b) => [a] -> [b] -> Maybe (t a b)+fromLists = curry $ biunfoldrRestrict unconsA unconsB+ where+ unconsA ([],_) = Nothing+ unconsA (a:as, bs) = Just (a, (as, bs))+ unconsB (_,[]) = Nothing+ unconsB (as, b:bs) = Just (b, (as, bs))+ -- Containers instance UnfoldableR (Ord) Set.Set where@@ -52,7 +125,7 @@ ] --- Unordered Containers+-- * Utils class (Hashable a, Eq a) => Hashable' a
unfoldable-restricted.cabal view
@@ -1,5 +1,5 @@ Name: unfoldable-restricted-Version: 0.0.0+Version: 0.0.1 Author: Athan Clark <athan.clark@gmail.com> Maintainer: Athan Clark <athan.clark@gmail.com> License: BSD3@@ -17,6 +17,7 @@ , constraints , containers , hashable+ , transformers , unfoldable , unit-constraint , unordered-containers