sized-1.0.0.0: Sized sequence data-types
Safe HaskellNone
LanguageHaskell2010

Data.Sized

Description

This module provides the functionality to make length-parametrized types from existing CFreeMonoid sequential types.

Most of the complexity of operations for Sized f n a are the same as original operations for f. For example, !! is O(1) for Sized Vector n a but O(i) for Sized [] n a.

This module also provides powerful view types and pattern synonyms to inspect the sized sequence. See Views and Patterns for more detail.

Synopsis

Main Data-types

data Sized (f :: Type -> Type) (n :: Nat) a Source #

Sized wraps a sequential type f and makes length-parametrized version.

Here, f must be the instance of CFreeMonoid (f a) a for all a@.

Since 0.2.0.0

Instances

Instances details
(Integral i, FunctorWithIndex i f, KnownNat n) => FunctorWithIndex (Ordinal n) (Sized f n) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

Methods

imap :: (Ordinal n -> a -> b) -> Sized f n a -> Sized f n b #

imapped :: IndexedSetter (Ordinal n) (Sized f n a) (Sized f n b) a b #

(Integral i, FoldableWithIndex i f, KnownNat n) => FoldableWithIndex (Ordinal n) (Sized f n) Source #

Since 0.4.0.0

Instance details

Defined in Data.Sized.Internal

Methods

ifoldMap :: Monoid m => (Ordinal n -> a -> m) -> Sized f n a -> m #

ifolded :: IndexedFold (Ordinal n) (Sized f n a) a #

ifoldr :: (Ordinal n -> a -> b -> b) -> b -> Sized f n a -> b #

ifoldl :: (Ordinal n -> b -> a -> b) -> b -> Sized f n a -> b #

ifoldr' :: (Ordinal n -> a -> b -> b) -> b -> Sized f n a -> b #

ifoldl' :: (Ordinal n -> b -> a -> b) -> b -> Sized f n a -> b #

(Integral i, TraversableWithIndex i f, KnownNat n) => TraversableWithIndex (Ordinal n) (Sized f n) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

Methods

itraverse :: Applicative f0 => (Ordinal n -> a -> f0 b) -> Sized f n a -> f0 (Sized f n b) #

itraversed :: IndexedTraversal (Ordinal n) (Sized f n a) (Sized f n b) a b #

