Safe Haskell | None |
---|---|
Language | Haskell2010 |
A variant of Data.Vec.Lazy with functions written using InlineInduction
.
The hypothesis is that these (goursive) functions could be fully unrolled,
if the Vec
size n
is known at compile time.
The module has the same API as Data.Vec.Lazy (sans withDict
and foldl'
).
Note: instance methods aren't changed, the Vec
type is the same.
- data Vec n a where
- empty :: Vec Z a
- singleton :: a -> Vec (S Z) a
- toPull :: forall n a. InlineInduction n => Vec n a -> Vec n a
- fromPull :: forall n a. InlineInduction n => Vec n a -> Vec n a
- _Pull :: InlineInduction n => Iso (Vec n a) (Vec n b) (Vec n a) (Vec n b)
- toList :: forall n a. InlineInduction n => Vec n a -> [a]
- fromList :: InlineInduction n => [a] -> Maybe (Vec n a)
- _Vec :: InlineInduction n => Prism' [a] (Vec n a)
- fromListPrefix :: InlineInduction n => [a] -> Maybe (Vec n a)
- reifyList :: [a] -> (forall n. InlineInduction n => Vec n a -> r) -> r
- (!) :: InlineInduction n => Vec n a -> Fin n -> a
- ix :: InlineInduction n => Fin n -> Lens' (Vec n a) a
- _Cons :: Iso (Vec (S n) a) (Vec (S n) b) (a, Vec n a) (b, Vec n b)
- _head :: Lens' (Vec (S n) a) a
- _tail :: Lens' (Vec (S n) a) (Vec n a)
- cons :: a -> Vec n a -> Vec (S n) a
- head :: Vec (S n) a -> a
- tail :: Vec (S n) a -> Vec n a
- (++) :: forall n m a. InlineInduction n => Vec n a -> Vec m a -> Vec (Plus n m) a
- split :: InlineInduction n => Vec (Plus n m) a -> (Vec n a, Vec m a)
- concatMap :: forall a b n m. (InlineInduction m, InlineInduction n) => (a -> Vec m b) -> Vec n a -> Vec (Mult n m) b
- concat :: (InlineInduction m, InlineInduction n) => Vec n (Vec m a) -> Vec (Mult n m) a
- chunks :: (InlineInduction n, InlineInduction m) => Vec (Mult n m) a -> Vec n (Vec m a)
- foldMap :: (Monoid m, InlineInduction n) => (a -> m) -> Vec n a -> m
- foldMap1 :: forall s a n. (Semigroup s, InlineInduction n) => (a -> s) -> Vec (S n) a -> s
- ifoldMap :: forall a n m. (Monoid m, InlineInduction n) => (Fin n -> a -> m) -> Vec n a -> m
- ifoldMap1 :: forall a n s. (Semigroup s, InlineInduction n) => (Fin (S n) -> a -> s) -> Vec (S n) a -> s
- foldr :: forall a b n. InlineInduction n => (a -> b -> b) -> b -> Vec n a -> b
- ifoldr :: forall a b n. InlineInduction n => (Fin n -> a -> b -> b) -> b -> Vec n a -> b
- length :: forall n a. InlineInduction n => Vec n a -> Int
- null :: Vec n a -> Bool
- sum :: (Num a, InlineInduction n) => Vec n a -> a
- product :: (Num a, InlineInduction n) => Vec n a -> a
- map :: forall a b n. InlineInduction n => (a -> b) -> Vec n a -> Vec n b
- imap :: InlineInduction n => (Fin n -> a -> b) -> Vec n a -> Vec n b
- traverse :: forall n f a b. (Applicative f, InlineInduction n) => (a -> f b) -> Vec n a -> f (Vec n b)
- traverse1 :: forall n f a b. (Apply f, InlineInduction n) => (a -> f b) -> Vec (S n) a -> f (Vec (S n) b)
- itraverse :: forall n f a b. (Applicative f, InlineInduction n) => (Fin n -> a -> f b) -> Vec n a -> f (Vec n b)
- itraverse_ :: forall n f a b. (Applicative f, InlineInduction n) => (Fin n -> a -> f b) -> Vec n a -> f ()
- zipWith :: forall a b c n. InlineInduction n => (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
- izipWith :: InlineInduction n => (Fin n -> a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
- bind :: InlineInduction n => Vec n a -> (a -> Vec n b) -> Vec n b
- join :: InlineInduction n => Vec n (Vec n a) -> Vec n a
- universe :: InlineInduction n => Vec n (Fin n)
- class Each s t a b => VecEach s t a b | s -> a, t -> b, s b -> t, t a -> s where
Documentation
Vector, i.e. length-indexed list.
SNatI n => Monad (Vec n) Source # | |
Functor (Vec n) Source # | |
SNatI n => Applicative (Vec n) Source # | |
Foldable (Vec n) Source # | |
Traversable (Vec n) Source # | |
SNatI n => Distributive (Vec n) Source # | |
SNatI n => Representable (Vec n) Source # | |
(~) Nat n (S m) => Traversable1 (Vec n) Source # | |
Apply (Vec n) Source # | |
Bind (Vec n) Source # | |
(~) Nat n (S m) => Foldable1 (Vec n) Source # | |
FunctorWithIndex (Fin n) (Vec n) Source # | |
FoldableWithIndex (Fin n) (Vec n) Source # | |
TraversableWithIndex (Fin n) (Vec n) Source # | |
Eq a => Eq (Vec n a) Source # | |
Ord a => Ord (Vec n a) Source # | |
Show a => Show (Vec n a) Source # | |
Semigroup a => Semigroup (Vec n a) Source # | |
(Monoid a, SNatI n) => Monoid (Vec n a) Source # | |
(~) Nat n Z => Boring (Vec n a) Source # | |
NFData a => NFData (Vec n a) Source # | |
Hashable a => Hashable (Vec n a) Source # | |
Ixed (Vec n a) Source # |
|
Each (Vec n a) (Vec n b) a b Source # | |
Field1 (Vec (S n) a) (Vec (S n) a) a a Source # | |
Field2 (Vec (S (S n)) a) (Vec (S (S n)) a) a a Source # | |
Field3 (Vec (S (S (S n))) a) (Vec (S (S (S n))) a) a a Source # | |
Field4 (Vec (S (S (S (S n)))) a) (Vec (S (S (S (S n)))) a) a a Source # | |
Field5 (Vec (S (S (S (S (S n))))) a) (Vec (S (S (S (S (S n))))) a) a a Source # | |
Field6 (Vec (S (S (S (S (S (S n)))))) a) (Vec (S (S (S (S (S (S n)))))) a) a a Source # | |
Field7 (Vec (S (S (S (S (S (S (S n))))))) a) (Vec (S (S (S (S (S (S (S n))))))) a) a a Source # | |
Field8 (Vec (S (S (S (S (S (S (S (S n)))))))) a) (Vec (S (S (S (S (S (S (S (S n)))))))) a) a a Source # | |
Field9 (Vec (S (S (S (S (S (S (S (S (S n))))))))) a) (Vec (S (S (S (S (S (S (S (S (S n))))))))) a) a a Source # | |
type Rep (Vec n) Source # | |
type Index (Vec n a) Source # | |
type IxValue (Vec n a) Source # | |
Construction
Conversions
toList :: forall n a. InlineInduction n => Vec n a -> [a] Source #
Convert Vec
to list.
>>>
toList $ 'f' ::: 'o' ::: 'o' ::: VNil
"foo"
_Vec :: InlineInduction n => Prism' [a] (Vec n a) Source #
Prism from list.
>>>
"foo" ^? _Vec :: Maybe (Vec N.Nat3 Char)
Just ('f' ::: 'o' ::: 'o' ::: VNil)
>>>
"foo" ^? _Vec :: Maybe (Vec N.Nat2 Char)
Nothing
>>>
_Vec # (True ::: False ::: VNil)
[True,False]
fromListPrefix :: InlineInduction n => [a] -> Maybe (Vec n a) Source #
Convert list [a]
to
.
Returns Vec
n aNothing
if input list is too short.
>>>
fromListPrefix "foo" :: Maybe (Vec N.Nat3 Char)
Just ('f' ::: 'o' ::: 'o' ::: VNil)
>>>
fromListPrefix "quux" :: Maybe (Vec N.Nat3 Char)
Just ('q' ::: 'u' ::: 'u' ::: VNil)
>>>
fromListPrefix "xy" :: Maybe (Vec N.Nat3 Char)
Nothing
reifyList :: [a] -> (forall n. InlineInduction n => Vec n a -> r) -> r Source #
Reify any list [a]
to
.Vec
n a
>>>
reifyList "foo" length
3
Indexing
(!) :: InlineInduction n => Vec n a -> Fin n -> a Source #
Indexing.
>>>
('a' ::: 'b' ::: 'c' ::: VNil) ! F.S F.Z
'b'
ix :: InlineInduction n => Fin n -> Lens' (Vec n a) a Source #
Index lens.
>>>
('a' ::: 'b' ::: 'c' ::: VNil) ^. ix (F.S F.Z)
'b'
>>>
('a' ::: 'b' ::: 'c' ::: VNil) & ix (F.S F.Z) .~ 'x'
'a' ::: 'x' ::: 'c' ::: VNil
_head :: Lens' (Vec (S n) a) a Source #
Head lens. Note: lens
_head
is a Traversal'
.
>>>
('a' ::: 'b' ::: 'c' ::: VNil) ^. _head
'a'
>>>
('a' ::: 'b' ::: 'c' ::: VNil) & _head .~ 'x'
'x' ::: 'b' ::: 'c' ::: VNil
Concatenation and splitting
(++) :: forall n m a. InlineInduction n => Vec n a -> Vec m a -> Vec (Plus n m) a infixr 5 Source #
Append two Vec
.
>>>
('a' ::: 'b' ::: VNil) ++ ('c' ::: 'd' ::: VNil)
'a' ::: 'b' ::: 'c' ::: 'd' ::: VNil
split :: InlineInduction n => Vec (Plus n m) a -> (Vec n a, Vec m a) Source #
Split vector into two parts. Inverse of ++
.
>>>
split ('a' ::: 'b' ::: 'c' ::: VNil) :: (Vec N.Nat1 Char, Vec N.Nat2 Char)
('a' ::: VNil,'b' ::: 'c' ::: VNil)
>>>
uncurry (++) (split ('a' ::: 'b' ::: 'c' ::: VNil) :: (Vec N.Nat1 Char, Vec N.Nat2 Char))
'a' ::: 'b' ::: 'c' ::: VNil
concatMap :: forall a b n m. (InlineInduction m, InlineInduction n) => (a -> Vec m b) -> Vec n a -> Vec (Mult n m) b Source #
concat :: (InlineInduction m, InlineInduction n) => Vec n (Vec m a) -> Vec (Mult n m) a Source #
chunks :: (InlineInduction n, InlineInduction m) => Vec (Mult n m) a -> Vec n (Vec m a) Source #
Inverse of concat
.
>>>
chunks <$> fromListPrefix [1..] :: Maybe (Vec N.Nat2 (Vec N.Nat3 Int))
Just ((1 ::: 2 ::: 3 ::: VNil) ::: (4 ::: 5 ::: 6 ::: VNil) ::: VNil)
>>>
let idVec x = x :: Vec N.Nat2 (Vec N.Nat3 Int)
>>>
concat . idVec . chunks <$> fromListPrefix [1..]
Just (1 ::: 2 ::: 3 ::: 4 ::: 5 ::: 6 ::: VNil)
Folds
foldMap1 :: forall s a n. (Semigroup s, InlineInduction n) => (a -> s) -> Vec (S n) a -> s Source #
See Foldable1
.
ifoldMap :: forall a n m. (Monoid m, InlineInduction n) => (Fin n -> a -> m) -> Vec n a -> m Source #
See FoldableWithIndex
.
ifoldMap1 :: forall a n s. (Semigroup s, InlineInduction n) => (Fin (S n) -> a -> s) -> Vec (S n) a -> s Source #
There is no type-class for this :(
foldr :: forall a b n. InlineInduction n => (a -> b -> b) -> b -> Vec n a -> b Source #
Right fold.
ifoldr :: forall a b n. InlineInduction n => (Fin n -> a -> b -> b) -> b -> Vec n a -> b Source #
Right fold with an index.
Special folds
Mapping
map :: forall a b n. InlineInduction n => (a -> b) -> Vec n a -> Vec n b Source #
>>>
map not $ True ::: False ::: VNil
False ::: True ::: VNil
imap :: InlineInduction n => (Fin n -> a -> b) -> Vec n a -> Vec n b Source #
>>>
imap (,) $ 'a' ::: 'b' ::: 'c' ::: VNil
(0,'a') ::: (1,'b') ::: (2,'c') ::: VNil
traverse :: forall n f a b. (Applicative f, InlineInduction n) => (a -> f b) -> Vec n a -> f (Vec n b) Source #
traverse1 :: forall n f a b. (Apply f, InlineInduction n) => (a -> f b) -> Vec (S n) a -> f (Vec (S n) b) Source #
itraverse :: forall n f a b. (Applicative f, InlineInduction n) => (Fin n -> a -> f b) -> Vec n a -> f (Vec n b) Source #
itraverse_ :: forall n f a b. (Applicative f, InlineInduction n) => (Fin n -> a -> f b) -> Vec n a -> f () Source #
Apply an action to every element of a Vec
and its index, ignoring the results.
Zipping
zipWith :: forall a b c n. InlineInduction n => (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c Source #
Zip two Vec
s with a function.
izipWith :: InlineInduction n => (Fin n -> a -> b -> c) -> Vec n a -> Vec n b -> Vec n c Source #
Zip two Vec
s. with a function that also takes the elements' indices.
Monadic
join :: InlineInduction n => Vec n (Vec n a) -> Vec n a Source #
Monadic join.
>>>
join $ ('a' ::: 'b' ::: VNil) ::: ('c' ::: 'd' ::: VNil) ::: VNil
'a' ::: 'd' ::: VNil
Universe
VecEach
class Each s t a b => VecEach s t a b | s -> a, t -> b, s b -> t, t a -> s where Source #
Write functions on Vec
. Use them with tuples.
VecEach
can be used to avoid "this function won't change the length of the
list" in DSLs.
bad: Instead of
[x, y] <- badDslMagic ["foo", "bar"] -- list!
good: we can write
(x, y) <- betterDslMagic ("foo", "bar") -- homogenic tuple!
where betterDslMagic
can be defined using traverseWithVec
.
mapWithVec :: (forall n. InlineInduction n => Vec n a -> Vec n b) -> s -> t Source #
traverseWithVec :: Applicative f => (forall n. InlineInduction n => Vec n a -> f (Vec n b)) -> s -> f t Source #