@@ -95,7 +95,8 @@ import qualified Data.Vector.Unboxed as U
9595import qualified Data.Vector.Storable as VS
9696import qualified Data.IntSet as IntSet
9797import Data.Semigroup
98- ( Semigroup
98+ ( Semigroup ((<>) )
99+ , Endo (Endo )
99100-- Option has been removed in base-4.16 (GHC 9.2)
100101#if !MIN_VERSION_base(4,16,0)
101102 , Option (.. )
@@ -172,6 +173,7 @@ type instance Element (Par1 a) = a
172173type instance Element (U1 a ) = a
173174type instance Element (V1 a ) = a
174175type instance Element (Proxy a ) = a
176+ type instance Element (Endo mono ) = Element mono
175177
176178-- | Monomorphic containers that can be mapped over.
177179class MonoFunctor mono where
@@ -996,90 +998,129 @@ minimumByMay f mono
996998class MonoUnfold mono where
997999 unfoldrM :: Monad m => (a -> m (Maybe (Element mono , a ))) -> a -> m mono
9981000 unfoldrNM :: Monad m => Int -> (a -> m (Maybe (Element mono , a ))) -> a -> m mono
999- unfoldrNM' :: Monad m => Int -> (a -> m ( (Element mono , a ))) -> a -> m mono
1001+ unfoldrExactNM :: Monad m => Int -> (a -> m ( (Element mono , a ))) -> a -> m mono
10001002 unfoldlM :: Monad m => (a -> m (Maybe (a , Element mono ))) -> a -> m mono
10011003 unfoldlNM :: Monad m => Int -> (a -> m (Maybe (a , Element mono ))) -> a -> m mono
1002- unfoldlNM' :: Monad m => Int -> (a -> m ( (a , Element mono ))) -> a -> m mono
1004+ unfoldlExactNM :: Monad m => Int -> (a -> m ( (a , Element mono ))) -> a -> m mono
10031005
10041006unfoldr :: MonoUnfold mono => (a -> Maybe (Element mono , a )) -> a -> mono
10051007unfoldr = wrapIdentity unfoldrM
10061008unfoldrN :: MonoUnfold mono => Int -> (a -> Maybe (Element mono , a )) -> a -> mono
10071009unfoldrN = wrapIdentity . unfoldrNM
1008- unfoldrN' :: MonoUnfold mono => Int -> (a -> (Element mono , a )) -> a -> mono
1009- unfoldrN' = wrapIdentity . unfoldrNM'
1010+ unfoldrExactN :: MonoUnfold mono => Int -> (a -> (Element mono , a )) -> a -> mono
1011+ unfoldrExactN = wrapIdentity . unfoldrExactNM
10101012unfoldl :: MonoUnfold mono => (a -> Maybe (a , Element mono )) -> a -> mono
10111013unfoldl = wrapIdentity unfoldlM
10121014unfoldlN :: MonoUnfold mono => Int -> (a -> Maybe (a , Element mono )) -> a -> mono
10131015unfoldlN = wrapIdentity . unfoldlNM
1014- unfoldlN' :: MonoUnfold mono => Int -> (a -> (a , Element mono )) -> a -> mono
1015- unfoldlN' = wrapIdentity . unfoldlNM'
1016+ unfoldlExactN :: MonoUnfold mono => Int -> (a -> (a , Element mono )) -> a -> mono
1017+ unfoldlExactN = wrapIdentity . unfoldlExactNM
10161018
10171019wrapIdentity :: ((a -> Identity b ) -> c -> Identity d ) -> (a -> b ) -> c -> d
10181020wrapIdentity f g = runIdentity . f (Identity . g)
10191021
1020- instance MonoUnfold [ a ] where
1021- unfoldrM f x = f x >>= maybe (pure [] ) (\ (y,x) -> (y : ) <$> unfoldrM f x)
1022- unfoldrNM n f x | n > 0 = f x >>= maybe (pure [] ) (\ (y,x) -> (y : ) <$> unfoldrNM (n - 1 ) f x)
1023- | otherwise = pure []
1024- unfoldrNM' n f x | n > 0 = f x >>= \ (y,x) -> (y : ) <$> unfoldrNM' (n - 1 ) f x
1025- | otherwise = pure []
1026- unfoldlM f = fmap ($ [] ) . g
1027- where g x = f x >>= maybe (pure id ) (\ (y,z) -> g y <&> (. (z : )))
1028- unfoldlNM n f = fmap ($ [] ) . g n
1029- where g n x | n > 0 = f x >>= maybe (pure id ) (\ (y,z) -> g (n - 1 ) y <&> (. (z : )))
1022+ instance {-# OVERLAPPABLE #-} ( Monoid a , MonoPointed a ) => MonoUnfold a where
1023+ unfoldrM f x = f x >>= maybe (pure mempty ) (\ (y,x) -> (opoint y <> ) <$> unfoldrM f x)
1024+ unfoldrNM n f x | n > 0 = f x >>= maybe (pure mempty ) (\ (y,x) -> (opoint y <> ) <$> unfoldrNM (n - 1 ) f x)
1025+ | otherwise = pure mempty
1026+ unfoldrExactNM n f x | n > 0 = f x >>= \ (y,x) -> (opoint y <> ) <$> unfoldrExactNM (n - 1 ) f x
1027+ | otherwise = pure mempty
1028+ unfoldlM f = fmap ($ mempty ) . g
1029+ where g x = f x >>= maybe (pure id ) (\ (y,z) -> g y <&> (. (opoint z <> )))
1030+ unfoldlNM n f = fmap ($ mempty ) . g n
1031+ where g n x | n > 0 = f x >>= maybe (pure id ) (\ (y,z) -> g (n - 1 ) y <&> (. (opoint z <> )))
10301032 | otherwise = pure id
1031- unfoldlNM' n f = fmap ($ [] ) . g n
1032- where g n x | n > 0 = f x >>= \ (x,y) -> g (n - 1 ) x <&> (. (y : ))
1033+ unfoldlExactNM n f = fmap ($ mempty ) . g n
1034+ where g n x | n > 0 = f x >>= \ (x,y) -> g (n - 1 ) x <&> (. (opoint y <> ))
10331035 | otherwise = pure id
1036+ -- instance {-# OVERLAPPING #-} MonoUnfold (V.Vector a) where
1037+ -- unfoldrM = V.unfoldrM
1038+ -- unfoldrNM = V.unfoldrNM
1039+ -- unfoldrExactNM = V.unfoldrExactNM
1040+
1041+ -- instance MonoUnfold (Endo [a]) where
1042+ -- unfoldrM f x = f x >>= maybe (pure mempty) (\(y,x) -> (Endo (y :) <>) <$> unfoldrM f x)
1043+ -- unfoldrNM n f x | n > 0 = f x >>= maybe (pure mempty) (\(y,x) -> (Endo (y :) <>) <$> unfoldrNM (n - 1) f x)
1044+ -- | otherwise = pure mempty
1045+ -- unfoldrExactNM n f x | n > 0 = f x >>= \(y,x) -> (Endo (y :) <>) <$> unfoldrExactNM (n - 1) f x
1046+ -- | otherwise = pure mempty
1047+ -- unfoldlM f = fmap ($ mempty) . g
1048+ -- where g x = f x >>= maybe (pure id) (\(y,z) -> g y <&> (. (Endo (z :) <>)))
1049+ -- unfoldlNM n f = fmap ($ mempty) . g n
1050+ -- where g n x | n > 0 = f x >>= maybe (pure id) (\(y,z) -> g (n - 1) y <&> (. (Endo (z :) <>)))
1051+ -- | otherwise = pure id
1052+ -- unfoldlExactNM n f = fmap ($ mempty) . g n
1053+ -- where g n x | n > 0 = f x >>= \(x,y) -> g (n - 1) x <&> (. (Endo (y :) <>))
1054+ -- | otherwise = pure id
1055+ -- instance MonoUnfold [a] where
1056+ -- unfoldrM f x = f x >>= maybe (pure []) (\(y,x) -> (y :) <$> unfoldrM f x)
1057+ -- unfoldrNM n f x | n > 0 = f x >>= maybe (pure []) (\(y,x) -> (y :) <$> unfoldrNM (n - 1) f x)
1058+ -- | otherwise = pure []
1059+ -- unfoldrExactNM n f x | n > 0 = f x >>= \(y,x) -> (y :) <$> unfoldrExactNM (n - 1) f x
1060+ -- | otherwise = pure []
1061+ -- unfoldlM f = fmap ($ []) . g
1062+ -- where g x = f x >>= maybe (pure id) (\(y,z) -> g y <&> (. (z :)))
1063+ -- unfoldlNM n f = fmap ($ []) . g n
1064+ -- where g n x | n > 0 = f x >>= maybe (pure id) (\(y,z) -> g (n - 1) y <&> (. (z :)))
1065+ -- | otherwise = pure id
1066+ -- unfoldlExactNM n f = fmap ($ []) . g n
1067+ -- where g n x | n > 0 = f x >>= \(x,y) -> g (n - 1) x <&> (. (y :))
1068+ -- | otherwise = pure id
10341069
10351070class MonoUnfold1 mono where
10361071 unfoldr1M :: Monad m => (a -> m (Element mono , Maybe a )) -> a -> m mono
10371072 unfoldr1NM :: Monad m => Int -> (a -> m (Element mono , Maybe a )) -> a -> m mono
1038- unfoldr1NM' :: Monad m => Int -> (a -> m (Element mono , a )) -> a -> m mono
1073+ unfoldr1ExactNM :: Monad m => Int -> (a -> m (Element mono , a )) -> a -> m mono
10391074 unfoldl1M :: Monad m => (a -> m (Maybe a , Element mono )) -> a -> m mono
10401075 unfoldl1NM :: Monad m => Int -> (a -> m (Maybe a , Element mono )) -> a -> m mono
1041- unfoldl1NM' :: Monad m => Int -> (a -> m ( a , Element mono )) -> a -> m mono
1076+ unfoldl1ExactNM :: Monad m => Int -> (a -> m ( a , Element mono )) -> a -> m mono
10421077
10431078unfoldr1 :: MonoUnfold1 mono => (a -> (Element mono , Maybe a )) -> a -> mono
10441079unfoldr1 = wrapIdentity unfoldr1M
10451080unfoldr1N :: MonoUnfold1 mono => Int -> (a -> (Element mono , Maybe a )) -> a -> mono
10461081unfoldr1N = wrapIdentity . unfoldr1NM
1047- unfoldr1N' :: MonoUnfold1 mono => Int -> (a -> (Element mono , a )) -> a -> mono
1048- unfoldr1N' = wrapIdentity . unfoldr1NM'
1082+ unfoldr1ExactN :: MonoUnfold1 mono => Int -> (a -> (Element mono , a )) -> a -> mono
1083+ unfoldr1ExactN = wrapIdentity . unfoldr1ExactNM
10491084unfoldl1 :: MonoUnfold1 mono => (a -> (Maybe a , Element mono )) -> a -> mono
10501085unfoldl1 = wrapIdentity unfoldl1M
10511086unfoldl1N :: MonoUnfold1 mono => Int -> (a -> (Maybe a , Element mono )) -> a -> mono
10521087unfoldl1N = wrapIdentity . unfoldl1NM
1053- unfoldl1N' :: MonoUnfold1 mono => Int -> (a -> ( a , Element mono )) -> a -> mono
1054- unfoldl1N' = wrapIdentity . unfoldl1NM'
1055-
1056- instance MonoUnfold1 (NonEmpty a ) where
1057- unfoldr1M f x = g f (NE. :|) (:) x
1058- where
1059- g :: Monad m => (b -> m (a , Maybe b )) -> (a -> [a ] -> f a ) -> (a -> [a ] -> [a ]) -> b -> m (f a )
1060- g f cons cons' x = f x >>= \ (y,mx) -> cons y <$> maybe (pure [] ) (g f cons' cons') mx
1061- unfoldr1NM n f x = g f (NE. :|) (:) n x
1062- where
1063- g :: Monad m => (b -> m (a , Maybe b )) -> (a -> [a ] -> f a ) -> (a -> [a ] -> [a ]) -> Int -> b -> m (f a )
1064- g f cons cons' n x = f x >>= \ (y,mx) -> cons y <$> maybe (pure [] ) (g f cons' cons' (n - 1 )) (bool Nothing mx (n > 1 ))
1065- unfoldr1NM' n f x = g f (NE. :|) (:) n x
1066- where
1067- g :: Monad m => (b -> m (a , b )) -> (a -> [a ] -> f a ) -> (a -> [a ] -> [a ]) -> Int -> b -> m (f a )
1068- g f cons cons' n x = f x >>= \ (y,x) -> cons y <$> bool (pure [] ) (g f cons' cons' (n - 1 ) x) (n > 1 )
1069- unfoldl1M f x = g x <&> \ (y,h) -> y NE. :| h []
1070- where g x = f x >>= \ (mx,y) -> maybe (pure (y,id )) (\ x -> g x <&> fmap (. (y : ))) mx
1071- unfoldl1NM n f x = g n x <&> \ (y,h) -> y NE. :| h []
1072- where g n x = f x >>= \ (mx,y) -> maybe (pure (y,id )) (\ x -> g (n - 1 ) x <&> fmap (. (y : ))) (bool Nothing mx (n > 1 ))
1073- unfoldl1NM' n f x = g n x <&> \ (y,h) -> y NE. :| h []
1074- where g n x = f x >>= \ (x,y) -> bool (pure (y,id )) (g (n - 1 ) x <&> fmap (. (y : ))) (n > 1 )
1075-
1076- instance MonoUnfold1 [a ] where
1077- unfoldr1M f = fmap NE. toList . unfoldr1M f
1078- unfoldr1NM n f = fmap NE. toList . unfoldr1NM n f
1079- unfoldr1NM' n f = fmap NE. toList . unfoldr1NM' n f
1080- unfoldl1M f = fmap NE. toList . unfoldl1M f
1081- unfoldl1NM n f = fmap NE. toList . unfoldl1NM n f
1082- unfoldl1NM' n f = fmap NE. toList . unfoldl1NM' n f
1088+ unfoldl1ExactN :: MonoUnfold1 mono => Int -> (a -> ( a , Element mono )) -> a -> mono
1089+ unfoldl1ExactN = wrapIdentity . unfoldl1ExactNM
1090+
1091+ instance {-# OVERLAPPABLE #-} (MonoPointed a , Semigroup a ) => MonoUnfold1 a where
1092+ unfoldr1M f x = f x >>= \ (y,mx) -> maybe (pure $ opoint y) (fmap (opoint y <> ) . unfoldr1M f) mx
1093+ unfoldr1NM n f x = f x >>= \ (y,mx) -> maybe (pure $ opoint y) (fmap (opoint y <> ) . unfoldr1NM (n - 1 ) f) (bool Nothing mx (n > 1 ))
1094+ unfoldr1ExactNM n f x = f x >>= \ (y,x) -> bool (pure $ opoint y) ((opoint y <> ) <$> unfoldr1ExactNM (n - 1 ) f x) (n > 1 )
1095+ unfoldl1M f x = f x >>= \ (mx,y) -> maybe (pure $ opoint y) (fmap (<> opoint y) . unfoldl1M f) mx
1096+ unfoldl1NM n f x = f x >>= \ (mx,y) -> maybe (pure $ opoint y) (fmap (<> opoint y) . unfoldl1NM (n - 1 ) f) $ bool Nothing mx (n > 1 )
1097+ unfoldl1ExactNM n f x = f x >>= \ (x,y) -> bool (pure $ opoint y) (fmap (<> opoint y) $ unfoldl1ExactNM (n - 1 ) f x) (n > 1 )
1098+ -- instance MonoUnfold1 (NonEmpty a) where
1099+ -- unfoldr1M f x = g f (NE.:|) (:) x
1100+ -- where
1101+ -- g :: Monad m => (b -> m (a, Maybe b)) -> (a -> [a] -> f a) -> (a -> [a] -> [a]) -> b -> m (f a)
1102+ -- g f cons cons' x = f x >>= \(y,mx) -> cons y <$> maybe (pure []) (g f cons' cons') mx
1103+ -- unfoldr1NM n f x = g f (NE.:|) (:) n x
1104+ -- where
1105+ -- g :: Monad m => (b -> m (a, Maybe b)) -> (a -> [a] -> f a) -> (a -> [a] -> [a]) -> Int -> b -> m (f a)
1106+ -- g f cons cons' n x = f x >>= \(y,mx) -> cons y <$> maybe (pure []) (g f cons' cons' (n - 1)) (bool Nothing mx (n > 1))
1107+ -- unfoldr1ExactNM n f x = g f (NE.:|) (:) n x
1108+ -- where
1109+ -- g :: Monad m => (b -> m (a, b)) -> (a -> [a] -> f a) -> (a -> [a] -> [a]) -> Int -> b -> m (f a)
1110+ -- g f cons cons' n x = f x >>= \(y,x) -> cons y <$> bool (pure []) (g f cons' cons' (n - 1) x) (n > 1)
1111+ -- unfoldl1M f x = g x <&> \(y,h) -> y NE.:| h []
1112+ -- where g x = f x >>= \(mx,y) -> maybe (pure (y,id)) (\x -> g x <&> fmap (. (y :))) mx
1113+ -- unfoldl1NM n f x = g n x <&> \(y,h) -> y NE.:| h []
1114+ -- where g n x = f x >>= \(mx,y) -> maybe (pure (y,id)) (\x -> g (n - 1) x <&> fmap (. (y :))) (bool Nothing mx (n > 1))
1115+ -- unfoldl1ExactNM n f x = g n x <&> \(y,h) -> y NE.:| h []
1116+ -- where g n x = f x >>= \(x,y) -> bool (pure (y,id)) (g (n - 1) x <&> fmap (. (y :))) (n > 1)
1117+ -- instance MonoUnfold1 [a] where
1118+ -- unfoldr1M f = fmap NE.toList . unfoldr1M f
1119+ -- unfoldr1NM n f = fmap NE.toList . unfoldr1NM n f
1120+ -- unfoldr1ExactNM n f = fmap NE.toList . unfoldr1ExactNM n f
1121+ -- unfoldl1M f = fmap NE.toList . unfoldl1M f
1122+ -- unfoldl1NM n f = fmap NE.toList . unfoldl1NM n f
1123+ -- unfoldl1ExactNM n f = fmap NE.toList . unfoldl1ExactNM n f
10831124
10841125-- | Monomorphic containers that can be traversed from left to right.
10851126--
@@ -1344,6 +1385,10 @@ instance MonoPointed (Tree a) where
13441385instance (Applicative f , Applicative g ) => MonoPointed ((f :+: g ) a ) where
13451386 opoint = R1 . pure
13461387 {-# INLINE opoint #-}
1388+ -- | @since ????????????
1389+ instance (MonoPointed mono , Semigroup mono ) => MonoPointed (Endo mono ) where
1390+ opoint = Endo . (<>) . opoint
1391+ {-# INLINE opoint #-}
13471392
13481393
13491394-- | Typeclass for monomorphic containers where it is always okay to
0 commit comments