Functor f => Functor (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

fmap :: (a -> b) -> Sized f n a -> Sized f n b #

(<$) :: a -> Sized f n b -> Sized f n a #

(Functor f, CFreeMonoid f, CZip f, KnownNat n, forall a. DomC f a) => Applicative (Sized f n) Source #

Applicative instance, generalizing ZipList.

Instance details

Defined in Data.Sized

Methods

pure :: a -> Sized f n a #

(<*>) :: Sized f n (a -> b) -> Sized f n a -> Sized f n b #

liftA2 :: (a -> b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

(*>) :: Sized f n a -> Sized f n b -> Sized f n b #

(<*) :: Sized f n a -> Sized f n b -> Sized f n a #

Foldable f => Foldable (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

fold :: Monoid m => Sized f n m -> m #

foldMap :: Monoid m => (a -> m) -> Sized f n a -> m #

foldMap' :: Monoid m => (a -> m) -> Sized f n a -> m #

foldr :: (a -> b -> b) -> b -> Sized f n a -> b #

foldr' :: (a -> b -> b) -> b -> Sized f n a -> b #

foldl :: (b -> a -> b) -> b -> Sized f n a -> b #

foldl' :: (b -> a -> b) -> b -> Sized f n a -> b #

foldr1 :: (a -> a -> a) -> Sized f n a -> a #

foldl1 :: (a -> a -> a) -> Sized f n a -> a #

toList :: Sized f n a -> [a] #

null :: Sized f n a -> Bool #

length :: Sized f n a -> Int #

elem :: Eq a => a -> Sized f n a -> Bool #

maximum :: Ord a => Sized f n a -> a #

minimum :: Ord a => Sized f n a -> a #

sum :: Num a => Sized f n a -> a #

product :: Num a => Sized f n a -> a #

Traversable f => Traversable (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

traverse :: Applicative f0 => (a -> f0 b) -> Sized f n a -> f0 (Sized f n b) #

sequenceA :: Applicative f0 => Sized f n (f0 a) -> f0 (Sized f n a) #

mapM :: Monad m => (a -> m b) -> Sized f n a -> m (Sized f n b) #

sequence :: Monad m => Sized f n (m a) -> m (Sized f n a) #

CFoldable f => CFoldable (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

cfoldMap :: (Dom (Sized f n) a, Monoid w) => (a -> w) -> Sized f n a -> w #

cfoldMap' :: (Dom (Sized f n) a, Monoid m) => (a -> m) -> Sized f n a -> m #

cfold :: (Dom (Sized f n) w, Monoid w) => Sized f n w -> w #

cfoldr :: Dom (Sized f n) a => (a -> b -> b) -> b -> Sized f n a -> b #

cfoldlM :: (Monad m, Dom (Sized f n) b) => (a -> b -> m a) -> a -> Sized f n b -> m a #

cfoldlM' :: (Monad m, Dom (Sized f n) b) => (a -> b -> m a) -> a -> Sized f n b -> m a #

cfoldrM :: (Monad m, Dom (Sized f n) a) => (a -> b -> m b) -> b -> Sized f n a -> m b #

cfoldrM' :: (Monad m, Dom (Sized f n) a) => (a -> b -> m b) -> b -> Sized f n a -> m b #

cfoldl :: Dom (Sized f n) a => (b -> a -> b) -> b -> Sized f n a -> b #

cfoldr' :: Dom (Sized f n) a => (a -> b -> b) -> b -> Sized f n a -> b #

cfoldl' :: Dom (Sized f n) a => (b -> a -> b) -> b -> Sized f n a -> b #

cbasicToList :: Dom (Sized f n) a => Sized f n a -> [a] #

cfoldr1 :: Dom (Sized f n) a => (a -> a -> a) -> Sized f n a -> a #

cfoldl1 :: Dom (Sized f n) a => (a -> a -> a) -> Sized f n a -> a #

cindex :: Dom (Sized f n) a => Sized f n a -> Int -> a #

cnull :: Dom (Sized f n) a => Sized f n a -> Bool #

clength :: Dom (Sized f n) a => Sized f n a -> Int #

cany :: Dom (Sized f n) a => (a -> Bool) -> Sized f n a -> Bool #

call :: Dom (Sized f n) a => (a -> Bool) -> Sized f n a -> Bool #

celem :: (Eq a, Dom (Sized f n) a) => a -> Sized f n a -> Bool #

cnotElem :: (Eq a, Dom (Sized f n) a) => a -> Sized f n a -> Bool #

cminimum :: (Ord a, Dom (Sized f n) a) => Sized f n a -> a #

cmaximum :: (Ord a, Dom (Sized f n) a) => Sized f n a -> a #

csum :: (Num a, Dom (Sized f n) a) => Sized f n a -> a #

cproduct :: (Num a, Dom (Sized f n) a) => Sized f n a -> a #

cctraverse_ :: (CApplicative g, CPointed g, Dom g (), Dom (Sized f n) a, Dom g b) => (a -> g b) -> Sized f n a -> g () #

ctraverse_ :: (Applicative g, Dom (Sized f n) a) => (a -> g b) -> Sized f n a -> g () #

clast :: Dom (Sized f n) a => Sized f n a -> a #

chead :: Dom (Sized f n) a => Sized f n a -> a #

cfind :: Dom (Sized f n) a => (a -> Bool) -> Sized f n a -> Maybe a #

cfindIndex :: Dom (Sized f n) a => (a -> Bool) -> Sized f n a -> Maybe Int #

cfindIndices :: Dom (Sized f n) a => (a -> Bool) -> Sized f n a -> [Int] #

celemIndex :: (Dom (Sized f n) a, Eq a) => a -> Sized f n a -> Maybe Int #

celemIndices :: (Dom (Sized f n) a, Eq a) => a -> Sized f n a -> [Int] #

CTraversable f => CTraversable (Sized f n) Source # 
Instance details

Defined in Data.Sized

Methods

ctraverse :: (Dom (Sized f n) a, Dom (Sized f n) b, Applicative g) => (a -> g b) -> Sized f n a -> g (Sized f n b) #

(CZip f, CFreeMonoid f) => CZip (Sized f n) Source # 
Instance details

Defined in Data.Sized

Methods

czipWith :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) c) => (a -> b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

czip :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a, b)) => Sized f n a -> Sized f n b -> Sized f n (a, b) #

(KnownNat n, CZip f, CFreeMonoid f) => CRepeat (Sized f n) Source # 
Instance details

Defined in Data.Sized

Methods

crepeat :: Dom (Sized f n) a => a -> Sized f n a #

(CFreeMonoid f, CZip f) => CApplicative (Sized f n) Source # 
Instance details

Defined in Data.Sized

Methods

pair :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a, b)) => Sized f n a -> Sized f n b -> Sized f n (a, b) #

(<.>) :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a -> b)) => Sized f n (a -> b) -> Sized f n a -> Sized f n b #

(.>) :: (Dom (Sized f n) a, Dom (Sized f n) b) => Sized f n a -> Sized f n b -> Sized f n b #

(<.) :: (Dom (Sized f n) a, Dom (Sized f n) b) => Sized f n a -> Sized f n b -> Sized f n a #

(CFreeMonoid f, KnownNat n) => CPointed (Sized f n) Source # 
Instance details

Defined in Data.Sized

Methods

cpure :: Dom (Sized f n) a => a -> Sized f n a #

(CZip f, CFreeMonoid f) => CSemialign (Sized f n) Source #

N.B. Since calign is just zipping for fixed n, we require more strong CZip constraint here.

Instance details

Defined in Data.Sized

Methods

calignWith :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) c) => (These a b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

calign :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (These a b)) => Sized f n a -> Sized f n b -> Sized f n (These a b) #

