module VectorExtras.Generic ( module Basics, fromFoldable, fromFoldableNarrowing, ) where import Data.Vector.Generic hiding (foldl') import qualified VectorExtras.Accumulator as VAcc import VectorExtras.Basics.Generic as Basics import VectorExtras.Prelude {-# INLINE fromFoldable #-} fromFoldable :: (Foldable f, Vector v a) => f a -> v a fromFoldable :: forall (f :: * -> *) (v :: * -> *) a. (Foldable f, Vector v a) => f a -> v a fromFoldable = Accumulator a -> v a forall (v :: * -> *) a. Vector v a => Accumulator a -> v a VAcc.toVector (Accumulator a -> v a) -> (f a -> Accumulator a) -> f a -> v a forall b c a. (b -> c) -> (a -> b) -> a -> c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . (Accumulator a -> a -> Accumulator a) -> Accumulator a -> f a -> Accumulator a forall b a. (b -> a -> b) -> b -> f a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl' ((a -> Accumulator a -> Accumulator a) -> Accumulator a -> a -> Accumulator a forall a b c. (a -> b -> c) -> b -> a -> c flip a -> Accumulator a -> Accumulator a forall a. a -> Accumulator a -> Accumulator a VAcc.add) Accumulator a forall a. Accumulator a VAcc.init {-# INLINE fromFoldableNarrowing #-} fromFoldableNarrowing :: (Foldable f, Vector v b) => (a -> Maybe b) -> f a -> v b fromFoldableNarrowing :: forall (f :: * -> *) (v :: * -> *) b a. (Foldable f, Vector v b) => (a -> Maybe b) -> f a -> v b fromFoldableNarrowing a -> Maybe b narrow = Accumulator b -> v b forall (v :: * -> *) a. Vector v a => Accumulator a -> v a VAcc.toVector (Accumulator b -> v b) -> (f a -> Accumulator b) -> f a -> v b forall b c a. (b -> c) -> (a -> b) -> a -> c forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k). Category cat => cat b c -> cat a b -> cat a c . (Accumulator b -> a -> Accumulator b) -> Accumulator b -> f a -> Accumulator b forall b a. (b -> a -> b) -> b -> f a -> b forall (t :: * -> *) b a. Foldable t => (b -> a -> b) -> b -> t a -> b foldl' Accumulator b -> a -> Accumulator b step Accumulator b forall a. Accumulator a VAcc.init where step :: Accumulator b -> a -> Accumulator b step Accumulator b acc a el = case a -> Maybe b narrow a el of Maybe b Nothing -> Accumulator b acc Just b narrowed -> b -> Accumulator b -> Accumulator b forall a. a -> Accumulator a -> Accumulator a VAcc.add b narrowed Accumulator b acc