non-empty 0.2.1 → 0.3
raw patch · 12 files changed
+252/−89 lines, 12 filesdep +deepseqdep ~containersdep ~utility-htPVP ok
version bump matches the API change (PVP)
Dependencies added: deepseq
Dependency ranges changed: containers, utility-ht
API changes (from Hackage documentation)
- Data.Append: fst :: T f g a -> f a
- Data.Append: instance (Foldable f, Foldable g) => Foldable (T f g)
- Data.Append: instance (Functor f, Functor g) => Functor (T f g)
- Data.Append: instance (Traversable f, Traversable g) => Traversable (T f g)
- Data.Append: snd :: T f g a -> g a
- Data.Empty: instance Arbitrary (T a)
- Data.Empty: instance Empty T
- Data.Empty: instance Eq (T a)
- Data.Empty: instance Foldable T
- Data.Empty: instance Functor T
- Data.Empty: instance Iterate T
- Data.Empty: instance Ord (T a)
- Data.Empty: instance Repeat T
- Data.Empty: instance Reverse T
- Data.Empty: instance Show (T a)
- Data.Empty: instance Show T
- Data.Empty: instance Sort T
- Data.Empty: instance SortBy T
- Data.Empty: instance Traversable T
- Data.Empty: instance View T
- Data.Empty: instance ViewL T
- Data.Empty: instance ViewR T
- Data.Empty: instance Zip T
- Data.NonEmpty: class Functor f => RemoveEach f
- Data.NonEmpty: class Tails f
- Data.NonEmpty: head :: T f a -> a
- Data.NonEmpty: tail :: T f a -> f a
- Data.NonEmpty.Class: instance Append Seq
- Data.NonEmpty.Class: instance Append []
- Data.NonEmpty.Class: instance Arbitrary []
- Data.NonEmpty.Class: instance Cons Seq
- Data.NonEmpty.Class: instance Cons []
- Data.NonEmpty.Class: instance Empty Maybe
- Data.NonEmpty.Class: instance Empty Seq
- Data.NonEmpty.Class: instance Empty Set
- Data.NonEmpty.Class: instance Empty []
- Data.NonEmpty.Class: instance Iterate []
- Data.NonEmpty.Class: instance Repeat []
- Data.NonEmpty.Class: instance Reverse Maybe
- Data.NonEmpty.Class: instance Reverse Seq
- Data.NonEmpty.Class: instance Reverse []
- Data.NonEmpty.Class: instance Show Set
- Data.NonEmpty.Class: instance Show []
- Data.NonEmpty.Class: instance Singleton Maybe
- Data.NonEmpty.Class: instance Singleton Seq
- Data.NonEmpty.Class: instance Singleton Set
- Data.NonEmpty.Class: instance Singleton []
- Data.NonEmpty.Class: instance Snoc Seq
- Data.NonEmpty.Class: instance Snoc []
- Data.NonEmpty.Class: instance Sort Maybe
- Data.NonEmpty.Class: instance Sort Seq
- Data.NonEmpty.Class: instance Sort Set
- Data.NonEmpty.Class: instance Sort []
- Data.NonEmpty.Class: instance SortBy Maybe
- Data.NonEmpty.Class: instance SortBy Seq
- Data.NonEmpty.Class: instance SortBy []
- Data.NonEmpty.Class: instance View Maybe
- Data.NonEmpty.Class: instance View Seq
- Data.NonEmpty.Class: instance View Set
- Data.NonEmpty.Class: instance View []
- Data.NonEmpty.Class: instance ViewL Maybe
- Data.NonEmpty.Class: instance ViewL Seq
- Data.NonEmpty.Class: instance ViewL Set
- Data.NonEmpty.Class: instance ViewL []
- Data.NonEmpty.Class: instance ViewR Maybe
- Data.NonEmpty.Class: instance ViewR Seq
- Data.NonEmpty.Class: instance ViewR Set
- Data.NonEmpty.Class: instance ViewR []
- Data.NonEmpty.Class: instance Zip Maybe
- Data.NonEmpty.Class: instance Zip Seq
- Data.NonEmpty.Class: instance Zip []
- Data.NonEmpty.Map: instance (Eq k, Eq a) => Eq (T k a)
- Data.NonEmpty.Map: instance (Ord k, Ord a) => Ord (T k a)
- Data.NonEmpty.Map: instance (Show k, Show a) => Show (T k a)
- Data.NonEmpty.Map: instance Ord k => Foldable (T k)
- Data.NonEmpty.Map: instance Ord k => Functor (T k)
- Data.NonEmpty.Map: instance Ord k => Traversable (T k)
- Data.NonEmpty.Mixed: instance Choose T
- Data.NonEmpty.Mixed: instance Choose []
- Data.NonEmpty.Mixed: instance Choose f => Choose (T f)
- Data.NonEmpty.Set: instance Eq a => Eq (T a)
- Data.NonEmpty.Set: instance Ord a => Ord (T a)
- Data.NonEmpty.Set: instance Show a => Show (T a)
- Data.Optional: instance (Arbitrary f, Arbitrary a) => Arbitrary (T f a)
- Data.Optional: instance (Cons f, Empty f) => Cons (T f)
- Data.Optional: instance (Eq a, Eq (f a)) => Eq (T f a)
- Data.Optional: instance (Insert f, Sort f) => Sort (T f)
- Data.Optional: instance (InsertBy f, SortBy f) => SortBy (T f)
- Data.Optional: instance (Ord a, Ord (f a)) => Ord (T f a)
- Data.Optional: instance (Show f, Show a) => Show (T f a)
- Data.Optional: instance (Traversable f, Reverse f) => Reverse (T f)
- Data.Optional: instance Empty (T f)
- Data.Optional: instance Foldable f => Foldable (T f)
- Data.Optional: instance Functor f => Functor (T f)
- Data.Optional: instance Insert f => Insert (T f)
- Data.Optional: instance InsertBy f => InsertBy (T f)
- Data.Optional: instance RemoveEach f => RemoveEach (T f)
- Data.Optional: instance Repeat f => Repeat (T f)
- Data.Optional: instance Show f => Show (T f)
- Data.Optional: instance Tails f => Tails (T f)
- Data.Optional: instance Traversable f => Traversable (T f)
- Data.Optional: instance Zip f => Zip (T f)
- Data.Zip: decons :: T f a -> f a
- Data.Zip: instance (Zip f, Repeat f) => Applicative (T f)
- Data.Zip: instance Functor f => Functor (T f)
+ Data.Append: [fst] :: T f g a -> f a
+ Data.Append: [snd] :: T f g a -> g a
+ Data.Append: instance (Data.Foldable.Foldable f, Data.Foldable.Foldable g) => Data.Foldable.Foldable (Data.Append.T f g)
+ Data.Append: instance (Data.NonEmpty.Class.NFData f, Data.NonEmpty.Class.NFData g) => Data.NonEmpty.Class.NFData (Data.Append.T f g)
+ Data.Append: instance (Data.NonEmpty.Class.NFData f, Data.NonEmpty.Class.NFData g, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Data.Append.T f g a)
+ Data.Append: instance (Data.Traversable.Traversable f, Data.Traversable.Traversable g) => Data.Traversable.Traversable (Data.Append.T f g)
+ Data.Append: instance (GHC.Base.Functor f, GHC.Base.Functor g) => GHC.Base.Functor (Data.Append.T f g)
+ Data.Empty: instance Control.DeepSeq.NFData (Data.Empty.T a)
+ Data.Empty: instance Data.Foldable.Foldable Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Empty Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Iterate Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.NFData Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Repeat Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Reverse Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Show Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Sort Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.SortBy Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.View Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.ViewL Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.ViewR Data.Empty.T
+ Data.Empty: instance Data.NonEmpty.Class.Zip Data.Empty.T
+ Data.Empty: instance Data.Traversable.Traversable Data.Empty.T
+ Data.Empty: instance GHC.Base.Functor Data.Empty.T
+ Data.Empty: instance GHC.Classes.Eq (Data.Empty.T a)
+ Data.Empty: instance GHC.Classes.Ord (Data.Empty.T a)
+ Data.Empty: instance GHC.Show.Show (Data.Empty.T a)
+ Data.Empty: instance Test.QuickCheck.Arbitrary.Arbitrary (Data.Empty.T a)
+ Data.NonEmpty: [head] :: T f a -> a
+ Data.NonEmpty: [tail] :: T f a -> f a
+ Data.NonEmpty: foldBalancedStrict :: (a -> a -> a) -> T [] a -> a
+ Data.NonEmpty: infixr 5 `appendRight`
+ Data.NonEmpty.Class: class NFData f
+ Data.NonEmpty.Class: instance Control.DeepSeq.NFData k => Data.NonEmpty.Class.NFData (Data.Map.Base.Map k)
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Append Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Append []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Arbitrary []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Cons Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Cons []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Empty (Data.Map.Base.Map k)
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Empty Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Empty Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Empty GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Empty []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Iterate GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Iterate []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.NFData Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.NFData GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.NFData []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Repeat GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Repeat []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Reverse Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Reverse GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Reverse []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Show Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Show []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Singleton Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Singleton Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Singleton GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Singleton []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Snoc Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Snoc []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Sort Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Sort Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Sort GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Sort []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.SortBy Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.SortBy GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.SortBy []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.View Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.View Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.View GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.View []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewL Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewL Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewL GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewL []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewR Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewR Data.Set.Base.Set
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewR GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.ViewR []
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Zip Data.Sequence.Seq
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Zip GHC.Base.Maybe
+ Data.NonEmpty.Class: instance Data.NonEmpty.Class.Zip []
+ Data.NonEmpty.Class: rnf :: (NFData f, NFData a) => f a -> ()
+ Data.NonEmpty.Map: instance (Control.DeepSeq.NFData k, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Data.NonEmpty.Map.T k a)
+ Data.NonEmpty.Map: instance (GHC.Classes.Eq k, GHC.Classes.Eq a) => GHC.Classes.Eq (Data.NonEmpty.Map.T k a)
+ Data.NonEmpty.Map: instance (GHC.Classes.Ord k, GHC.Classes.Ord a) => GHC.Classes.Ord (Data.NonEmpty.Map.T k a)
+ Data.NonEmpty.Map: instance (GHC.Show.Show k, GHC.Show.Show a) => GHC.Show.Show (Data.NonEmpty.Map.T k a)
+ Data.NonEmpty.Map: instance Control.DeepSeq.NFData k => Data.NonEmpty.Class.NFData (Data.NonEmpty.Map.T k)
+ Data.NonEmpty.Map: instance GHC.Classes.Ord k => Data.Foldable.Foldable (Data.NonEmpty.Map.T k)
+ Data.NonEmpty.Map: instance GHC.Classes.Ord k => Data.Traversable.Traversable (Data.NonEmpty.Map.T k)
+ Data.NonEmpty.Map: instance GHC.Classes.Ord k => GHC.Base.Functor (Data.NonEmpty.Map.T k)
+ Data.NonEmpty.Map: map :: (Ord k) => (a -> b) -> T k a -> T k b
+ Data.NonEmpty.Map: mapWithKey :: (Ord k) => (k -> a -> b) -> T k a -> T k b
+ Data.NonEmpty.Mixed: groupEithers :: (Foldable f) => f (Either a b) -> [Either (T [] a) (T [] b)]
+ Data.NonEmpty.Mixed: groupKey :: (Foldable f, Eq a) => (b -> a) -> f b -> [(a, T [] b)]
+ Data.NonEmpty.Mixed: groupPairs :: (Foldable f, Eq a) => f (a, b) -> [(a, T [] b)]
+ Data.NonEmpty.Mixed: instance Data.NonEmpty.Mixed.Choose Data.Empty.T
+ Data.NonEmpty.Mixed: instance Data.NonEmpty.Mixed.Choose []
+ Data.NonEmpty.Mixed: instance Data.NonEmpty.Mixed.Choose f => Data.NonEmpty.Mixed.Choose (Data.NonEmptyPrivate.T f)
+ Data.NonEmpty.Set: deleteFindMax :: (Ord a) => T a -> (a, Set a)
+ Data.NonEmpty.Set: deleteFindMin :: T a -> (a, Set a)
+ Data.NonEmpty.Set: deleteMax :: (Ord a) => T a -> Set a
+ Data.NonEmpty.Set: deleteMin :: T a -> Set a
+ Data.NonEmpty.Set: fetch :: (Ord a) => Set a -> Maybe (T a)
+ Data.NonEmpty.Set: findMax :: T a -> a
+ Data.NonEmpty.Set: findMin :: T a -> a
+ Data.NonEmpty.Set: instance Control.DeepSeq.NFData a => Control.DeepSeq.NFData (Data.NonEmpty.Set.T a)
+ Data.NonEmpty.Set: instance Data.NonEmpty.Class.NFData Data.NonEmpty.Set.T
+ Data.NonEmpty.Set: instance GHC.Classes.Eq a => GHC.Classes.Eq (Data.NonEmpty.Set.T a)
+ Data.NonEmpty.Set: instance GHC.Classes.Ord a => GHC.Classes.Ord (Data.NonEmpty.Set.T a)
+ Data.NonEmpty.Set: instance GHC.Show.Show a => GHC.Show.Show (Data.NonEmpty.Set.T a)
+ Data.Optional: infixr 5 ?:
+ Data.Optional: instance (Data.NonEmpty.Class.Arbitrary f, Test.QuickCheck.Arbitrary.Arbitrary a) => Test.QuickCheck.Arbitrary.Arbitrary (Data.Optional.T f a)
+ Data.Optional: instance (Data.NonEmpty.Class.Cons f, Data.NonEmpty.Class.Empty f) => Data.NonEmpty.Class.Cons (Data.Optional.T f)
+ Data.Optional: instance (Data.NonEmpty.Class.NFData f, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Data.Optional.T f a)
+ Data.Optional: instance (Data.NonEmpty.Class.Show f, GHC.Show.Show a) => GHC.Show.Show (Data.Optional.T f a)
+ Data.Optional: instance (Data.NonEmptyPrivate.Insert f, Data.NonEmpty.Class.Sort f) => Data.NonEmpty.Class.Sort (Data.Optional.T f)
+ Data.Optional: instance (Data.NonEmptyPrivate.InsertBy f, Data.NonEmpty.Class.SortBy f) => Data.NonEmpty.Class.SortBy (Data.Optional.T f)
+ Data.Optional: instance (Data.Traversable.Traversable f, Data.NonEmpty.Class.Reverse f) => Data.NonEmpty.Class.Reverse (Data.Optional.T f)
+ Data.Optional: instance (GHC.Classes.Eq a, GHC.Classes.Eq (f a)) => GHC.Classes.Eq (Data.Optional.T f a)
+ Data.Optional: instance (GHC.Classes.Ord a, GHC.Classes.Ord (f a)) => GHC.Classes.Ord (Data.Optional.T f a)
+ Data.Optional: instance Data.Foldable.Foldable f => Data.Foldable.Foldable (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.Empty (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.Iterate f => Data.NonEmpty.Class.Iterate (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.NFData f => Data.NonEmpty.Class.NFData (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.Repeat f => Data.NonEmpty.Class.Repeat (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.Show f => Data.NonEmpty.Class.Show (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmpty.Class.Zip f => Data.NonEmpty.Class.Zip (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmptyPrivate.Insert f => Data.NonEmptyPrivate.Insert (Data.Optional.T f)
+ Data.Optional: instance Data.NonEmptyPrivate.InsertBy f => Data.NonEmptyPrivate.InsertBy (Data.Optional.T f)
+ Data.Optional: instance Data.Traversable.Traversable f => Data.Traversable.Traversable (Data.Optional.T f)
+ Data.Optional: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Optional.T f)
+ Data.Zip: [decons] :: T f a -> f a
+ Data.Zip: instance (Data.NonEmpty.Class.NFData f, Control.DeepSeq.NFData a) => Control.DeepSeq.NFData (Data.Zip.T f a)
+ Data.Zip: instance (Data.NonEmpty.Class.Zip f, Data.NonEmpty.Class.Repeat f) => GHC.Base.Applicative (Data.Zip.T f)
+ Data.Zip: instance Data.NonEmpty.Class.NFData f => Data.NonEmpty.Class.NFData (Data.Zip.T f)
+ Data.Zip: instance GHC.Base.Functor f => GHC.Base.Functor (Data.Zip.T f)
- Data.NonEmpty: appendRight :: Append f => T f a -> f a -> T f a
+ Data.NonEmpty: appendRight :: (Append f) => T f a -> f a -> T f a
- Data.NonEmpty: foldl1 :: Foldable f => (a -> a -> a) -> T f a -> a
+ Data.NonEmpty: foldl1 :: (Foldable f) => (a -> a -> a) -> T f a -> a
- Data.NonEmpty: foldl1Map :: Foldable f => (b -> b -> b) -> (a -> b) -> T f a -> b
+ Data.NonEmpty: foldl1Map :: (Foldable f) => (b -> b -> b) -> (a -> b) -> T f a -> b
- Data.NonEmpty: init :: Traversable f => T f a -> f a
+ Data.NonEmpty: init :: (Traversable f) => T f a -> f a
- Data.NonEmpty: last :: Foldable f => T f a -> a
+ Data.NonEmpty: last :: (Foldable f) => T f a -> a
- Data.NonEmpty: mapAdjacent :: Traversable f => (a -> a -> b) -> T f a -> f b
+ Data.NonEmpty: mapAdjacent :: (Traversable f) => (a -> a -> b) -> T f a -> f b
- Data.NonEmpty: maximumBy :: Foldable f => (a -> a -> Ordering) -> T f a -> a
+ Data.NonEmpty: maximumBy :: (Foldable f) => (a -> a -> Ordering) -> T f a -> a
- Data.NonEmpty: minimumBy :: Foldable f => (a -> a -> Ordering) -> T f a -> a
+ Data.NonEmpty: minimumBy :: (Foldable f) => (a -> a -> Ordering) -> T f a -> a
- Data.NonEmpty: removeEach :: RemoveEach f => T f a -> T f (a, f a)
+ Data.NonEmpty: removeEach :: (Traversable f) => T f a -> T f (a, f a)
- Data.NonEmpty: tails :: (Tails f, Cons g, Empty g) => f a -> T f (g a)
+ Data.NonEmpty: tails :: (Traversable f, Cons g, Empty g) => f a -> T f (g a)
- Data.NonEmpty: viewR :: Traversable f => T f a -> (f a, a)
+ Data.NonEmpty: viewR :: (Traversable f) => T f a -> (f a, a)
- Data.NonEmpty: zipWith :: Zip f => (a -> b -> c) -> T f a -> T f b -> T f c
+ Data.NonEmpty: zipWith :: (Zip f) => (a -> b -> c) -> T f a -> T f b -> T f c
- Data.NonEmpty.Class: zip :: Zip f => f a -> f b -> f (a, b)
+ Data.NonEmpty.Class: zip :: (Zip f) => f a -> f b -> f (a, b)
- Data.NonEmpty.Class: zip3 :: Zip f => f a -> f b -> f c -> f (a, b, c)
+ Data.NonEmpty.Class: zip3 :: (Zip f) => f a -> f b -> f c -> f (a, b, c)
- Data.NonEmpty.Class: zip4 :: Zip f => f a -> f b -> f c -> f d -> f (a, b, c, d)
+ Data.NonEmpty.Class: zip4 :: (Zip f) => f a -> f b -> f c -> f d -> f (a, b, c, d)
- Data.NonEmpty.Class: zipWith3 :: Zip f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
+ Data.NonEmpty.Class: zipWith3 :: (Zip f) => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
- Data.NonEmpty.Class: zipWith4 :: Zip f => (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
+ Data.NonEmpty.Class: zipWith4 :: (Zip f) => (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
- Data.NonEmpty.Map: fetch :: Ord k => Map k a -> Maybe (T k a)
+ Data.NonEmpty.Map: fetch :: (Ord k) => Map k a -> Maybe (T k a)
- Data.NonEmpty.Map: flatten :: Ord k => T k a -> Map k a
+ Data.NonEmpty.Map: flatten :: (Ord k) => T k a -> Map k a
- Data.NonEmpty.Map: fromList :: Ord k => T [] (k, a) -> T k a
+ Data.NonEmpty.Map: fromList :: (Ord k) => T [] (k, a) -> T k a
- Data.NonEmpty.Map: keysSet :: Ord k => T k a -> T k
+ Data.NonEmpty.Map: keysSet :: (Ord k) => T k a -> T k
- Data.NonEmpty.Map: lookup :: Ord k => k -> T k a -> Maybe a
+ Data.NonEmpty.Map: lookup :: (Ord k) => k -> T k a -> Maybe a
- Data.NonEmpty.Map: maxViewWithKey :: Ord k => T k a -> ((k, a), Map k a)
+ Data.NonEmpty.Map: maxViewWithKey :: (Ord k) => T k a -> ((k, a), Map k a)
- Data.NonEmpty.Map: member :: Ord k => k -> T k a -> Bool
+ Data.NonEmpty.Map: member :: (Ord k) => k -> T k a -> Bool
- Data.NonEmpty.Map: union :: Ord k => T k a -> T k a -> T k a
+ Data.NonEmpty.Map: union :: (Ord k) => T k a -> T k a -> T k a
- Data.NonEmpty.Map: unionLeft :: Ord k => Map k a -> T k a -> T k a
+ Data.NonEmpty.Map: unionLeft :: (Ord k) => Map k a -> T k a -> T k a
- Data.NonEmpty.Map: unionRight :: Ord k => T k a -> Map k a -> T k a
+ Data.NonEmpty.Map: unionRight :: (Ord k) => T k a -> Map k a -> T k a
- Data.NonEmpty.Match: replicate :: Functor f => f a -> b -> f b
+ Data.NonEmpty.Match: replicate :: (Functor f) => f a -> b -> f b
- Data.NonEmpty.Match: take :: Zip f => f b -> f a -> f a
+ Data.NonEmpty.Match: take :: (Zip f) => f b -> f a -> f a
- Data.NonEmpty.Mixed: appendLeft :: Cons f => [a] -> f a -> f a
+ Data.NonEmpty.Mixed: appendLeft :: (Cons f) => [a] -> f a -> f a
- Data.NonEmpty.Mixed: filterToInfixes :: Foldable f => (a -> Bool) -> f a -> [T [] a]
+ Data.NonEmpty.Mixed: filterToInfixes :: (Foldable f) => (a -> Bool) -> f a -> [T [] a]
- Data.NonEmpty.Mixed: groupBy :: Foldable f => (a -> a -> Bool) -> f a -> [T [] a]
+ Data.NonEmpty.Mixed: groupBy :: (Foldable f) => (a -> a -> Bool) -> f a -> [T [] a]
- Data.NonEmpty.Mixed: last :: ViewR f => T f a -> a
+ Data.NonEmpty.Mixed: last :: (ViewR f) => T f a -> a
- Data.NonEmpty.Mixed: segmentAfter :: Foldable f => (a -> Bool) -> f a -> ([T [] a], [a])
+ Data.NonEmpty.Mixed: segmentAfter :: (Foldable f) => (a -> Bool) -> f a -> ([T [] a], [a])
- Data.NonEmpty.Mixed: segmentBefore :: Foldable f => (a -> Bool) -> f a -> ([a], [T [] a])
+ Data.NonEmpty.Mixed: segmentBefore :: (Foldable f) => (a -> Bool) -> f a -> ([a], [T [] a])
- Data.NonEmpty.Set: flatten :: Ord a => T a -> Set a
+ Data.NonEmpty.Set: flatten :: (Ord a) => T a -> Set a
- Data.NonEmpty.Set: fromList :: Ord a => T [] a -> T a
+ Data.NonEmpty.Set: fromList :: (Ord a) => T [] a -> T a
- Data.NonEmpty.Set: maxView :: Ord a => T a -> (a, Set a)
+ Data.NonEmpty.Set: maxView :: (Ord a) => T a -> (a, Set a)
- Data.NonEmpty.Set: member :: Ord a => a -> T a -> Bool
+ Data.NonEmpty.Set: member :: (Ord a) => a -> T a -> Bool
- Data.NonEmpty.Set: union :: Ord a => T a -> T a -> T a
+ Data.NonEmpty.Set: union :: (Ord a) => T a -> T a -> T a
- Data.NonEmpty.Set: unionLeft :: Ord a => Set a -> T a -> T a
+ Data.NonEmpty.Set: unionLeft :: (Ord a) => Set a -> T a -> T a
- Data.NonEmpty.Set: unionRight :: Ord a => T a -> Set a -> T a
+ Data.NonEmpty.Set: unionRight :: (Ord a) => T a -> Set a -> T a
Files
- non-empty.cabal +7/−5
- src/Data/Append.hs +9/−0
- src/Data/Empty.hs +7/−0
- src/Data/NonEmpty.hs +3/−3
- src/Data/NonEmpty/Class.hs +28/−0
- src/Data/NonEmpty/Foldable.hs +20/−0
- src/Data/NonEmpty/Map.hs +18/−2
- src/Data/NonEmpty/Mixed.hs +30/−0
- src/Data/NonEmpty/Set.hs +64/−3
- src/Data/NonEmptyPrivate.hs +46/−59
- src/Data/Optional.hs +12/−17
- src/Data/Zip.hs +8/−0
non-empty.cabal view
@@ -1,10 +1,10 @@ Name: non-empty-Version: 0.2.1+Version: 0.3 License: BSD3 License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Henning Thielemann <haskell@henning-thielemann.de>-Homepage: http://code.haskell.org/~thielema/non-empty/+Homepage: http://hub.darcs.net/thielema/non-empty/ Category: Data Synopsis: List-like structures with static restrictions on the number of elements Description:@@ -66,17 +66,18 @@ Build-Type: Simple Source-Repository this- Tag: 0.2.1+ Tag: 0.3 Type: darcs- Location: http://code.haskell.org/~thielema/non-empty/+ Location: http://hub.darcs.net/thielema/non-empty/ Source-Repository head Type: darcs- Location: http://code.haskell.org/~thielema/non-empty/+ Location: http://hub.darcs.net/thielema/non-empty/ Library Build-Depends: containers >=0.4 && <0.6,+ deepseq >=1.3 && <1.5, utility-ht >=0.0.1 && <0.1, QuickCheck >=2.1 && <3, base >=4 && <5@@ -95,5 +96,6 @@ Data.Append Data.Zip Other-Modules:+ Data.NonEmpty.Foldable Data.NonEmptyPrivate Data.NonEmptyTest
src/Data/Append.hs view
@@ -1,6 +1,8 @@ module Data.Append where +import qualified Data.NonEmpty.Class as C import Control.Applicative (liftA2)+import Control.DeepSeq (NFData, rnf, ) import Data.Traversable (Traversable, traverse) import Data.Foldable (Foldable, foldMap) import Data.Monoid (mappend)@@ -22,3 +24,10 @@ instance (Traversable f, Traversable g) => Traversable (T f g) where traverse f (Cons xs ys) = liftA2 Cons (traverse f xs) (traverse f ys)+++instance (C.NFData f, C.NFData g) => C.NFData (T f g) where+ rnf (Cons f g) = rnf (C.rnf f, C.rnf g)++instance (C.NFData f, C.NFData g, NFData a) => NFData (T f g a) where+ rnf = C.rnf
src/Data/Empty.hs view
@@ -5,6 +5,7 @@ import qualified Data.Traversable as Trav import qualified Data.Foldable as Fold import Control.Applicative (pure, )+import Control.DeepSeq (NFData, rnf, ) import qualified Test.QuickCheck as QC @@ -64,3 +65,9 @@ -} instance C.Iterate T where iterate _ _ = Cons++instance C.NFData T where+ rnf Cons = ()++instance NFData (T a) where+ rnf Cons = ()
src/Data/NonEmpty.hs view
@@ -18,6 +18,7 @@ foldl1, foldl1Map, foldBalanced,+ foldBalancedStrict, maximum, maximumBy, maximumKey, minimum, minimumBy, minimumKey, sum,@@ -29,9 +30,8 @@ Insert(insert), insertDefault, InsertBy(insertBy), scanl, scanr,- Tails(tails),- inits, initsRev,- RemoveEach(removeEach),+ tails, inits, initsRev,+ removeEach, ) where import Data.NonEmptyPrivate
src/Data/NonEmpty/Class.hs view
@@ -1,10 +1,13 @@ module Data.NonEmpty.Class where import qualified Data.Sequence as Seq+import qualified Data.Map as Map import qualified Data.Set as Set import qualified Data.List.HT as ListHT import qualified Data.List as List+import qualified Control.DeepSeq as DeepSeq import Data.Sequence (Seq, )+import Data.Map (Map, ) import Data.Set (Set, ) import Data.Traversable (Traversable, mapAccumL, mapAccumR) import Control.Monad (liftM2, )@@ -28,6 +31,9 @@ instance Empty Set where empty = Set.empty +instance Empty (Map k) where+ empty = Map.empty+ instance Empty Seq where empty = Seq.empty @@ -184,7 +190,10 @@ instance Repeat [] where repeat = List.repeat +instance Repeat Maybe where+ repeat = Just + -- might be replaced by Mixed.iterate based on Traversable class Repeat f => Iterate f where iterate :: (a -> a) -> a -> f a@@ -192,7 +201,10 @@ instance Iterate [] where iterate = List.iterate +instance Iterate Maybe where+ iterate _ = Just + {- | We need to distinguish between 'Sort' and 'SortBy', since there is an @instance Sort Set@@@ -263,3 +275,19 @@ instance Arbitrary [] where arbitrary = QC.arbitrary shrink = QC.shrink+++class NFData f where+ rnf :: DeepSeq.NFData a => f a -> ()++instance NFData Maybe where+ rnf = DeepSeq.rnf++instance NFData [] where+ rnf = DeepSeq.rnf++instance NFData Set where+ rnf = DeepSeq.rnf++instance (DeepSeq.NFData k) => NFData (Map k) where+ rnf = DeepSeq.rnf
+ src/Data/NonEmpty/Foldable.hs view
@@ -0,0 +1,20 @@+module Data.NonEmpty.Foldable where++import qualified Data.Foldable as Fold+import Data.Foldable (Foldable, )+++{- |+It holds:++> foldMap f . Mapped g = foldMap f . fmap g++but use of 'Mapped' avoids 'Functor' constraint.+-}+data Mapped f a b = Mapped (a -> b) (f a)+++instance (Foldable f) => Foldable (Mapped f a) where+ foldMap g (Mapped f xs) = Fold.foldMap (g . f) xs+ foldr g x (Mapped f xs) = Fold.foldr (g . f) x xs+ foldl g x (Mapped f xs) = Fold.foldl (\acc -> g acc . f) x xs
src/Data/NonEmpty/Map.hs view
@@ -17,9 +17,12 @@ union, unionLeft, unionRight,+ map,+ mapWithKey, ) where import qualified Data.NonEmpty.Set as NonEmptySet+import qualified Data.NonEmpty.Class as C import qualified Data.NonEmpty as NonEmpty import qualified Data.Map as Map@@ -27,6 +30,7 @@ import Control.Monad (mzero, ) import Control.Applicative (liftA2, )+import Control.DeepSeq (NFData, rnf, ) import Data.Traversable (Traversable, traverse, ) import Data.Foldable (Foldable, foldMap, ) import Data.Monoid (mappend, )@@ -34,7 +38,7 @@ import Data.Tuple.HT (forcePair, mapSnd, ) import Data.Ord.HT (comparing, ) -import Prelude hiding (lookup, )+import Prelude hiding (map, lookup, ) {-@@ -50,7 +54,7 @@ showsPrec 11 (toAscList xs) instance (Ord k) => Functor (T k) where- fmap f (Cons x xs) = Cons (mapSnd f x) (fmap f xs)+ fmap = map instance (Ord k) => Foldable (T k) where foldMap f (Cons x xs) = mappend (f (snd x)) (foldMap f xs)@@ -59,7 +63,13 @@ traverse f (Cons x xs) = liftA2 Cons (fmap ((,) (fst x)) $ f (snd x)) (traverse f xs) +instance (NFData k, NFData a) => NFData (T k a) where+ rnf = C.rnf +instance (NFData k) => C.NFData (T k) where+ rnf (Cons x xs) = rnf (x, C.rnf xs)++ insert :: Ord k => k -> a -> Map k a -> T k a insert = curry $ insertGen fst @@ -138,3 +148,9 @@ unionRight :: (Ord k) => T k a -> Map k a -> T k a unionRight (Cons x xs) ys = insertGen fst x $ Map.union xs ys++map :: (Ord k) => (a -> b) -> T k a -> T k b+map f (Cons x xs) = Cons (mapSnd f x) (Map.map f xs)++mapWithKey :: (Ord k) => (k -> a -> b) -> T k a -> T k b+mapWithKey f (Cons x@(k,_a) xs) = Cons (k, uncurry f x) (Map.mapWithKey f xs)
src/Data/NonEmpty/Mixed.hs view
@@ -8,6 +8,7 @@ -} module Data.NonEmpty.Mixed where +import qualified Data.NonEmpty.Foldable as FoldU import qualified Data.NonEmpty.Class as C import qualified Data.NonEmpty as NonEmpty import qualified Data.Empty as Empty@@ -15,6 +16,7 @@ import Data.Traversable (Traversable, mapAccumL, sequenceA, ) import Data.Foldable (Foldable, foldr, ) import Data.Tuple.HT (mapFst, mapSnd, )+import Data.Eq.HT (equating, ) import Prelude hiding (splitAt, take, foldr, scanl, scanr, ) @@ -34,6 +36,34 @@ [] -> ([],yt) in NonEmpty.Cons x0 xr : yr) []++groupPairs :: (Foldable f, Eq a) => f (a,b) -> [(a, NonEmpty.T [] b)]+groupPairs =+ map (\xs -> (fst $ NonEmpty.head xs, fmap snd xs)) .+ groupBy (equating fst)++groupKey :: (Foldable f, Eq a) => (b -> a) -> f b -> [(a, NonEmpty.T [] b)]+groupKey f = groupPairs . FoldU.Mapped (\b -> (f b, b))++groupEithers ::+ (Foldable f) =>+ f (Either a b) -> [Either (NonEmpty.T [] a) (NonEmpty.T [] b)]+groupEithers =+ foldr+ (\x xs ->+ case x of+ Left a ->+ uncurry (:) $ mapFst (Left . NonEmpty.Cons a) $+ case xs of+ Left as : ys -> (NonEmpty.flatten as, ys)+ ys -> ([], ys)+ Right b ->+ uncurry (:) $ mapFst (Right . NonEmpty.Cons b) $+ case xs of+ Right bs : ys -> (NonEmpty.flatten bs, ys)+ ys -> ([], ys))+ []+ segmentAfter :: (Foldable f) =>
src/Data/NonEmpty/Set.hs view
@@ -4,24 +4,34 @@ singleton, member, size,- minView,- maxView, fromList, toAscList,+ fetch, flatten, union, unionLeft, unionRight,++ findMin,+ findMax,+ deleteMin,+ deleteMax,+ deleteFindMin,+ deleteFindMax,+ minView,+ maxView, ) where +import qualified Data.NonEmpty.Class as C import qualified Data.NonEmpty as NonEmpty import qualified Data.Set as Set import Data.Set (Set, ) import Control.Monad (mzero, )+import Control.DeepSeq (NFData, rnf, ) import Data.Maybe (fromMaybe, )-import Data.Tuple.HT (forcePair, )+import Data.Tuple.HT (forcePair, mapSnd, ) {-@@ -40,6 +50,13 @@ showsPrec 11 (toAscList xs) +instance (NFData a) => NFData (T a) where+ rnf = C.rnf++instance C.NFData T where+ rnf (Cons x xs) = rnf (x, C.rnf xs)++ {- | We cannot have a reasonable @instance Insert Set@, since the @instance Insert (NonEmpty Set)@@@ -80,6 +97,33 @@ size :: T a -> Int size (Cons _ xs) = 1 + Set.size xs ++findMin :: T a -> a+findMin (Cons x _) = x++findMax :: T a -> a+findMax (Cons x xs) =+ if Set.null xs then x else Set.findMax xs+++deleteMin :: T a -> Set a+deleteMin (Cons _ xs) = xs++deleteMax :: (Ord a) => T a -> Set a+deleteMax (Cons x xs) =+ if Set.null xs then Set.empty else Set.insert x $ Set.deleteMax xs+++deleteFindMin :: T a -> (a, Set a)+deleteFindMin (Cons x xs) = (x, xs)++deleteFindMax :: (Ord a) => T a -> (a, Set a)+deleteFindMax (Cons x xs) =+ if Set.null xs+ then (x, Set.empty)+ else mapSnd (Set.insert x) $ Set.deleteFindMax xs++ minView :: T a -> (a, Set a) minView (Cons x xs) = (x,xs) @@ -90,12 +134,16 @@ Nothing -> (x,xs) Just (y,ys) -> (y, Set.insert x ys) + fromList :: (Ord a) => NonEmpty.T [] a -> T a fromList (NonEmpty.Cons x xs) = insert x $ Set.fromList xs toAscList :: T a -> NonEmpty.T [] a toAscList (Cons x xs) = NonEmpty.Cons x $ Set.toAscList xs +fetch :: (Ord a) => Set a -> Maybe (T a)+fetch = fmap (uncurry Cons) . Set.minView+ flatten :: (Ord a) => T a -> Set a flatten (Cons x xs) = Set.insert x xs @@ -116,3 +164,16 @@ unionRight :: (Ord a) => T a -> Set a -> T a unionRight (Cons x xs) ys = insertGen fst x $ Set.union xs ys+++{-+According Set functions are only available since containers-0.5.2, i.e. GHC-7.8.++elemAt :: Int -> T a -> a+elemAt k (Cons x xs) =+ if k==0 then x else Set.elemAt (pred k) xs++deleteAt :: Int -> T a -> Set a+deleteAt k (Cons _ xs) =+ if k==0 then xs else Set.deleteAt (pred k) xs+-}
src/Data/NonEmptyPrivate.hs view
@@ -1,5 +1,6 @@ module Data.NonEmptyPrivate where +import qualified Data.NonEmpty.Foldable as FoldU import qualified Data.NonEmpty.Class as C import qualified Data.Empty as Empty @@ -15,18 +16,19 @@ import Data.Foldable (Foldable, ) import Control.Monad (Monad, return, (=<<), ) import Control.Applicative (Applicative, liftA2, pure, (<*>), )+import Control.DeepSeq (NFData, rnf, ) import Data.Functor (Functor, fmap, ) import Data.Function (flip, const, ($), (.), ) import Data.Maybe (Maybe(Just, Nothing), maybe, mapMaybe, ) import Data.Bool.HT (if', ) import Data.Bool (Bool(True), (&&), )-import Data.Ord (Ord, Ordering(GT), (<), (>), compare, comparing, )+import Data.Ord (Ord, Ordering(GT), (<=), (>), compare, comparing, ) import Data.Eq ((==), ) import Data.Tuple.HT (mapFst, mapSnd, swap, ) import Data.Tuple (fst, snd, ) import qualified Prelude as P-import Prelude (Eq, Show, Num, uncurry, )+import Prelude (Eq, Show, Num, Int, uncurry, ($!), ) import qualified Test.QuickCheck as QC @@ -67,6 +69,14 @@ data T f a = Cons { head :: a, tail :: f a } deriving (Eq, Ord) ++instance (C.NFData f, NFData a) => NFData (T f a) where+ rnf = C.rnf++instance (C.NFData f) => C.NFData (T f) where+ rnf (Cons x xs) = rnf (x, C.rnf xs)++ instance (C.Show f, Show a) => Show (T f a) where showsPrec = C.showsPrec @@ -277,8 +287,14 @@ in order to get the same result as 'foldl1' or 'foldr1'. -} foldBalanced :: (a -> a -> a) -> T [] a -> a-foldBalanced f xs@(Cons _ rs) =- let reduce (z0:z1:zs) = f z0 z1 : reduce zs+foldBalanced = foldBalancedGen (:)++foldBalancedStrict :: (a -> a -> a) -> T [] a -> a+foldBalancedStrict = foldBalancedGen (\x -> ((:) $! x))++foldBalancedGen :: (a -> [a] -> [a]) -> (a -> a -> a) -> T [] a -> a+foldBalancedGen listCons f xs@(Cons _ rs) =+ let reduce (z0:z1:zs) = listCons (f z0 z1) (reduce zs) reduce zs = zs ys = appendRight xs $ Match.take rs $ reduce $ flatten ys in last ys@@ -303,18 +319,12 @@ -- | maximumKey is a total function maximumKey :: (Ord b, Foldable f) => (a -> b) -> T f a -> a maximumKey f =- snd .- foldl1Map- (\ky0 ky1 -> if fst ky0 < fst ky1 then ky1 else ky0)- (attachKey f)+ snd . Fold.maximumBy (comparing fst) . FoldU.Mapped (attachKey f) -- | minimumKey is a total function minimumKey :: (Ord b, Foldable f) => (a -> b) -> T f a -> a minimumKey f =- snd .- foldl1Map- (\ky0 ky1 -> if fst ky0 > fst ky1 then ky1 else ky0)- (attachKey f)+ snd . Fold.minimumBy (comparing fst) . FoldU.Mapped (attachKey f) -- | maximumKey is a total function _maximumKey :: (Ord b, Foldable f, Functor f) => (a -> b) -> T f a -> a@@ -520,59 +530,31 @@ -class Functor f => RemoveEach f where- removeEach :: T f a -> T f (a, f a)+mapWithIndex :: (Traversable f) => (Int -> a -> b) -> Int -> f a -> f b+mapWithIndex f n = snd . mapAccumL (\k x -> (P.succ k, f k x)) n -instance RemoveEach [] where- removeEach (Cons x xs) =- Cons (x, xs) (fmap (mapSnd (x:)) $ ListHT.removeEach xs)+removeAt :: (Traversable f) => Int -> T f a -> (a, f a)+removeAt n (Cons x0 xs) =+ mapAccumL (\x (k,y) -> if k<=n then (y,x) else (x,y)) x0 $+ mapWithIndex (,) 1 xs -instance RemoveEach Empty.T where- removeEach (Cons x Empty.Cons) = Cons (x, Empty.Cons) Empty.Cons+removeEach :: (Traversable f) => T f a -> T f (a, f a)+removeEach xs = mapWithIndex (\n _ -> removeAt n xs) 0 xs -instance RemoveEach f => RemoveEach (T f) where- removeEach (Cons x xs) =- Cons (x, xs) (fmap (mapSnd (x !:)) $ removeEach xs) -instance RemoveEach Maybe where- removeEach (Cons x0 xs) =- (\ ~(a,b) -> Cons (x0, a) b) $- case xs of- Nothing -> (Nothing, Nothing)- Just x1 -> (Just x1, Just (x1, Just x0)) - {- It is somehow better than the variant in NonEmpty.Mixed, since it can be applied to nested NonEmptys.--}-class Tails f where- tails :: (C.Cons g, C.Empty g) => f a -> T f (g a) -instance Tails [] where- tails = tailsTraversable--instance Tails Empty.T where- tails Empty.Cons = Cons C.empty Empty.Cons--instance Tails f => Tails (T f) where- tails (Cons x xs) =- case tails xs of- xss -> Cons (C.cons x $ head xss) xss--instance Tails Maybe where- tails xs =- force $- case xs of- Nothing -> Cons C.empty Nothing- Just x -> Cons (C.cons x C.empty) (Just C.empty)--instance Tails Seq where- tails = tailsTraversable--tailsTraversable :: (Traversable f, C.Cons g, C.Empty g) => f a -> T f (g a)-tailsTraversable =- uncurry cons . mapAccumR (\xs x -> (C.cons x xs, xs)) C.empty+Type @g@ could be fixed to List,+since context (C.Cons g, C.Empty g) means+that @g@ is a supertype of something isomorphic to list.+However, repeatedly prepending an element might be more efficient+than repeated conversion from list to a structure like Sequence.+-}+tails :: (Traversable f, C.Cons g, C.Empty g) => f a -> T f (g a)+tails = scanr C.cons C.empty {- |@@ -580,9 +562,7 @@ like 'Sequence'. Alternatively you may consider 'initsRev'. -}-inits ::- (Traversable f, C.Snoc g, C.Empty g) =>- f a -> T f (g a)+inits :: (Traversable f, C.Snoc g, C.Empty g) => f a -> T f (g a) inits = scanl C.snoc C.empty {-@@ -686,3 +666,10 @@ (Traversable f) => (a -> a -> b) -> T f a -> f b mapAdjacent f (Cons x xs) = snd $ mapAccumL (\a0 a1 -> (a1, f a0 a1)) x xs++{-+A nice function but not particularly related to NonEmpty.+Maybe move it to Class module?+-}+mapAdjacent1 :: (Traversable f) => (a -> a -> b -> c) -> a -> f (a,b) -> f c+mapAdjacent1 f = (snd.) . mapAccumL (\a0 (a1,b) -> (a1, f a0 a1 b))
src/Data/Optional.hs view
@@ -13,6 +13,7 @@ import qualified Data.Traversable as Trav import qualified Data.Foldable as Fold import Control.Applicative (pure, liftA2, )+import Control.DeepSeq (NFData, rnf, ) import qualified Test.QuickCheck as QC @@ -20,7 +21,6 @@ import Data.Functor (fmap, ) import Data.Function (($), (.), ) import Data.Ord (Ord, Ordering(GT), (>), )-import Data.Tuple.HT (mapSnd, ) import qualified Prelude as P import Prelude (Eq, uncurry, ) @@ -35,6 +35,14 @@ fromNonEmpty (NonEmpty.Cons x xs) = Cons x xs +instance (C.NFData f, NFData a) => NFData (T f a) where+ rnf = C.rnf++instance (C.NFData f) => C.NFData (T f) where+ rnf Nil = ()+ rnf (Cons x xs) = rnf (x, C.rnf xs)++ instance (C.Show f, P.Show a) => P.Show (T f a) where showsPrec = C.showsPrec @@ -81,6 +89,9 @@ instance (C.Repeat f) => C.Repeat (T f) where repeat x = Cons x $ C.repeat x +instance (C.Iterate f) => C.Iterate (T f) where+ iterate f x = Cons x $ C.iterate f (f x)+ instance C.Zip f => C.Zip (T f) where zipWith f (Cons x xs) (Cons y ys) = Cons (f x y) (C.zipWith f xs ys) zipWith _ _ _ = Nil@@ -119,19 +130,3 @@ case f y x of GT -> (x, fromNonEmpty $ NonEmpty.insertBy f y xs) _ -> (y, xt)--instance NonEmpty.RemoveEach f => NonEmpty.RemoveEach (T f) where- removeEach (NonEmpty.Cons x Nil) = NonEmpty.Cons (x, Nil) Nil- removeEach (NonEmpty.Cons x0 xs0@(Cons x1 xs1)) =- NonEmpty.Cons (x0, xs0) $- fmap (mapSnd (x0 ?:)) $- fromNonEmpty $ NonEmpty.removeEach $ NonEmpty.Cons x1 xs1--instance NonEmpty.Tails f => NonEmpty.Tails (T f) where- tails xt =- NonEmpty.force $- case xt of- Nil -> NonEmpty.Cons C.empty Nil- Cons x xs ->- case NonEmpty.tails xs of- xss -> NonEmpty.Cons (C.cons x $ NonEmpty.head xss) (fromNonEmpty xss)
src/Data/Zip.hs view
@@ -5,6 +5,7 @@ import qualified Data.Traversable as Trav import Data.Traversable (Traversable, ) import Control.Applicative (Applicative, pure, (<*>), )+import Control.DeepSeq (NFData, rnf, ) {- |@@ -18,6 +19,13 @@ instance (C.Zip f, C.Repeat f) => Applicative (T f) where pure a = Cons $ C.repeat a Cons f <*> Cons x = Cons $ C.zipWith ($) f x+++instance (C.NFData f, NFData a) => NFData (T f a) where+ rnf = C.rnf++instance (C.NFData f) => C.NFData (T f) where+ rnf = C.rnf . decons {- |