Constrained (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Associated Types

type Dom (Sized f n) a #

CFunctor f => CFunctor (Sized f n) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

cmap :: (Dom (Sized f n) a, Dom (Sized f n) b) => (a -> b) -> Sized f n a -> Sized f n b #

(<$:) :: (Dom (Sized f n) a, Dom (Sized f n) b) => a -> Sized f n b -> Sized f n a #

Eq (f a) => Eq (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

(==) :: Sized f n a -> Sized f n a -> Bool #

(/=) :: Sized f n a -> Sized f n a -> Bool #

Ord (f a) => Ord (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

compare :: Sized f n a -> Sized f n a -> Ordering #

(<) :: Sized f n a -> Sized f n a -> Bool #

(<=) :: Sized f n a -> Sized f n a -> Bool #

(>) :: Sized f n a -> Sized f n a -> Bool #

(>=) :: Sized f n a -> Sized f n a -> Bool #

max :: Sized f n a -> Sized f n a -> Sized f n a #

min :: Sized f n a -> Sized f n a -> Sized f n a #

Show (f a) => Show (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

showsPrec :: Int -> Sized f n a -> ShowS #

show :: Sized f n a -> String #

showList :: [Sized f n a] -> ShowS #

NFData (f a) => NFData (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

rnf :: Sized f n a -> () #

Hashable (f a) => Hashable (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

hashWithSalt :: Int -> Sized f n a -> Int #

hash :: Sized f n a -> Int #

(Integral (Index (f a)), Ixed (f a)) => Ixed (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

Methods

ix :: Index (Sized f n a) -> Traversal' (Sized f n a) (IxValue (Sized f n a)) #

MonoFunctor (f a) => MonoFunctor (Sized f n a) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

Methods

omap :: (Element (Sized f n a) -> Element (Sized f n a)) -> Sized f n a -> Sized f n a #

MonoFoldable (f a) => MonoFoldable (Sized f n a) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

Methods

ofoldMap :: Monoid m => (Element (Sized f n a) -> m) -> Sized f n a -> m #

ofoldr :: (Element (Sized f n a) -> b -> b) -> b -> Sized f n a -> b #

ofoldl' :: (a0 -> Element (Sized f n a) -> a0) -> a0 -> Sized f n a -> a0 #

otoList :: Sized f n a -> [Element (Sized f n a)] #

oall :: (Element (Sized f n a) -> Bool) -> Sized f n a -> Bool #

oany :: (Element (Sized f n a) -> Bool) -> Sized f n a -> Bool #

onull :: Sized f n a -> Bool #

olength :: Sized f n a -> Int #

olength64 :: Sized f n a -> Int64 #

ocompareLength :: Integral i => Sized f n a -> i -> Ordering #

otraverse_ :: Applicative f0 => (Element (Sized f n a) -> f0 b) -> Sized f n a -> f0 () #

ofor_ :: Applicative f0 => Sized f n a -> (Element (Sized f n a) -> f0 b) -> f0 () #

omapM_ :: Applicative m => (Element (Sized f n a) -> m ()) -> Sized f n a -> m () #

oforM_ :: Applicative m => Sized f n a -> (Element (Sized f n a) -> m ()) -> m () #

ofoldlM :: Monad m => (a0 -> Element (Sized f n a) -> m a0) -> a0 -> Sized f n a -> m a0 #

ofoldMap1Ex :: Semigroup m => (Element (Sized f n a) -> m) -> Sized f n a -> m #

ofoldr1Ex :: (Element (Sized f n a) -> Element (Sized f n a) -> Element (Sized f n a)) -> Sized f n a -> Element (Sized f n a) #

ofoldl1Ex' :: (Element (Sized f n a) -> Element (Sized f n a) -> Element (Sized f n a)) -> Sized f n a -> Element (Sized f n a) #

headEx :: Sized f n a -> Element (Sized f n a) #

lastEx :: Sized f n a -> Element (Sized f n a) #

unsafeHead :: Sized f n a -> Element (Sized f n a) #

unsafeLast :: Sized f n a -> Element (Sized f n a) #

maximumByEx :: (Element (Sized f n a) -> Element (Sized f n a) -> Ordering) -> Sized f n a -> Element (Sized f n a) #

minimumByEx :: (Element (Sized f n a) -> Element (Sized f n a) -> Ordering) -> Sized f n a -> Element (Sized f n a) #

oelem :: Element (Sized f n a) -> Sized f n a -> Bool #

onotElem :: Element (Sized f n a) -> Sized f n a -> Bool #

MonoTraversable (f a) => MonoTraversable (Sized f n a) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

Methods

otraverse :: Applicative f0 => (Element (Sized f n a) -> f0 (Element (Sized f n a))) -> Sized f n a -> f0 (Sized f n a) #

omapM :: Applicative m => (Element (Sized f n a) -> m (Element (Sized f n a))) -> Sized f n a -> m (Sized f n a) #

Storable a => MonoTraversable (Sized Vector n a) Source #

Since 0.6.0.0

Instance details

Defined in Data.Sized.Internal

Methods

otraverse :: Applicative f => (Element (Sized Vector n a) -> f (Element (Sized Vector n a))) -> Sized Vector n a -> f (Sized Vector n a) #

omapM :: Applicative m => (Element (Sized Vector n a) -> m (Element (Sized Vector n a))) -> Sized Vector n a -> m (Sized Vector n a) #

Unbox a => MonoTraversable (Sized Vector n a) Source #

Since 0.6.0.0

Instance details

Defined in Data.Sized.Internal

Methods

otraverse :: Applicative f => (Element (Sized Vector n a) -> f (Element (Sized Vector n a))) -> Sized Vector n a -> f (Sized Vector n a) #

omapM :: Applicative m => (Element (Sized Vector n a) -> m (Element (Sized Vector n a))) -> Sized Vector n a -> m (Sized Vector n a) #

type Dom (Sized f n) a Source # 
Instance details

Defined in Data.Sized.Internal

type Dom (Sized f n) a = Dom f a
type Index (Sized f n a) Source #

Since 0.2.0.0

Instance details

Defined in Data.Sized.Internal

type Index (Sized f n a) = Ordinal n
type IxValue (Sized f n a) Source #

Since 0.3.0.0

Instance details

Defined in Data.Sized.Internal

type IxValue (Sized f n a) = IxValue (f a)
type Element (Sized f n a) Source # 
Instance details

Defined in Data.Sized.Internal

type Element (Sized f n a) = Element (f a)

data SomeSized f a where Source #

Sized vector with the length is existentially quantified. This type is used mostly when the return type's length cannot be statically determined beforehand.

SomeSized sn xs :: SomeSized f a stands for the Sized sequence xs of element type a and length sn.

Since 0.7.0.0

Constructors

SomeSized :: SNat n -> Sized f n a -> SomeSized f a 

Instances

Instances details
Eq (f a) => Eq (SomeSized f a) Source # 
Instance details

Defined in Data.Sized

Methods

(==) :: SomeSized f a -> SomeSized f a -> Bool #

(/=) :: SomeSized f a -> SomeSized f a -> Bool #

Show (f a) => Show (SomeSized f a) Source # 
Instance details

Defined in Data.Sized

Methods

showsPrec :: Int -> SomeSized f a -> ShowS #

show :: SomeSized f a -> String #

showList :: [SomeSized f a] -> ShowS #

class Dom f a => DomC f a Source #

Instances

Instances details
Dom f a => DomC f a Source # 
Instance details

Defined in Data.Sized

Accessors

Length information

length :: forall f (n :: Nat) a. (Dom f a, KnownNat n) => Sized f n a -> Int Source #

Returns the length of wrapped containers. If you use unsafeFromList or similar unsafe functions, this function may return different value from type-parameterized length.

Since 0.8.0.0 (type changed)

sLength :: forall f (n :: Nat) a. (Dom f a, KnownNat n) => Sized f n a -> SNat n Source #

SNat version of length.

Since 0.8.0.0 (type changed)

null :: forall f (n :: Nat) a. (CFoldable f, Dom f a) => Sized f n a -> Bool Source #

Test if the sequence is empty or not.

Since 0.7.0.0

Indexing

(!!) :: forall f (m :: Nat) a. (CFoldable f, Dom f a, 1 <= m) => Sized f m a -> Int -> a Source #

(Unsafe) indexing with Ints. If you want to check boundary statically, use %!! or sIndex.

Since 0.7.0.0

(%!!) :: forall f (n :: Nat) c. (CFoldable f, Dom f c) => Sized f n c -> Ordinal n -> c Source #

Safe indexing with Ordinals.

Since 0.7.0.0

index :: forall f (m :: Nat) a. (CFoldable f, Dom f a, 1 <= m) => Int -> Sized f m a -> a Source #

Flipped version of !!.

Since 0.7.0.0

sIndex :: forall f (n :: Nat) c. (CFoldable f, Dom f c) => Ordinal n -> Sized f n c -> c Source #

Flipped version of %!!.

Since 0.7.0.0

head :: forall f (n :: Nat) a. (CFoldable f, Dom f a, 0 < n) => Sized f n a -> a Source #

Take the first element of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

last :: forall f (n :: Nat) a. (0 < n, CFoldable f, Dom f a) => Sized f n a -> a Source #

Take the last element of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

uncons :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a, 1 <= n) => Sized f n a -> Uncons f n a Source #

Take the head and tail of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

uncons' :: forall f (n :: Nat) a proxy. (KnownNat n, CFreeMonoid f, Dom f a) => proxy n -> Sized f (Succ n) a -> Uncons f (Succ n) a Source #

uncons with explicit specified length n

Since 0.7.0.0

data Uncons f (n :: Nat) a where Source #

Constructors

Uncons :: forall f (n :: Nat) a. KnownNat n => a -> Sized f n a -> Uncons f (1 + n) a 

unsnoc :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a, 0 < n) => Sized f n a -> Unsnoc f n a Source #

Take the init and last of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

unsnoc' :: forall f (n :: Nat) a proxy. (KnownNat n, CFreeMonoid f, Dom f a) => proxy n -> Sized f (Succ n) a -> Unsnoc f (Succ n) a Source #

unsnoc' with explicit specified length n

Since 0.7.0.0

data Unsnoc f n a where Source #

Constructors

Unsnoc :: forall f n a. Sized f (n :: Nat) a -> a -> Unsnoc f (Succ n) a 

Slicing

tail :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f (1 + n) a -> Sized f n a Source #

Take the tail of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

init :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f (n + 1) a -> Sized f n a Source #

Take the initial segment of non-empty sequence. If you want to make case-analysis for general sequence, see Views and Patterns section.

Since 0.7.0.0

take :: forall (n :: Nat) f (m :: Nat) a. (CFreeMonoid f, Dom f a, n <= m) => SNat n -> Sized f m a -> Sized f n a Source #

take k xs takes first k element of xs where the length of xs should be larger than k.

Since 0.7.0.0

takeAtMost :: forall (n :: Nat) f m a. (CFreeMonoid f, Dom f a) => SNat n -> Sized f m a -> Sized f (Min n m) a Source #

takeAtMost k xs takes first at most k elements of xs.

Since 0.7.0.0

drop :: forall (n :: Nat) f (m :: Nat) a. (CFreeMonoid f, Dom f a, n <= m) => SNat n -> Sized f m a -> Sized f (m - n) a Source #

drop k xs drops first k element of xs and returns the rest of sequence, where the length of xs should be larger than k.

Since 0.7.0.0

splitAt :: forall (n :: Nat) f m a. (CFreeMonoid f, Dom f a, n <= m) => SNat n -> Sized f m a -> (Sized f n a, Sized f (m -. n) a) Source #

splitAt k xs split xs at k, where the length of xs should be less than or equal to k.

Since 0.7.0.0

splitAtMost :: forall (n :: Nat) f (m :: Nat) a. (CFreeMonoid f, Dom f a) => SNat n -> Sized f m a -> (Sized f (Min n m) a, Sized f (m -. n) a) Source #

splitAtMost k xs split xs at k. If k exceeds the length of xs, then the second result value become empty.

Since 0.7.0.0

Construction

Initialisation

empty :: forall f a. (Monoid (f a), Dom f a) => Sized f 0 a Source #

Empty sequence.

Since 0.7.0.0 (type changed)

singleton :: forall f a. (CPointed f, Dom f a) => a -> Sized f 1 a Source #

Sequence with one element.

Since 0.7.0.0

toSomeSized :: forall f a. (Dom f a, CFoldable f) => f a -> SomeSized f a Source #

Consruct the Sized sequence from base type, but the length parameter is dynamically determined and existentially quantified; see also SomeSized.

Since 0.7.0.0

replicate :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => SNat n -> a -> Sized f n a Source #

Replicates the same value.

Since 0.7.0.0

replicate' :: forall f (n :: Nat) a. (KnownNat (n :: Nat), CFreeMonoid f, Dom f a) => a -> Sized f n a Source #

replicate with the length inferred.

Since 0.7.0.0

generate :: forall f (n :: Nat) (a :: Type). (CFreeMonoid f, Dom f a) => SNat n -> (Ordinal n -> a) -> Sized f n a Source #

Construct a sequence of the given length by applying the function to each index.

Since 0.7.0.0

generate' :: forall f (n :: Nat) (a :: Type). (KnownNat n, CFreeMonoid f, Dom f a) => (Ordinal n -> a) -> Sized f n a Source #

generate with length inferred.

Since 0.8.0.0

Concatenation

cons :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => a -> Sized f n a -> Sized f (1 + n) a Source #

Append an element to the head of sequence.

Since 0.8.0.0

(<|) :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => a -> Sized f n a -> Sized f (1 + n) a infixr 5 Source #

Infix version of cons.

Since 0.8.0.0

snoc :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f n a -> a -> Sized f (n + 1) a Source #

Append an element to the tail of sequence.

Since 0.7.0.0

(|>) :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f n a -> a -> Sized f (n + 1) a infixl 5 Source #

Infix version of snoc.

Since 0.7.0.0

append :: forall f (n :: Nat) (m :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f n a -> Sized f m a -> Sized f (n + m) a Source #

Append two lists.

Since 0.7.0.0

(++) :: forall f (n :: Nat) (m :: Nat) a. (CFreeMonoid f, Dom f a) => Sized f n a -> Sized f m a -> Sized f (n + m) a infixr 5 Source #

Infix version of append.

Since 0.7.0.0

concat :: forall f' (m :: Nat) f (n :: Nat) a. (CFreeMonoid f, CFunctor f', CFoldable f', Dom f a, Dom f' (f a), Dom f' (Sized f n a)) => Sized f' m (Sized f n a) -> Sized f (m * n) a Source #

Concatenates multiple sequences into one.

Since 0.7.0.0

Zips

zip :: forall f (n :: Nat) a (m :: Nat) b. (Dom f a, CZip f, Dom f b, Dom f (a, b)) => Sized f n a -> Sized f m b -> Sized f (Min n m) (a, b) Source #

Zipping two sequences. Length is adjusted to shorter one.

Since 0.7.0.0

zipSame :: forall f (n :: Nat) a b. (Dom f a, CZip f, Dom f b, Dom f (a, b)) => Sized f n a -> Sized f n b -> Sized f n (a, b) Source #

zip for the sequences of the same length.

Since 0.7.0.0

zipWith :: forall f (n :: Nat) a (m :: Nat) b c. (Dom f a, CZip f, Dom f b, CFreeMonoid f, Dom f c) => (a -> b -> c) -> Sized f n a -> Sized f m b -> Sized f (Min n m) c Source #

Zipping two sequences with funtion. Length is adjusted to shorter one.

Since 0.7.0.0

zipWithSame :: forall f (n :: Nat) a b c. (Dom f a, CZip f, Dom f b, CFreeMonoid f, Dom f c) => (a -> b -> c) -> Sized f n a -> Sized f n b -> Sized f n c Source #

zipWith for the sequences of the same length.

Since 0.7.0.0

unzip :: forall f (n :: Nat) a b. (CUnzip f, Dom f a, Dom f b, Dom f (a, b)) => Sized f n (a, b) -> (Sized f n a, Sized f n b) Source #

Unzipping the sequence of tuples.

Since 0.7.0.0

unzipWith :: forall f (n :: Nat) a b c. (CUnzip f, Dom f a, Dom f b, Dom f c) => (a -> (b, c)) -> Sized f n a -> (Sized f n b, Sized f n c) Source #

Unzipping the sequence of tuples.

Since 0.7.0.0

Transformation

map :: forall f (n :: Nat) a b. (CFreeMonoid f, Dom f a, Dom f b) => (a -> b) -> Sized f n a -> Sized f n b Source #

Map function.

Since 0.7.0.0

reverse :: forall f (n :: Nat) a. (Dom f a, CFreeMonoid f) => Sized f n a -> Sized f n a Source #

Reverse function.

Since 0.7.0.0

intersperse :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => a -> Sized f n a -> Sized f ((2 * n) -. 1) a Source #

Intersperces.

Since 0.7.0.0

nub :: forall f (n :: Nat) a. (Dom f a, Eq a, CFreeMonoid f) => Sized f n a -> SomeSized f a Source #

Remove all duplicates.

Since 0.7.0.0

sort :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a, Ord a) => Sized f n a -> Sized f n a Source #

Sorting sequence by ascending order.

Since 0.7.0.0

sortBy :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> a -> Ordering) -> Sized f n a -> Sized f n a Source #

Generalized version of sort.

Since 0.7.0.0

insert :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a, Ord a) => a -> Sized f n a -> Sized f (Succ n) a Source #

Insert new element into the presorted sequence.

Since 0.7.0.0

insertBy :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> a -> Ordering) -> a -> Sized f n a -> Sized f (Succ n) a Source #

Generalized version of insert.

Since 0.7.0.0

Conversion

List

toList :: forall f (n :: Nat) a. (CFoldable f, Dom f a) => Sized f n a -> [a] Source #

Convert to list.

Since 0.7.0.0

fromList :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => SNat n -> [a] -> Maybe (Sized f n a) Source #

If the given list is shorter than n, then returns Nothing Otherwise returns Sized f n a consisting of initial n element of given list.

Since 0.7.0.0 (type changed)

fromList' :: forall f (n :: Nat) a. (Dom f a, CFreeMonoid f, KnownNat n) => [a] -> Maybe (Sized f n a) Source #

fromList with the result length inferred.

Since 0.7.0.0

unsafeFromList :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => SNat n -> [a] -> Sized f n a Source #

Unsafe version of fromList. If the length of the given list does not equal to n, then something unusual happens.

Since 0.7.0.0

unsafeFromList' :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => [a] -> Sized f n a Source #

unsafeFromList with the result length inferred.

Since 0.7.0.0

fromListWithDefault :: forall f (n :: Nat) a. (Dom f a, CFreeMonoid f) => SNat n -> a -> [a] -> Sized f n a Source #

Construct a Sized f n a by padding default value if the given list is short.

Since 0.5.0.0 (type changed)

fromListWithDefault' :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => a -> [a] -> Sized f n a Source #

fromListWithDefault with the result length inferred.

Since 0.7.0.0

Base container

unsized :: forall f (n :: Nat) a. Sized f n a -> f a Source #

Forget the length and obtain the wrapped base container.

Since 0.7.0.0

toSized :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => SNat (n :: Nat) -> f a -> Maybe (Sized f n a) Source #

If the length of the input is shorter than n, then returns Nothing. Otherwise returns Sized f n a consisting of initial n element of the input.

Since 0.7.0.0

toSized' :: forall f (n :: Nat) a. (Dom f a, CFreeMonoid f, KnownNat n) => f a -> Maybe (Sized f n a) Source #

toSized with the result length inferred.

Since 0.7.0.0

unsafeToSized :: forall f (n :: Nat) a. SNat n -> f a -> Sized f n a Source #

Unsafe version of toSized. If the length of the given list does not equal to n, then something unusual happens.

Since 0.7.0.0

unsafeToSized' :: forall f (n :: Nat) a. (KnownNat n, Dom f a) => f a -> Sized f n a Source #

unsafeToSized with the result length inferred.

Since 0.7.0.0

toSizedWithDefault :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => SNat (n :: Nat) -> a -> f a -> Sized f n a Source #

Construct a Sized f n a by padding default value if the given list is short.

Since 0.7.0.0

toSizedWithDefault' :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => a -> f a -> Sized f n a Source #

toSizedWithDefault with the result length inferred.

Since 0.7.0.0

Querying

Partitioning

data Partitioned f n a where Source #

The type Partitioned f n a represents partitioned sequence of length n. Value Partitioned lenL ls lenR rs stands for:

  • Entire sequence is divided into ls and rs, and their length are lenL and lenR resp.
  • lenL + lenR = n

Since 0.7.0.0

Constructors

Partitioned :: Dom f a => SNat n -> Sized f n a -> SNat m -> Sized f m a -> Partitioned f (n + m) a 

takeWhile :: forall f (n :: Nat) a. (Dom f a, CFreeMonoid f) => (a -> Bool) -> Sized f n a -> SomeSized f a Source #

Take the initial segment as long as elements satisfys the predicate.

Since 0.7.0.0

dropWhile :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> Bool) -> Sized f n a -> SomeSized f a Source #

Drop the initial segment as long as elements satisfys the predicate.

Since 0.7.0.0

span :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> Bool) -> Sized f n a -> Partitioned f n a Source #

Split the sequence into the longest prefix of elements that satisfy the predicate and the rest.

Since 0.7.0.0

break :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> Bool) -> Sized f n a -> Partitioned f n a Source #

Split the sequence into the longest prefix of elements that do not satisfy the predicate and the rest.

Since 0.7.0.0

partition :: forall f (n :: Nat) a. (CFreeMonoid f, Dom f a) => (a -> Bool) -> Sized f n a -> Partitioned f n a Source #

Split the sequence in two parts, the first one containing those elements that satisfy the predicate and the second one those that don't.

Since 0.7.0.0

Searching

elem :: forall f (n :: Nat) a. (CFoldable f, Dom f a, Eq a) => a -> Sized f n a -> Bool Source #

Membership test; see also notElem.

Since 0.7.0.0

notElem :: forall f (n :: Nat) a. (CFoldable f, Dom f a, Eq a) => a -> Sized f n a -> Bool Source #

Negation of elem.

Since 0.7.0.0

find :: forall f (n :: Nat) a. (CFoldable f, Dom f a) => (a -> Bool) -> Sized f n a -> Maybe a Source #

Find the element satisfying the predicate.

Since 0.7.0.0

findIndex :: forall f (n :: Nat) a. (CFoldable f, Dom f a) => (a -> Bool) -> Sized f n a -> Maybe Int Source #

findIndex p xs find the element satisfying p and returns its index if exists.

Since 0.7.0.0

sFindIndex :: forall f (n :: Nat) a. (KnownNat (n :: Nat), CFoldable f, Dom f a) => (a -> Bool) -> Sized f n a -> Maybe (Ordinal n) Source #

Ordinal version of findIndex.

Since 0.7.0.0

findIndices :: forall f (n :: Nat) a. (CFoldable f, Dom f a) => (a -> Bool) -> Sized f n a -> [Int] Source #

findIndices p xs find all elements satisfying p and returns their indices.

Since 0.7.0.0

sFindIndices :: forall f (n :: Nat) a. (CFoldable f, Dom f a, KnownNat (n :: Nat)) => (a -> Bool) -> Sized f n a -> [Ordinal n] Source #

Ordinal version of findIndices.

Since 0.7.0.0

elemIndex :: forall f (n :: Nat) a. (CFoldable f, Eq a, Dom f a) => a -> Sized f n a -> Maybe Int Source #

Returns the index of the given element in the list, if exists.

Since 0.7.0.0

sElemIndex :: forall f (n :: Nat) a. (KnownNat n, CFoldable f, Dom f a, Eq a) => a -> Sized f n a -> Maybe (Ordinal n) Source #

Ordinal version of elemIndex. Since 0.7.0.0, we no longer do boundary check inside the definition.

Since 0.7.0.0

sUnsafeElemIndex :: forall f (n :: Nat) a. (KnownNat n, CFoldable f, Dom f a, Eq a) => a -> Sized f n a -> Maybe (Ordinal n) Source #

Deprecated: No difference with sElemIndex; use sElemIndex instead.

Since 0.5.0.0 (type changed)

Ordinal version of elemIndex. Since 0.7.0.0, we no longer do boundary check inside the definition.

Since 0.7.0.0

elemIndices :: forall f (n :: Nat) a. (CFoldable f, Dom f a, Eq a) => a -> Sized f n a -> [Int] Source #

Returns all indices of the given element in the list.

Since 0.7.0.0

sElemIndices :: forall f (n :: Nat) a. (CFoldable f, KnownNat (n :: Nat), Dom f a, Eq a) => a -> Sized f n a -> [Ordinal n] Source #

Ordinal version of elemIndices

Since 0.7.0.0

Views and Patterns

With GHC's ViewPatterns and PatternSynonym extensions, we can pattern-match on arbitrary Sized f n a if f is list-like functor. Curretnly, there are two direction view and patterns: Cons and Snoc. Assuming underlying sequence type f has O(1) implementation for cnull, chead (resp. clast) and ctail (resp. cinit), We can view and pattern-match on cons (resp. snoc) of Sized f n a in O(1).

Views

With ViewPatterns extension, we can pattern-match on Sized value as follows:

slen :: (KnownNat n, 'Dom f a' f) => Sized f n a -> SNat n
slen (viewCons -> NilCV)    = SZ
slen (viewCons -> _ :- as) = SS (slen as)
slen _                          = error "impossible"

The constraint (KnownNat n, 'Dom f a' f) is needed for view function. In the above, we have extra wildcard pattern (_) at the last. Code compiles if we removed it, but current GHC warns for incomplete pattern, although we know first two patterns exhausts all the case.

Equivalently, we can use snoc-style pattern-matching:

slen :: (KnownNat n, 'Dom f a' f) => Sized f n a -> SNat n
slen (viewSnoc -> NilSV)     = SZ
slen (viewSnoc -> as -:: _) = SS (slen as)

Patterns

So we can pattern match on both end of sequence via views, but it is rather clumsy to nest it. For example:

nextToHead :: ('Dom f a' f, KnownNat n) => Sized f (S (S n)) a -> a
nextToHead (viewCons -> _ :- (viewCons -> a :- _)) = a

In such a case, with PatternSynonyms extension we can write as follows:

nextToHead :: ('Dom f a' f, KnownNat n) => Sized f (S (S n)) a -> a
nextToHead (_ :< a :< _) = a

Of course, we can also rewrite above slen example usNat PatternSynonyms:

slen :: (KnownNat n, 'Dom f a' f) => Sized f n a -> SNat n
slen Nil      = SZ
slen (_ :< as) = SS (slen as)

So, we can use :< and Nil (resp. :> and Nil) to pattern-match directly on cons-side (resp. snoc-side) as we usually do for lists. Nil, :<, and :> are neither functions nor data constructors, but pattern synonyms so we cannot use them in expression contexts. For more detail on pattern synonyms, see GHC Users Guide and HaskellWiki.

Definitions

viewCons :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => Sized f n a -> ConsView f n a Source #

Case analysis for the cons-side of sequence.

Since 0.5.0.0 (type changed)

data ConsView f n a where Source #

View of the left end of sequence (cons-side).

Since 0.7.0.0

Constructors

NilCV :: ConsView f 0 a 
(:-) :: (KnownNat n, KnownNat (1 + n)) => a -> Sized f n a -> ConsView f (1 + n) a infixr 5 

viewSnoc :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => Sized f n a -> SnocView f n a Source #

Case analysis for the snoc-side of sequence.

Since 0.5.0.0 (type changed)

data SnocView f n a where Source #

View of the left end of sequence (snoc-side).

Since 0.7.0.0

Constructors

NilSV :: SnocView f 0 a 
(:-::) :: KnownNat (n :: Nat) => Sized f n a -> a -> SnocView f (n + 1) a infixl 5 

pattern Nil :: forall f (n :: Nat) a. (KnownNat n, CFreeMonoid f, Dom f a) => n ~ 0 => Sized f n a Source #

Pattern synonym for a nil sequence.

pattern (:<) :: forall (f :: Type -> Type) a (n :: Nat). (Dom f a, KnownNat n, CFreeMonoid f) => forall (n1 :: Nat). (n ~ (1 + n1), KnownNat n1) => a -> Sized f n1 a -> Sized f n a infixr 5 Source #

Pattern synonym for cons-side uncons.

pattern (:>) :: forall (f :: Type -> Type) a (n :: Nat). (Dom f a, KnownNat n, CFreeMonoid f) => forall (n1 :: Nat). (n ~ (n1 + 1), KnownNat n1) => Sized f n1 a -> a -> Sized f n a infixl 5 Source #

Pattern synonym for snoc-side unsnoc.

Orphan instances

(Functor f, CFreeMonoid f, CZip f, KnownNat n, forall a. DomC f a) => Applicative (Sized f n) Source #

Applicative instance, generalizing ZipList.

Instance details

Methods

pure :: a -> Sized f n a #

(<*>) :: Sized f n (a -> b) -> Sized f n a -> Sized f n b #

liftA2 :: (a -> b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

(*>) :: Sized f n a -> Sized f n b -> Sized f n b #

(<*) :: Sized f n a -> Sized f n b -> Sized f n a #

CTraversable f => CTraversable (Sized f n) Source # 
Instance details

Methods

ctraverse :: (Dom (Sized f n) a, Dom (Sized f n) b, Applicative g) => (a -> g b) -> Sized f n a -> g (Sized f n b) #

(CZip f, CFreeMonoid f) => CZip (Sized f n) Source # 
Instance details

Methods

czipWith :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) c) => (a -> b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

czip :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a, b)) => Sized f n a -> Sized f n b -> Sized f n (a, b) #

(KnownNat n, CZip f, CFreeMonoid f) => CRepeat (Sized f n) Source # 
Instance details

Methods

crepeat :: Dom (Sized f n) a => a -> Sized f n a #

(CFreeMonoid f, CZip f) => CApplicative (Sized f n) Source # 
Instance details

Methods

pair :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a, b)) => Sized f n a -> Sized f n b -> Sized f n (a, b) #

(<.>) :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (a -> b)) => Sized f n (a -> b) -> Sized f n a -> Sized f n b #

(.>) :: (Dom (Sized f n) a, Dom (Sized f n) b) => Sized f n a -> Sized f n b -> Sized f n b #

(<.) :: (Dom (Sized f n) a, Dom (Sized f n) b) => Sized f n a -> Sized f n b -> Sized f n a #

(CFreeMonoid f, KnownNat n) => CPointed (Sized f n) Source # 
Instance details

Methods

cpure :: Dom (Sized f n) a => a -> Sized f n a #

(CZip f, CFreeMonoid f) => CSemialign (Sized f n) Source #

N.B. Since calign is just zipping for fixed n, we require more strong CZip constraint here.

Instance details

Methods

calignWith :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) c) => (These a b -> c) -> Sized f n a -> Sized f n b -> Sized f n c #

calign :: (Dom (Sized f n) a, Dom (Sized f n) b, Dom (Sized f n) (These a b)) => Sized f n a -> Sized f n b -> Sized f n (These a b) #