{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE Trustworthy #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.KnownNat.Solver #-}
{-# OPTIONS_GHC -fplugin GHC.TypeLits.Normalise #-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-redundant-constraints #-}
{-# OPTIONS_HADDOCK show-extensions #-}
module Clash.Sized.Vector
(
Vec(Nil,(:>),(:<),Cons)
, length, lengthS
, (!!), head, last, at
, indices, indicesI
, findIndex, elemIndex
, tail, init
, take, takeI, drop, dropI
, select, selectI
, splitAt, splitAtI
, unconcat, unconcatI
, singleton
, replicate, repeat
, iterate, iterateI, generate, generateI
, unfoldr, unfoldrI
, listToVecTH
, (++), (+>>), (<<+), concat, concatMap
, shiftInAt0, shiftInAtN , shiftOutFrom0, shiftOutFromN
, merge
, replace
, permute, backpermute, scatter, gather
, reverse, transpose, interleave
, rotateLeft, rotateRight, rotateLeftS, rotateRightS
, map, imap, smap
, zipWith, zipWith3, zipWith4, zipWith5, zipWith6, zipWith7
, zip, zip3, zip4, zip5, zip6, zip7
, izipWith
, unzip, unzip3, unzip4, unzip5, unzip6, unzip7
, foldr, foldl, foldr1, foldl1, fold
, ifoldr, ifoldl
, dfold, dtfold, vfold
, scanl, scanr, postscanl, postscanr
, mapAccumL, mapAccumR
, stencil1d, stencil2d
, windows1d, windows2d
, toList
, fromList
, unsafeFromList
, bv2v
, v2bv
, lazyV, VCons, asNatProxy, seqV, forceV, seqVX, forceVX
, traverse#
, concatBitVector#
, unconcatBitVector#
)
where
import Control.DeepSeq (NFData (..))
import qualified Control.Lens as Lens hiding (pattern (:>), pattern (:<))
import Data.Bits ((.|.), shiftL)
import Data.Constraint ((:-)(..), Dict (..))
import Data.Constraint.Nat (leZero)
import Data.Data
(Data (..), Constr, DataType, Fixity (..), Typeable, mkConstr, mkDataType)
import Data.Either (isLeft)
import Data.Default.Class (Default (..))
import qualified Data.Foldable as F
import Data.Kind (Type)
import Data.Proxy (Proxy (..))
import Data.Singletons (TyFun,Apply,type (@@))
import GHC.TypeLits (CmpNat, KnownNat, Nat, type (+), type (-), type (*),
type (^), type (<=), natVal)
import GHC.Base (Int(I#),Int#,isTrue#)
import GHC.Generics hiding (Fixity (..))
import qualified GHC.Magic
import GHC.Prim ((==#),(<#),(-#))
import Language.Haskell.TH (ExpQ)
import Language.Haskell.TH.Syntax (Lift(..))
#if MIN_VERSION_template_haskell(2,16,0)
import Language.Haskell.TH.Compat
#endif
import Prelude hiding ((++), (!!), concat, concatMap, drop,
foldl, foldl1, foldr, foldr1, head,
init, iterate, last, length, map,
repeat, replicate, reverse, scanl,
scanr, splitAt, tail, take, unzip,
unzip3, zip, zip3, zipWith, zipWith3)
import qualified Data.String.Interpolate as I
import qualified Prelude as P
import Test.QuickCheck
(Arbitrary(arbitrary, shrink), CoArbitrary(coarbitrary))
import Unsafe.Coerce (unsafeCoerce)
import Clash.Annotations.Primitive
(Primitive(InlinePrimitive), HDL(..), dontTranslate)
import Clash.Promoted.Nat
(SNat (..), SNatLE (..), UNat (..), compareSNat, leToPlus, pow2SNat,
snatProxy, snatToInteger, subSNat, withSNat, toUNat, natToInteger)
import Clash.Promoted.Nat.Literals (d1)
import Clash.Sized.Internal.BitVector (Bit, BitVector (..), split#)
import Clash.Sized.Index (Index)
import Clash.Class.BitPack (packXWith, BitPack (..))
import Clash.XException
(ShowX (..), NFDataX (..), showsX, seqX, isX)
infixr 5 `Cons`
data Vec :: Nat -> Type -> Type where
Nil :: Vec 0 a
Cons :: a -> Vec n a -> Vec (n + 1) a
instance KnownNat n => Generic (Vec n a) where
type Rep (Vec n a) =
D1 ('MetaData "Vec" "Clash.Data.Vector" "clash-prelude" 'False)
(C1 ('MetaCons "Nil" 'PrefixI 'False) U1 :+:
C1 ('MetaCons "Cons" 'PrefixI 'False)
(S1 ('MetaSel 'Nothing
'NoSourceUnpackedness
'NoSourceStrictness
'DecidedLazy)
(Rec0 a) :*:
S1 ('MetaSel 'Nothing
'NoSourceUnpackedness
'NoSourceStrictness
'DecidedLazy)
(Rec0 (Vec (n-1) a))))
from :: Vec n a -> Rep (Vec n a) x
from Vec n a
Nil = (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1)
(C1
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 (Vec (0 - 1) a))))
x
-> M1
D
('MetaData "Vec" "Clash.Data.Vector" "clash-prelude" 'False)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1
:+: C1
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 (Vec (0 - 1) a))))
x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (M1 C ('MetaCons "Nil" 'PrefixI 'False) U1 x
-> (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1)
(C1
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 (Vec (0 - 1) a))))
x
forall k (f :: k -> Type) (g :: k -> Type) (p :: k).
f p -> (:+:) f g p
L1 (U1 x -> M1 C ('MetaCons "Nil" 'PrefixI 'False) U1 x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 U1 x
forall k (p :: k). U1 p
U1))
from (Cons a
x Vec n a
xs) = (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1)
(M1
C
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a))))
x
-> M1
D
('MetaData "Vec" "Clash.Data.Vector" "clash-prelude" 'False)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1
:+: M1
C
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a))))
x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (M1
C
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a)))
x
-> (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1)
(M1
C
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a))))
x
forall k (f :: k -> Type) (g :: k -> Type) (p :: k).
g p -> (:+:) f g p
R1 ((:*:)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a))
(M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a)))
x
-> M1
C
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a)))
x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (K1 R a x
-> M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (a -> K1 R a x
forall k i c (p :: k). c -> K1 i c p
K1 a
x) M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
x
-> M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a))
x
-> (:*:)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a))
(M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a)))
x
forall k (f :: k -> Type) (g :: k -> Type) (p :: k).
f p -> g p -> (:*:) f g p
:*: K1 R (Vec n a) x
-> M1
S
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(K1 R (Vec n a))
x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (Vec n a -> K1 R (Vec n a) x
forall k i c (p :: k). c -> K1 i c p
K1 Vec n a
xs))))
to :: Rep (Vec n a) x -> Vec n a
to (M1 g) = case SNat n -> SNat 0 -> SNatLE n 0
forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b
compareSNat (KnownNat n => SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat @n) (KnownNat 0 => SNat 0
forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case (n <= 0) :- (n ~ 0)
forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub (n <= 0) => Dict (n ~ 0)
Dict -> Vec n a
forall a. Vec 0 a
Nil
SNatLE n 0
SNatGT -> case (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) U1)
(C1
('MetaCons "Cons" 'PrefixI 'False)
(S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 a)
:*: S1
('MetaSel
'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy)
(Rec0 (Vec (n - 1) a))))
x
g of
R1 (M1 (M1 (K1 p) :*: M1 (K1 q))) -> a -> Vec (n - 1) a -> Vec ((n - 1) + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
Cons a
p Vec (n - 1) a
q
instance (KnownNat n, Typeable a, Data a) => Data (Vec n a) where
gunfold :: (forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c (Vec n a)
gunfold forall b r. Data b => c (b -> r) -> c r
k forall r. r -> c r
z Constr
_ = case SNat n -> SNat 0 -> SNatLE n 0
forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b
compareSNat (KnownNat n => SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat @n) (KnownNat 0 => SNat 0
forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case (n <= 0) :- (n ~ 0)
forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub (n <= 0) => Dict (n ~ 0)
Dict -> Vec 0 a -> c (Vec 0 a)
forall r. r -> c r
z Vec 0 a
forall a. Vec 0 a
Nil
SNatLE n 0
SNatGT -> c (Vec (n - 1) a -> Vec n a) -> c (Vec n a)
forall b r. Data b => c (b -> r) -> c r
k (c (a -> Vec (n - 1) a -> Vec n a) -> c (Vec (n - 1) a -> Vec n a)
forall b r. Data b => c (b -> r) -> c r
k ((a -> Vec (n - 1) a -> Vec n a)
-> c (a -> Vec (n - 1) a -> Vec n a)
forall r. r -> c r
z @(a -> Vec (n-1) a -> Vec n a) a -> Vec (n - 1) a -> Vec n a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
Cons))
toConstr :: Vec n a -> Constr
toConstr Vec n a
Nil = Constr
cNil
toConstr (Cons a
_ Vec n a
_) = Constr
cCons
dataTypeOf :: Vec n a -> DataType
dataTypeOf Vec n a
_ = DataType
tVec
gfoldl
:: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g)
-> Vec n a
-> c (Vec n a)
gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> Vec n a -> c (Vec n a)
gfoldl forall d b. Data d => c (d -> b) -> d -> c b
f forall g. g -> c g
z Vec n a
xs = case SNat n -> SNat 0 -> SNatLE n 0
forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b
compareSNat (KnownNat n => SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat @n) (KnownNat 0 => SNat 0
forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case (n <= 0) :- (n ~ 0)
forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub (n <= 0) => Dict (n ~ 0)
Dict -> Vec 0 a -> c (Vec 0 a)
forall g. g -> c g
z Vec 0 a
forall a. Vec 0 a
Nil
SNatLE n 0
SNatGT -> let (a
y :> Vec (n - 1) a
ys) = Vec n a
Vec ((n - 1) + 1) a
xs
in ((a -> Vec (n - 1) a -> Vec n a)
-> c (a -> Vec (n - 1) a -> Vec n a)
forall g. g -> c g
z @(a -> Vec (n-1) a -> Vec n a) a -> Vec (n - 1) a -> Vec n a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
(:>) c (a -> Vec (n - 1) a -> Vec n a)
-> a -> c (Vec (n - 1) a -> Vec n a)
forall d b. Data d => c (d -> b) -> d -> c b
`f` a
y c (Vec (n - 1) a -> Vec n a) -> Vec (n - 1) a -> c (Vec n a)
forall d b. Data d => c (d -> b) -> d -> c b
`f` Vec (n - 1) a
ys)
tVec :: DataType
tVec :: DataType
tVec = String -> [Constr] -> DataType
mkDataType String
"Vec" [Constr
cNil, Constr
cCons]
cNil :: Constr
cNil :: Constr
cNil = DataType -> String -> [String] -> Fixity -> Constr
mkConstr DataType
tVec String
"Nil" [] Fixity
Prefix
cCons :: Constr
cCons :: Constr
cCons = DataType -> String -> [String] -> Fixity -> Constr
mkConstr DataType
tVec String
"Cons" [] Fixity
Prefix
instance NFData a => NFData (Vec n a) where
rnf :: Vec n a -> ()
rnf = (() -> a -> ()) -> () -> Vec n a -> ()
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl (\() -> a -> ()
forall a. NFData a => a -> ()
rnf) ()
pattern (:>) :: a -> Vec n a -> Vec (n + 1) a
pattern $b:> :: a -> Vec n a -> Vec (n + 1) a
$m:> :: forall r a (n :: Nat).
Vec (n + 1) a -> (a -> Vec n a -> r) -> (Void# -> r) -> r
(:>) x xs <- ((\ys -> (head ys,tail ys)) -> (x,xs))
where
(:>) a
x Vec n a
xs = a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
Cons a
x Vec n a
xs
infixr 5 :>
instance Show a => Show (Vec n a) where
showsPrec :: Int -> Vec n a -> ShowS
showsPrec Int
_ Vec n a
vs = \String
s -> Char
'<'Char -> ShowS
forall a. a -> [a] -> [a]
:Vec n a -> ShowS
forall (m :: Nat). Vec m a -> ShowS
punc Vec n a
vs (Char
'>'Char -> ShowS
forall a. a -> [a] -> [a]
:String
s)
where
punc :: Vec m a -> ShowS
punc :: Vec m a -> ShowS
punc Vec m a
Nil = ShowS
forall a. a -> a
id
punc (a
x `Cons` Vec n a
Nil) = a -> ShowS
forall a. Show a => a -> ShowS
shows a
x
punc (a
x `Cons` Vec n a
xs) = \String
s -> a -> ShowS
forall a. Show a => a -> ShowS
shows a
x (Char
','Char -> ShowS
forall a. a -> [a] -> [a]
:Vec n a -> ShowS
forall (m :: Nat). Vec m a -> ShowS
punc Vec n a
xs String
s)
instance ShowX a => ShowX (Vec n a) where
showsPrecX :: Int -> Vec n a -> ShowS
showsPrecX Int
_n Vec n a
vs = String -> ShowS
showString String
"<" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n a -> ShowS
forall (m :: Nat). Vec m a -> ShowS
punc Vec n a
vs
where
punc :: Vec m a -> ShowS
punc :: Vec m a -> ShowS
punc (Vec m a -> Either String (Vec m a)
forall a. a -> Either String a
isX -> Left String
_) = String -> ShowS
showString String
"X"
punc Vec m a
Nil = String -> ShowS
showString String
">"
punc (Cons a
x (Vec n a -> Either String (Vec n a)
forall a. a -> Either String a
isX -> Right Vec n a
Nil)) = a -> ShowS
forall a. ShowX a => a -> ShowS
showsX a
x ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char
'>'Char -> ShowS
forall a. a -> [a] -> [a]
:)
punc (Cons a
x Vec n a
xs) = a -> ShowS
forall a. ShowX a => a -> ShowS
showsX a
x ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"," ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n a -> ShowS
forall (m :: Nat). Vec m a -> ShowS
punc Vec n a
xs
instance (KnownNat n, Eq a) => Eq (Vec n a) where
== :: Vec n a -> Vec n a -> Bool
(==) Vec n a
Nil Vec n a
_ = Bool
True
(==) v1 :: Vec n a
v1@(Cons a
_ Vec n a
_) Vec n a
v2 = (Bool -> Bool -> Bool) -> Vec (n + 1) Bool -> Bool
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold Bool -> Bool -> Bool
(&&) ((a -> a -> Bool) -> Vec n a -> Vec n a -> Vec n Bool
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> a -> Bool
forall a. Eq a => a -> a -> Bool
(==) Vec n a
v1 Vec n a
v2)
instance (KnownNat n, Ord a) => Ord (Vec n a) where
compare :: Vec n a -> Vec n a -> Ordering
compare Vec n a
x Vec n a
y = (Ordering -> Ordering -> Ordering)
-> Ordering -> Vec n Ordering -> Ordering
forall a b (n :: Nat). (a -> b -> b) -> b -> Vec n a -> b
foldr Ordering -> Ordering -> Ordering
f Ordering
EQ (Vec n Ordering -> Ordering) -> Vec n Ordering -> Ordering
forall a b. (a -> b) -> a -> b
$ (a -> a -> Ordering) -> Vec n a -> Vec n a -> Vec n Ordering
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> a -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Vec n a
x Vec n a
y
where f :: Ordering -> Ordering -> Ordering
f Ordering
EQ Ordering
keepGoing = Ordering
keepGoing
f Ordering
done Ordering
_ = Ordering
done
instance (KnownNat n, Semigroup a) => Semigroup (Vec n a) where
<> :: Vec n a -> Vec n a -> Vec n a
(<>) = (a -> a -> a) -> Vec n a -> Vec n a -> Vec n a
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> a -> a
forall a. Semigroup a => a -> a -> a
(<>)
instance (KnownNat n, Monoid a) => Monoid (Vec n a) where
mempty :: Vec n a
mempty = a -> Vec n a
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat a
forall a. Monoid a => a
mempty
mappend :: Vec n a -> Vec n a -> Vec n a
mappend = Vec n a -> Vec n a -> Vec n a
forall a. Semigroup a => a -> a -> a
(<>)
instance KnownNat n => Applicative (Vec n) where
pure :: a -> Vec n a
pure = a -> Vec n a
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat
Vec n (a -> b)
fs <*> :: Vec n (a -> b) -> Vec n a -> Vec n b
<*> Vec n a
xs = ((a -> b) -> a -> b) -> Vec n (a -> b) -> Vec n a -> Vec n b
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (a -> b) -> a -> b
forall a b. (a -> b) -> a -> b
($) Vec n (a -> b)
fs Vec n a
xs
{-# RULES
"zipWith$map" forall f xs ys. zipWith (\g a -> g a) (map f xs) ys = zipWith f xs ys
#-}
instance (KnownNat n, 1 <= n) => F.Foldable (Vec n) where
fold :: Vec n m -> m
fold = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n m -> m)
-> Vec n m -> m)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n m -> m)
-> Vec n m
-> m
forall a b. (a -> b) -> a -> b
$ (m -> m -> m) -> Vec (m + 1) m -> m
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold m -> m -> m
forall a. Monoid a => a -> a -> a
mappend
foldMap :: (a -> m) -> Vec n a -> m
foldMap a -> m
f = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> m)
-> Vec n a -> m)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> m)
-> Vec n a
-> m
forall a b. (a -> b) -> a -> b
$ (m -> m -> m) -> Vec (m + 1) m -> m
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold m -> m -> m
forall a. Monoid a => a -> a -> a
mappend (Vec n m -> m) -> (Vec n a -> Vec n m) -> Vec n a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> m) -> Vec n a -> Vec n m
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> m
f
foldr :: (a -> b -> b) -> b -> Vec n a -> b
foldr = (a -> b -> b) -> b -> Vec n a -> b
forall a b (n :: Nat). (a -> b -> b) -> b -> Vec n a -> b
foldr
foldl :: (b -> a -> b) -> b -> Vec n a -> b
foldl = (b -> a -> b) -> b -> Vec n a -> b
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl
foldr1 :: (a -> a -> a) -> Vec n a -> a
foldr1 a -> a -> a
f = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall a (n :: Nat). (a -> a -> a) -> Vec (n + 1) a -> a
foldr1 a -> a -> a
f
foldl1 :: (a -> a -> a) -> Vec n a -> a
foldl1 a -> a -> a
f = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall a (n :: Nat). (a -> a -> a) -> Vec (n + 1) a -> a
foldl1 a -> a -> a
f
toList :: Vec n a -> [a]
toList = Vec n a -> [a]
forall (n :: Nat) a. Vec n a -> [a]
toList
null :: Vec n a -> Bool
null Vec n a
_ = Bool
False
length :: Vec n a -> Int
length = Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length
maximum :: Vec n a -> a
maximum = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold (\a
x a
y -> if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
>= a
y then a
x else a
y)
minimum :: Vec n a -> a
minimum = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold (\a
x a
y -> if a
x a -> a -> Bool
forall a. Ord a => a -> a -> Bool
<= a
y then a
x else a
y)
sum :: Vec n a -> a
sum = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold a -> a -> a
forall a. Num a => a -> a -> a
(+)
product :: Vec n a -> a
product = forall r. (1 <= n) => (forall (m :: Nat). (n ~ (1 + m)) => r) -> r
forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n ((forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a -> a)
-> (forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a)
-> Vec n a
-> a
forall a b. (a -> b) -> a -> b
$ (a -> a -> a) -> Vec (m + 1) a -> a
forall (n :: Nat) a. (a -> a -> a) -> Vec (n + 1) a -> a
fold a -> a -> a
forall a. Num a => a -> a -> a
(*)
instance Functor (Vec n) where
fmap :: (a -> b) -> Vec n a -> Vec n b
fmap = (a -> b) -> Vec n a -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map
instance (KnownNat n, 1 <= n) => Traversable (Vec n) where
traverse :: (a -> f b) -> Vec n a -> f (Vec n b)
traverse = (a -> f b) -> Vec n a -> f (Vec n b)
forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse#
{-# NOINLINE traverse# #-}
traverse# :: forall a f b n . Applicative f => (a -> f b) -> Vec n a -> f (Vec n b)
traverse# :: (a -> f b) -> Vec n a -> f (Vec n b)
traverse# a -> f b
_ Vec n a
Nil = Vec 0 b -> f (Vec 0 b)
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure Vec 0 b
forall a. Vec 0 a
Nil
traverse# a -> f b
f (a
x `Cons` Vec n a
xs) = b -> Vec n b -> Vec n b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
Cons (b -> Vec n b -> Vec n b) -> f b -> f (Vec n b -> Vec n b)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> f b
f a
x f (Vec n b -> Vec n b) -> f (Vec n b) -> f (Vec n b)
forall (f :: Type -> Type) a b.
Applicative f =>
f (a -> b) -> f a -> f b
<*> (a -> f b) -> Vec n a -> f (Vec n b)
forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse# a -> f b
f Vec n a
xs
instance (Default a, KnownNat n) => Default (Vec n a) where
def :: Vec n a
def = a -> Vec n a
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat a
forall a. Default a => a
def
instance (NFDataX a, KnownNat n) => NFDataX (Vec n a) where
deepErrorX :: String -> Vec n a
deepErrorX String
x = a -> Vec n a
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat (String -> a
forall a. (NFDataX a, HasCallStack) => String -> a
deepErrorX String
x)
rnfX :: Vec n a -> ()
rnfX Vec n a
v =
() -> () -> ()
forall a b. a -> b -> b
seqX ((() -> a -> ()) -> () -> Vec n a -> ()
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl (\() -> a -> ()
forall a. NFDataX a => a -> ()
rnfX) () Vec n a
v) ()
hasUndefined :: Vec n a -> Bool
hasUndefined Vec n a
v =
if Either String (Vec n a) -> Bool
forall a b. Either a b -> Bool
isLeft (Vec n a -> Either String (Vec n a)
forall a. a -> Either String a
isX Vec n a
v) then Bool
True else Vec n a -> Bool
forall (m :: Nat) b. (NFDataX b, KnownNat m) => Vec m b -> Bool
go Vec n a
v
where
go :: forall m b . (NFDataX b, KnownNat m) => Vec m b -> Bool
go :: Vec m b -> Bool
go Vec m b
Nil = Bool
False
go (b
x `Cons` Vec n b
xs) = b -> Bool
forall a. NFDataX a => a -> Bool
hasUndefined b
x Bool -> Bool -> Bool
|| Vec n b -> Bool
forall a. NFDataX a => a -> Bool
hasUndefined Vec n b
xs
ensureSpine :: Vec n a -> Vec n a
ensureSpine = (a -> a) -> Vec n a -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> a
forall a. NFDataX a => a -> a
ensureSpine (Vec n a -> Vec n a) -> (Vec n a -> Vec n a) -> Vec n a -> Vec n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n a -> Vec n a
forall (n :: Nat) a. KnownNat n => Vec n a -> Vec n a
lazyV
{-# INLINE singleton #-}
singleton :: a -> Vec 1 a
singleton :: a -> Vec 1 a
singleton = (a -> Vec 0 a -> Vec (0 + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec 0 a
forall a. Vec 0 a
Nil)
{-# NOINLINE head #-}
head :: Vec (n + 1) a -> a
head :: Vec (n + 1) a -> a
head (a
x `Cons` Vec n a
_) = a
x
{-# NOINLINE tail #-}
tail :: Vec (n + 1) a -> Vec n a
tail :: Vec (n + 1) a -> Vec n a
tail (a
_ `Cons` Vec n a
xs) = Vec n a
Vec n a
xs
{-# NOINLINE last #-}
last :: Vec (n + 1) a -> a
last :: Vec (n + 1) a -> a
last (a
x `Cons` Vec n a
Nil) = a
x
last (a
_ `Cons` a
y `Cons` Vec n a
ys) = Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last (a
y a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n a
ys)
{-# NOINLINE init #-}
init :: Vec (n + 1) a -> Vec n a
init :: Vec (n + 1) a -> Vec n a
init (a
_ `Cons` Vec n a
Nil) = Vec n a
forall a. Vec 0 a
Nil
init (a
x `Cons` a
y `Cons` Vec n a
ys) = a
x a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init (a
y a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n a
ys)
{-# INLINE shiftInAt0 #-}
shiftInAt0 :: KnownNat n
=> Vec n a
-> Vec m a
-> (Vec n a, Vec m a)
shiftInAt0 :: Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAt0 Vec n a
xs Vec m a
ys = Vec (n + m) a -> (Vec n a, Vec m a)
forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
Vec (m + n) a -> (Vec m a, Vec n a)
splitAtI Vec (n + m) a
Vec (m + n) a
zs
where
zs :: Vec (m + n) a
zs = Vec m a
ys Vec m a -> Vec n a -> Vec (m + n) a
forall (n :: Nat) a (m :: Nat). Vec n a -> Vec m a -> Vec (n + m) a
++ Vec n a
xs
{-# INLINE shiftInAtN #-}
shiftInAtN :: KnownNat m
=> Vec n a
-> Vec m a
-> (Vec n a,Vec m a)
shiftInAtN :: Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAtN Vec n a
xs Vec m a
ys = (Vec n a
zsR, Vec m a
zsL)
where
zs :: Vec (n + m) a
zs = Vec n a
xs Vec n a -> Vec m a -> Vec (n + m) a
forall (n :: Nat) a (m :: Nat). Vec n a -> Vec m a -> Vec (n + m) a
++ Vec m a
ys
(Vec m a
zsL,Vec n a
zsR) = Vec (m + n) a -> (Vec m a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
Vec (m + n) a -> (Vec m a, Vec n a)
splitAtI Vec (m + n) a
Vec (n + m) a
zs
infixl 5 :<
pattern (:<) :: Vec n a -> a -> Vec (n+1) a
pattern $b:< :: Vec n a -> a -> Vec (n + 1) a
$m:< :: forall r (n :: Nat) a.
Vec (n + 1) a -> (Vec n a -> a -> r) -> (Void# -> r) -> r
(:<) xs x <- ((\ys -> (init ys,last ys)) -> (xs,x))
where
(:<) Vec n a
xs a
x = Vec n a
xs Vec n a -> Vec 1 a -> Vec (n + 1) a
forall (n :: Nat) a (m :: Nat). Vec n a -> Vec m a -> Vec (n + m) a
++ a -> Vec 1 a
forall a. a -> Vec 1 a
singleton a
x
infixr 4 +>>
(+>>) :: KnownNat n => a -> Vec n a -> Vec n a
a
s +>> :: a -> Vec n a -> Vec n a
+>> Vec n a
xs = (Vec n a, Vec 1 a) -> Vec n a
forall a b. (a, b) -> a
fst (Vec n a -> Vec 1 a -> (Vec n a, Vec 1 a)
forall (n :: Nat) a (m :: Nat).
KnownNat n =>
Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAt0 Vec n a
xs (a -> Vec 1 a
forall a. a -> Vec 1 a
singleton a
s))
{-# INLINE (+>>) #-}
infixl 4 <<+
(<<+) :: Vec n a -> a -> Vec n a
Vec n a
xs <<+ :: Vec n a -> a -> Vec n a
<<+ a
s = (Vec n a, Vec 1 a) -> Vec n a
forall a b. (a, b) -> a
fst (Vec n a -> Vec 1 a -> (Vec n a, Vec 1 a)
forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAtN Vec n a
xs (a -> Vec 1 a
forall a. a -> Vec 1 a
singleton a
s))
{-# INLINE (<<+) #-}
shiftOutFrom0 :: (Default a, KnownNat m)
=> SNat m
-> Vec (m + n) a
-> (Vec (m + n) a, Vec m a)
shiftOutFrom0 :: SNat m -> Vec (m + n) a -> (Vec (m + n) a, Vec m a)
shiftOutFrom0 SNat m
m Vec (m + n) a
xs = Vec (m + n) a -> Vec m a -> (Vec (m + n) a, Vec m a)
forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAtN Vec (m + n) a
xs (SNat m -> a -> Vec m a
forall (n :: Nat) a. SNat n -> a -> Vec n a
replicate SNat m
m a
forall a. Default a => a
def)
{-# INLINE shiftOutFrom0 #-}
shiftOutFromN :: (Default a, KnownNat n)
=> SNat m
-> Vec (m + n) a
-> (Vec (m + n) a, Vec m a)
shiftOutFromN :: SNat m -> Vec (m + n) a -> (Vec (m + n) a, Vec m a)
shiftOutFromN m :: SNat m
m@SNat m
SNat Vec (m + n) a
xs = Vec (m + n) a -> Vec m a -> (Vec (m + n) a, Vec m a)
forall (n :: Nat) a (m :: Nat).
KnownNat n =>
Vec n a -> Vec m a -> (Vec n a, Vec m a)
shiftInAt0 Vec (m + n) a
xs (SNat m -> a -> Vec m a
forall (n :: Nat) a. SNat n -> a -> Vec n a
replicate SNat m
m a
forall a. Default a => a
def)
{-# INLINE shiftOutFromN #-}
infixr 5 ++
(++) :: Vec n a -> Vec m a -> Vec (n + m) a
Vec n a
Nil ++ :: Vec n a -> Vec m a -> Vec (n + m) a
++ Vec m a
ys = Vec m a
Vec (n + m) a
ys
(a
x `Cons` Vec n a
xs) ++ Vec m a
ys = a
x a -> Vec (n + m) a -> Vec ((n + m) + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n a
xs Vec n a -> Vec m a -> Vec (n + m) a
forall (n :: Nat) a (m :: Nat). Vec n a -> Vec m a -> Vec (n + m) a
++ Vec m a
ys
{-# NOINLINE (++) #-}
splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt SNat m
n Vec (m + n) a
xs = UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU (SNat m -> UNat m
forall (n :: Nat). SNat n -> UNat n
toUNat SNat m
n) Vec (m + n) a
xs
{-# NOINLINE splitAt #-}
splitAtU :: UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU :: UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU UNat m
UZero Vec (m + n) a
ys = (Vec m a
forall a. Vec 0 a
Nil,Vec n a
Vec (m + n) a
ys)
splitAtU (USucc UNat n
s) (a
y `Cons` Vec n a
ys) = let (Vec n a
as,Vec n a
bs) = UNat n -> Vec (n + n) a -> (Vec n a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU UNat n
s Vec n a
Vec (n + n) a
ys
in (a
y a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n a
as, Vec n a
bs)
splitAtI :: KnownNat m => Vec (m + n) a -> (Vec m a, Vec n a)
splitAtI :: Vec (m + n) a -> (Vec m a, Vec n a)
splitAtI = (SNat m -> Vec (m + n) a -> (Vec m a, Vec n a))
-> Vec (m + n) a -> (Vec m a, Vec n a)
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt
{-# INLINE splitAtI #-}
concat :: Vec n (Vec m a) -> Vec (n * m) a
concat :: Vec n (Vec m a) -> Vec (n * m) a
concat Vec n (Vec m a)
Nil = Vec (n * m) a
forall a. Vec 0 a
Nil
concat (Vec m a
x `Cons` Vec n (Vec m a)
xs) = Vec m a
x Vec m a -> Vec (n * m) a -> Vec (m + (n * m)) a
forall (n :: Nat) a (m :: Nat). Vec n a -> Vec m a -> Vec (n + m) a
++ Vec n (Vec m a) -> Vec (n * m) a
forall (n :: Nat) (m :: Nat) a. Vec n (Vec m a) -> Vec (n * m) a
concat Vec n (Vec m a)
xs
{-# NOINLINE concat #-}
concatMap :: (a -> Vec m b) -> Vec n a -> Vec (n * m) b
concatMap :: (a -> Vec m b) -> Vec n a -> Vec (n * m) b
concatMap a -> Vec m b
f Vec n a
xs = Vec n (Vec m b) -> Vec (n * m) b
forall (n :: Nat) (m :: Nat) a. Vec n (Vec m a) -> Vec (n * m) a
concat ((a -> Vec m b) -> Vec n a -> Vec n (Vec m b)
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> Vec m b
f Vec n a
xs)
{-# INLINE concatMap #-}
unconcat :: KnownNat n => SNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcat :: SNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcat SNat m
n Vec (n * m) a
xs = UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
forall (n :: Nat) (m :: Nat) a.
UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcatU ((SNat n -> UNat n) -> UNat n
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat n -> UNat n
forall (n :: Nat). SNat n -> UNat n
toUNat) (SNat m -> UNat m
forall (n :: Nat). SNat n -> UNat n
toUNat SNat m
n) Vec (n * m) a
xs
{-# NOINLINE unconcat #-}
unconcatU :: UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcatU :: UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcatU UNat n
UZero UNat m
_ Vec (n * m) a
_ = Vec n (Vec m a)
forall a. Vec 0 a
Nil
unconcatU (USucc UNat n
n') UNat m
m Vec (n * m) a
ys = let (Vec m a
as,Vec (n * m) a
bs) = UNat m -> Vec (m + (n * m)) a -> (Vec m a, Vec (n * m) a)
forall (m :: Nat) (n :: Nat) a.
UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU UNat m
m Vec (m + (n * m)) a
Vec (n * m) a
ys
in Vec m a
as Vec m a -> Vec n (Vec m a) -> Vec (n + 1) (Vec m a)
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
forall (n :: Nat) (m :: Nat) a.
UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcatU UNat n
n' UNat m
m Vec (n * m) a
bs
unconcatI :: (KnownNat n, KnownNat m) => Vec (n * m) a -> Vec n (Vec m a)
unconcatI :: Vec (n * m) a -> Vec n (Vec m a)
unconcatI = (SNat m -> Vec (n * m) a -> Vec n (Vec m a))
-> Vec (n * m) a -> Vec n (Vec m a)
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat m -> Vec (n * m) a -> Vec n (Vec m a)
forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
SNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcat
{-# INLINE unconcatI #-}
merge :: KnownNat n => Vec n a -> Vec n a -> Vec (2 * n) a
merge :: Vec n a -> Vec n a -> Vec (2 * n) a
merge Vec n a
x Vec n a
y = Vec n (Vec 2 a) -> Vec (n * 2) a
forall (n :: Nat) (m :: Nat) a. Vec n (Vec m a) -> Vec (n * m) a
concat (Vec 2 (Vec n a) -> Vec n (Vec 2 a)
forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
Vec m (Vec n a) -> Vec n (Vec m a)
transpose (Vec n a
x Vec n a -> Vec 1 (Vec n a) -> Vec (1 + 1) (Vec n a)
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> Vec n a -> Vec 1 (Vec n a)
forall a. a -> Vec 1 a
singleton Vec n a
y))
{-# INLINE merge #-}
reverse :: Vec n a -> Vec n a
reverse :: Vec n a -> Vec n a
reverse Vec n a
Nil = Vec n a
forall a. Vec 0 a
Nil
reverse (a
x `Cons` Vec n a
xs) = Vec n a -> Vec n a
forall (n :: Nat) a. Vec n a -> Vec n a
reverse Vec n a
xs Vec n a -> a -> Vec (n + 1) a
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< a
x
{-# NOINLINE reverse #-}
map :: (a -> b) -> Vec n a -> Vec n b
map :: (a -> b) -> Vec n a -> Vec n b
map a -> b
_ Vec n a
Nil = Vec n b
forall a. Vec 0 a
Nil
map a -> b
f (a
x `Cons` Vec n a
xs) = a -> b
f a
x b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` (a -> b) -> Vec n a -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> b
f Vec n a
xs
{-# NOINLINE map #-}
imap :: forall n a b . KnownNat n => (Index n -> a -> b) -> Vec n a -> Vec n b
imap :: (Index n -> a -> b) -> Vec n a -> Vec n b
imap Index n -> a -> b
f = Index n -> Vec n a -> Vec n b
forall (m :: Nat). Index n -> Vec m a -> Vec m b
go Index n
0
where
go :: Index n -> Vec m a -> Vec m b
go :: Index n -> Vec m a -> Vec m b
go Index n
_ Vec m a
Nil = Vec m b
forall a. Vec 0 a
Nil
go Index n
n (a
x `Cons` Vec n a
xs) = Index n -> a -> b
f Index n
n a
x b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Index n -> Vec n a -> Vec n b
forall (m :: Nat). Index n -> Vec m a -> Vec m b
go (Index n
nIndex n -> Index n -> Index n
forall a. Num a => a -> a -> a
+Index n
1) Vec n a
xs
{-# NOINLINE imap #-}
izipWith :: KnownNat n => (Index n -> a -> b -> c) -> Vec n a -> Vec n b
-> Vec n c
izipWith :: (Index n -> a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
izipWith Index n -> a -> b -> c
f Vec n a
xs Vec n b
ys = (Index n -> (a, b) -> c) -> Vec n (a, b) -> Vec n c
forall (n :: Nat) a b.
KnownNat n =>
(Index n -> a -> b) -> Vec n a -> Vec n b
imap (\Index n
i -> (a -> b -> c) -> (a, b) -> c
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry (Index n -> a -> b -> c
f Index n
i)) (Vec n a -> Vec n b -> Vec n (a, b)
forall (n :: Nat) a b. Vec n a -> Vec n b -> Vec n (a, b)
zip Vec n a
xs Vec n b
ys)
{-# INLINE izipWith #-}
ifoldr :: KnownNat n => (Index n -> a -> b -> b) -> b -> Vec n a -> b
ifoldr :: (Index n -> a -> b -> b) -> b -> Vec n a -> b
ifoldr Index n -> a -> b -> b
f b
z Vec n a
xs = Vec (n + 1) b -> b
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (n + 1) b
ws
where
ws :: Vec (n + 1) b
ws = (Index n -> a -> b -> b) -> Vec n a -> Vec n b -> Vec n b
forall (n :: Nat) a b c.
KnownNat n =>
(Index n -> a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
izipWith Index n -> a -> b -> b
f Vec n a
xs ((Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) b
ws)) Vec n b -> b -> Vec (n + 1) b
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< b
z
{-# INLINE ifoldr #-}
ifoldl :: KnownNat n => (a -> Index n -> b -> a) -> a -> Vec n b -> a
ifoldl :: (a -> Index n -> b -> a) -> a -> Vec n b -> a
ifoldl a -> Index n -> b -> a
f a
z Vec n b
xs = Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec (n + 1) a
ws
where
ws :: Vec (n + 1) a
ws = a
z a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` (Index n -> b -> a -> a) -> Vec n b -> Vec n a -> Vec n a
forall (n :: Nat) a b c.
KnownNat n =>
(Index n -> a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
izipWith (\Index n
i b
b a
a -> a -> Index n -> b -> a
f a
a Index n
i b
b) Vec n b
xs (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) a
ws)
{-# INLINE ifoldl #-}
indices :: KnownNat n => SNat n -> Vec n (Index n)
indices :: SNat n -> Vec n (Index n)
indices SNat n
_ = Vec n (Index n)
forall (n :: Nat). KnownNat n => Vec n (Index n)
indicesI
{-# INLINE indices #-}
indicesI :: KnownNat n => Vec n (Index n)
indicesI :: Vec n (Index n)
indicesI = (Index n -> () -> Index n) -> Vec n () -> Vec n (Index n)
forall (n :: Nat) a b.
KnownNat n =>
(Index n -> a -> b) -> Vec n a -> Vec n b
imap Index n -> () -> Index n
forall a b. a -> b -> a
const (() -> Vec n ()
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat ())
{-# INLINE indicesI #-}
findIndex :: KnownNat n => (a -> Bool) -> Vec n a -> Maybe (Index n)
findIndex :: (a -> Bool) -> Vec n a -> Maybe (Index n)
findIndex a -> Bool
f = (Index n -> a -> Maybe (Index n) -> Maybe (Index n))
-> Maybe (Index n) -> Vec n a -> Maybe (Index n)
forall (n :: Nat) a b.
KnownNat n =>
(Index n -> a -> b -> b) -> b -> Vec n a -> b
ifoldr (\Index n
i a
a Maybe (Index n)
b -> if a -> Bool
f a
a then Index n -> Maybe (Index n)
forall a. a -> Maybe a
Just Index n
i else Maybe (Index n)
b) Maybe (Index n)
forall a. Maybe a
Nothing
{-# INLINE findIndex #-}
elemIndex :: (KnownNat n, Eq a) => a -> Vec n a -> Maybe (Index n)
elemIndex :: a -> Vec n a -> Maybe (Index n)
elemIndex a
x = (a -> Bool) -> Vec n a -> Maybe (Index n)
forall (n :: Nat) a.
KnownNat n =>
(a -> Bool) -> Vec n a -> Maybe (Index n)
findIndex (a
x a -> a -> Bool
forall a. Eq a => a -> a -> Bool
==)
{-# INLINE elemIndex #-}
zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> b -> c
_ Vec n a
Nil Vec n b
_ = Vec n c
forall a. Vec 0 a
Nil
zipWith a -> b -> c
f (a
x `Cons` Vec n a
xs) Vec n b
ys = a -> b -> c
f a
x (Vec (n + 1) b -> b
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec n b
Vec (n + 1) b
ys) c -> Vec n c -> Vec (n + 1) c
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> b -> c
f Vec n a
xs (Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec n b
Vec (n + 1) b
ys)
{-# NOINLINE zipWith #-}
zipWith3 :: (a -> b -> c -> d) -> Vec n a -> Vec n b -> Vec n c -> Vec n d
zipWith3 :: (a -> b -> c -> d) -> Vec n a -> Vec n b -> Vec n c -> Vec n d
zipWith3 a -> b -> c -> d
f Vec n a
us Vec n b
vs Vec n c
ws = (a -> (b, c) -> d) -> Vec n a -> Vec n (b, c) -> Vec n d
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
a (b
b,c
c) -> a -> b -> c -> d
f a
a b
b c
c) Vec n a
us (Vec n b -> Vec n c -> Vec n (b, c)
forall (n :: Nat) a b. Vec n a -> Vec n b -> Vec n (a, b)
zip Vec n b
vs Vec n c
ws)
{-# INLINE zipWith3 #-}
zipWith4
:: (a -> b -> c -> d -> e)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
zipWith4 :: (a -> b -> c -> d -> e)
-> Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n e
zipWith4 a -> b -> c -> d -> e
f Vec n a
us Vec n b
vs Vec n c
ws Vec n d
xs =
(a -> (b, c, d) -> e) -> Vec n a -> Vec n (b, c, d) -> Vec n e
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
a (b
b,c
c,d
d) -> a -> b -> c -> d -> e
f a
a b
b c
c d
d) Vec n a
us (Vec n b -> Vec n c -> Vec n d -> Vec n (b, c, d)
forall (n :: Nat) a b c.
Vec n a -> Vec n b -> Vec n c -> Vec n (a, b, c)
zip3 Vec n b
vs Vec n c
ws Vec n d
xs)
{-# INLINE zipWith4 #-}
zipWith5
:: (a -> b -> c -> d -> e -> f)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
zipWith5 :: (a -> b -> c -> d -> e -> f)
-> Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n e -> Vec n f
zipWith5 a -> b -> c -> d -> e -> f
f Vec n a
us Vec n b
vs Vec n c
ws Vec n d
xs Vec n e
ys =
(a -> (b, c, d, e) -> f)
-> Vec n a -> Vec n (b, c, d, e) -> Vec n f
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
a (b
b,c
c,d
d,e
e) -> a -> b -> c -> d -> e -> f
f a
a b
b c
c d
d e
e) Vec n a
us (Vec n b -> Vec n c -> Vec n d -> Vec n e -> Vec n (b, c, d, e)
forall (n :: Nat) a b c d.
Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n (a, b, c, d)
zip4 Vec n b
vs Vec n c
ws Vec n d
xs Vec n e
ys)
{-# INLINE zipWith5 #-}
zipWith6
:: (a -> b -> c -> d -> e -> f -> g)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
zipWith6 :: (a -> b -> c -> d -> e -> f -> g)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
zipWith6 a -> b -> c -> d -> e -> f -> g
f Vec n a
us Vec n b
vs Vec n c
ws Vec n d
xs Vec n e
ys Vec n f
zs =
(a -> (b, c, d, e, f) -> g)
-> Vec n a -> Vec n (b, c, d, e, f) -> Vec n g
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
u (b
v,c
w,d
x,e
y,f
z) -> a -> b -> c -> d -> e -> f -> g
f a
u b
v c
w d
x e
y f
z) Vec n a
us (Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n (b, c, d, e, f)
forall (n :: Nat) a b c d e.
Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n (a, b, c, d, e)
zip5 Vec n b
vs Vec n c
ws Vec n d
xs Vec n e
ys Vec n f
zs)
{-# INLINE zipWith6 #-}
zipWith7
:: (a -> b -> c -> d -> e -> f -> g -> h)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n h
zipWith7 :: (a -> b -> c -> d -> e -> f -> g -> h)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n h
zipWith7 a -> b -> c -> d -> e -> f -> g -> h
f Vec n a
ts Vec n b
us Vec n c
vs Vec n d
ws Vec n e
xs Vec n f
ys Vec n g
zs =
(a -> (b, c, d, e, f, g) -> h)
-> Vec n a -> Vec n (b, c, d, e, f, g) -> Vec n h
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
t (b
u,c
v,d
w,e
x,f
y,g
z) -> a -> b -> c -> d -> e -> f -> g -> h
f a
t b
u c
v d
w e
x f
y g
z) Vec n a
ts (Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n (b, c, d, e, f, g)
forall (n :: Nat) a b c d e f.
Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n (a, b, c, d, e, f)
zip6 Vec n b
us Vec n c
vs Vec n d
ws Vec n e
xs Vec n f
ys Vec n g
zs)
{-# INLINE zipWith7 #-}
foldr :: (a -> b -> b) -> b -> Vec n a -> b
foldr :: (a -> b -> b) -> b -> Vec n a -> b
foldr a -> b -> b
_ b
z Vec n a
Nil = b
z
foldr a -> b -> b
f b
z (a
x `Cons` Vec n a
xs) = a -> b -> b
f a
x ((a -> b -> b) -> b -> Vec n a -> b
forall a b (n :: Nat). (a -> b -> b) -> b -> Vec n a -> b
foldr a -> b -> b
f b
z Vec n a
xs)
{-# NOINLINE foldr #-}
foldl :: (b -> a -> b) -> b -> Vec n a -> b
foldl :: (b -> a -> b) -> b -> Vec n a -> b
foldl b -> a -> b
f b
z Vec n a
xs = Vec (n + 1) b -> b
forall (n :: Nat) a. Vec (n + 1) a -> a
last ((b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
forall b a (n :: Nat).
(b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
scanl b -> a -> b
f b
z Vec n a
xs)
{-# INLINE foldl #-}
foldr1 :: (a -> a -> a) -> Vec (n + 1) a -> a
foldr1 :: (a -> a -> a) -> Vec (n + 1) a -> a
foldr1 a -> a -> a
f Vec (n + 1) a
xs = (a -> a -> a) -> a -> Vec n a -> a
forall a b (n :: Nat). (a -> b -> b) -> b -> Vec n a -> b
foldr a -> a -> a
f (Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec (n + 1) a
xs) (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) a
xs)
{-# INLINE foldr1 #-}
foldl1 :: (a -> a -> a) -> Vec (n + 1) a -> a
foldl1 :: (a -> a -> a) -> Vec (n + 1) a -> a
foldl1 a -> a -> a
f Vec (n + 1) a
xs = (a -> a -> a) -> a -> Vec n a -> a
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl a -> a -> a
f (Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (n + 1) a
xs) (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) a
xs)
{-# INLINE foldl1 #-}
fold :: forall n a . (a -> a -> a) -> Vec (n + 1) a -> a
fold :: (a -> a -> a) -> Vec (n + 1) a -> a
fold a -> a -> a
f Vec (n + 1) a
vs = [a] -> a
fold' (Vec (n + 1) a -> [a]
forall (n :: Nat) a. Vec n a -> [a]
toList Vec (n + 1) a
vs)
where
fold' :: [a] -> a
fold' [a
x] = a
x
fold' [a]
xs = [a] -> a
fold' [a]
ys a -> a -> a
`f` [a] -> a
fold' [a]
zs
where
([a]
ys,[a]
zs) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
P.splitAt ([a] -> Int
forall (t :: Type -> Type) a. Foldable t => t a -> Int
P.length [a]
xs Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div` Int
2) [a]
xs
{-# NOINLINE fold #-}
{-# ANN fold (InlinePrimitive [VHDL,Verilog,SystemVerilog] "[ { \"BlackBoxHaskell\" : { \"name\" : \"Clash.Sized.Vector.fold\", \"templateFunction\" : \"Clash.Primitives.Sized.Vector.foldBBF\"}} ]") #-}
scanl :: (b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
scanl :: (b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
scanl b -> a -> b
f b
z Vec n a
xs = Vec (n + 1) b
ws
where
ws :: Vec (n + 1) b
ws = b
z b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` (a -> b -> b) -> Vec n a -> Vec n b -> Vec n b
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith ((b -> a -> b) -> a -> b -> b
forall a b c. (a -> b -> c) -> b -> a -> c
flip b -> a -> b
f) Vec n a
xs (Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) b
ws)
{-# INLINE scanl #-}
postscanl :: (b -> a -> b) -> b -> Vec n a -> Vec n b
postscanl :: (b -> a -> b) -> b -> Vec n a -> Vec n b
postscanl b -> a -> b
f b
z Vec n a
xs = Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail ((b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
forall b a (n :: Nat).
(b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
scanl b -> a -> b
f b
z Vec n a
xs)
{-# INLINE postscanl #-}
scanr :: (a -> b -> b) -> b -> Vec n a -> Vec (n + 1) b
scanr :: (a -> b -> b) -> b -> Vec n a -> Vec (n + 1) b
scanr a -> b -> b
f b
z Vec n a
xs = Vec (n + 1) b
ws
where
ws :: Vec (n + 1) b
ws = (a -> b -> b) -> Vec n a -> Vec n b -> Vec n b
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith a -> b -> b
f Vec n a
xs ((Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) b
ws)) Vec n b -> b -> Vec (n + 1) b
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< b
z
{-# INLINE scanr #-}
postscanr :: (a -> b -> b) -> b -> Vec n a -> Vec n b
postscanr :: (a -> b -> b) -> b -> Vec n a -> Vec n b
postscanr a -> b -> b
f b
z Vec n a
xs = Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init ((a -> b -> b) -> b -> Vec n a -> Vec (n + 1) b
forall a b (n :: Nat).
(a -> b -> b) -> b -> Vec n a -> Vec (n + 1) b
scanr a -> b -> b
f b
z Vec n a
xs)
{-# INLINE postscanr #-}
mapAccumL :: (acc -> x -> (acc,y)) -> acc -> Vec n x -> (acc,Vec n y)
mapAccumL :: (acc -> x -> (acc, y)) -> acc -> Vec n x -> (acc, Vec n y)
mapAccumL acc -> x -> (acc, y)
f acc
acc Vec n x
xs = (acc
acc',Vec n y
ys)
where
accs :: Vec (n + 1) acc
accs = acc
acc acc -> Vec n acc -> Vec (n + 1) acc
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n acc
accs'
ws :: Vec n (acc, y)
ws = (x -> acc -> (acc, y)) -> Vec n x -> Vec n acc -> Vec n (acc, y)
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith ((acc -> x -> (acc, y)) -> x -> acc -> (acc, y)
forall a b c. (a -> b -> c) -> b -> a -> c
flip acc -> x -> (acc, y)
f) Vec n x
xs (Vec (n + 1) acc -> Vec n acc
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) acc
accs)
accs' :: Vec n acc
accs' = ((acc, y) -> acc) -> Vec n (acc, y) -> Vec n acc
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (acc, y) -> acc
forall a b. (a, b) -> a
fst Vec n (acc, y)
ws
ys :: Vec n y
ys = ((acc, y) -> y) -> Vec n (acc, y) -> Vec n y
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (acc, y) -> y
forall a b. (a, b) -> b
snd Vec n (acc, y)
ws
acc' :: acc
acc' = Vec (n + 1) acc -> acc
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec (n + 1) acc
accs
{-# INLINE mapAccumL #-}
mapAccumR :: (acc -> x -> (acc,y)) -> acc -> Vec n x -> (acc, Vec n y)
mapAccumR :: (acc -> x -> (acc, y)) -> acc -> Vec n x -> (acc, Vec n y)
mapAccumR acc -> x -> (acc, y)
f acc
acc Vec n x
xs = (acc
acc',Vec n y
ys)
where
accs :: Vec (n + 1) acc
accs = Vec n acc
accs' Vec n acc -> acc -> Vec (n + 1) acc
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< acc
acc
ws :: Vec n (acc, y)
ws = (x -> acc -> (acc, y)) -> Vec n x -> Vec n acc -> Vec n (acc, y)
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith ((acc -> x -> (acc, y)) -> x -> acc -> (acc, y)
forall a b c. (a -> b -> c) -> b -> a -> c
flip acc -> x -> (acc, y)
f) Vec n x
xs (Vec (n + 1) acc -> Vec n acc
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) acc
accs)
accs' :: Vec n acc
accs' = ((acc, y) -> acc) -> Vec n (acc, y) -> Vec n acc
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (acc, y) -> acc
forall a b. (a, b) -> a
fst Vec n (acc, y)
ws
ys :: Vec n y
ys = ((acc, y) -> y) -> Vec n (acc, y) -> Vec n y
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (acc, y) -> y
forall a b. (a, b) -> b
snd Vec n (acc, y)
ws
acc' :: acc
acc' = Vec (n + 1) acc -> acc
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (n + 1) acc
accs
{-# INLINE mapAccumR #-}
zip :: Vec n a -> Vec n b -> Vec n (a,b)
zip :: Vec n a -> Vec n b -> Vec n (a, b)
zip = (a -> b -> (a, b)) -> Vec n a -> Vec n b -> Vec n (a, b)
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (,)
{-# INLINE zip #-}
zip3 :: Vec n a -> Vec n b -> Vec n c -> Vec n (a,b,c)
zip3 :: Vec n a -> Vec n b -> Vec n c -> Vec n (a, b, c)
zip3 = (a -> b -> c -> (a, b, c))
-> Vec n a -> Vec n b -> Vec n c -> Vec n (a, b, c)
forall a b c d (n :: Nat).
(a -> b -> c -> d) -> Vec n a -> Vec n b -> Vec n c -> Vec n d
zipWith3 (,,)
{-# INLINE zip3 #-}
zip4 :: Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n (a,b,c,d)
zip4 :: Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n (a, b, c, d)
zip4 = (a -> b -> c -> d -> (a, b, c, d))
-> Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n (a, b, c, d)
forall a b c d e (n :: Nat).
(a -> b -> c -> d -> e)
-> Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n e
zipWith4 (,,,)
{-# INLINE zip4 #-}
zip5 :: Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n e -> Vec n (a,b,c,d,e)
zip5 :: Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n (a, b, c, d, e)
zip5 = (a -> b -> c -> d -> e -> (a, b, c, d, e))
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n (a, b, c, d, e)
forall a b c d e f (n :: Nat).
(a -> b -> c -> d -> e -> f)
-> Vec n a -> Vec n b -> Vec n c -> Vec n d -> Vec n e -> Vec n f
zipWith5 (,,,,)
{-# INLINE zip5 #-}
zip6
:: Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n (a,b,c,d,e,f)
zip6 :: Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n (a, b, c, d, e, f)
zip6 = (a -> b -> c -> d -> e -> f -> (a, b, c, d, e, f))
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n (a, b, c, d, e, f)
forall a b c d e f g (n :: Nat).
(a -> b -> c -> d -> e -> f -> g)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
zipWith6 (,,,,,)
{-# INLINE zip6 #-}
zip7
:: Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n (a,b,c,d,e,f,g)
zip7 :: Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n (a, b, c, d, e, f, g)
zip7 = (a -> b -> c -> d -> e -> f -> g -> (a, b, c, d, e, f, g))
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n (a, b, c, d, e, f, g)
forall a b c d e f g h (n :: Nat).
(a -> b -> c -> d -> e -> f -> g -> h)
-> Vec n a
-> Vec n b
-> Vec n c
-> Vec n d
-> Vec n e
-> Vec n f
-> Vec n g
-> Vec n h
zipWith7 (,,,,,,)
{-# INLINE zip7 #-}
unzip :: Vec n (a,b) -> (Vec n a, Vec n b)
unzip :: Vec n (a, b) -> (Vec n a, Vec n b)
unzip Vec n (a, b)
xs = (((a, b) -> a) -> Vec n (a, b) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (a, b) -> a
forall a b. (a, b) -> a
fst Vec n (a, b)
xs, ((a, b) -> b) -> Vec n (a, b) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (a, b) -> b
forall a b. (a, b) -> b
snd Vec n (a, b)
xs)
{-# INLINE unzip #-}
unzip3 :: Vec n (a,b,c) -> (Vec n a, Vec n b, Vec n c)
unzip3 :: Vec n (a, b, c) -> (Vec n a, Vec n b, Vec n c)
unzip3 Vec n (a, b, c)
xs = ( ((a, b, c) -> a) -> Vec n (a, b, c) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
x,b
_,c
_) -> a
x) Vec n (a, b, c)
xs
, ((a, b, c) -> b) -> Vec n (a, b, c) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
y,c
_) -> b
y) Vec n (a, b, c)
xs
, ((a, b, c) -> c) -> Vec n (a, b, c) -> Vec n c
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
z) -> c
z) Vec n (a, b, c)
xs
)
{-# INLINE unzip3 #-}
unzip4 :: Vec n (a,b,c,d) -> (Vec n a, Vec n b, Vec n c, Vec n d)
unzip4 :: Vec n (a, b, c, d) -> (Vec n a, Vec n b, Vec n c, Vec n d)
unzip4 Vec n (a, b, c, d)
xs = ( ((a, b, c, d) -> a) -> Vec n (a, b, c, d) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
w,b
_,c
_,d
_) -> a
w) Vec n (a, b, c, d)
xs
, ((a, b, c, d) -> b) -> Vec n (a, b, c, d) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
x,c
_,d
_) -> b
x) Vec n (a, b, c, d)
xs
, ((a, b, c, d) -> c) -> Vec n (a, b, c, d) -> Vec n c
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
y,d
_) -> c
y) Vec n (a, b, c, d)
xs
, ((a, b, c, d) -> d) -> Vec n (a, b, c, d) -> Vec n d
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
z) -> d
z) Vec n (a, b, c, d)
xs
)
{-# INLINE unzip4 #-}
unzip5 :: Vec n (a,b,c,d,e) -> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e)
unzip5 :: Vec n (a, b, c, d, e)
-> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e)
unzip5 Vec n (a, b, c, d, e)
xs = ( ((a, b, c, d, e) -> a) -> Vec n (a, b, c, d, e) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
v,b
_,c
_,d
_,e
_) -> a
v) Vec n (a, b, c, d, e)
xs
, ((a, b, c, d, e) -> b) -> Vec n (a, b, c, d, e) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
w,c
_,d
_,e
_) -> b
w) Vec n (a, b, c, d, e)
xs
, ((a, b, c, d, e) -> c) -> Vec n (a, b, c, d, e) -> Vec n c
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
x,d
_,e
_) -> c
x) Vec n (a, b, c, d, e)
xs
, ((a, b, c, d, e) -> d) -> Vec n (a, b, c, d, e) -> Vec n d
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
y,e
_) -> d
y) Vec n (a, b, c, d, e)
xs
, ((a, b, c, d, e) -> e) -> Vec n (a, b, c, d, e) -> Vec n e
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
z) -> e
z) Vec n (a, b, c, d, e)
xs
)
{-# INLINE unzip5 #-}
unzip6
:: Vec n (a,b,c,d,e,f)
-> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e, Vec n f)
unzip6 :: Vec n (a, b, c, d, e, f)
-> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e, Vec n f)
unzip6 Vec n (a, b, c, d, e, f)
xs = ( ((a, b, c, d, e, f) -> a) -> Vec n (a, b, c, d, e, f) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
u,b
_,c
_,d
_,e
_,f
_) -> a
u) Vec n (a, b, c, d, e, f)
xs
, ((a, b, c, d, e, f) -> b) -> Vec n (a, b, c, d, e, f) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
v,c
_,d
_,e
_,f
_) -> b
v) Vec n (a, b, c, d, e, f)
xs
, ((a, b, c, d, e, f) -> c) -> Vec n (a, b, c, d, e, f) -> Vec n c
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
w,d
_,e
_,f
_) -> c
w) Vec n (a, b, c, d, e, f)
xs
, ((a, b, c, d, e, f) -> d) -> Vec n (a, b, c, d, e, f) -> Vec n d
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
x,e
_,f
_) -> d
x) Vec n (a, b, c, d, e, f)
xs
, ((a, b, c, d, e, f) -> e) -> Vec n (a, b, c, d, e, f) -> Vec n e
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
y,f
_) -> e
y) Vec n (a, b, c, d, e, f)
xs
, ((a, b, c, d, e, f) -> f) -> Vec n (a, b, c, d, e, f) -> Vec n f
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
_,f
z) -> f
z) Vec n (a, b, c, d, e, f)
xs
)
{-# INLINE unzip6 #-}
unzip7
:: Vec n (a,b,c,d,e,f,g)
-> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e, Vec n f, Vec n g)
unzip7 :: Vec n (a, b, c, d, e, f, g)
-> (Vec n a, Vec n b, Vec n c, Vec n d, Vec n e, Vec n f, Vec n g)
unzip7 Vec n (a, b, c, d, e, f, g)
xs = ( ((a, b, c, d, e, f, g) -> a)
-> Vec n (a, b, c, d, e, f, g) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
t,b
_,c
_,d
_,e
_,f
_,g
_) -> a
t) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> b)
-> Vec n (a, b, c, d, e, f, g) -> Vec n b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
u,c
_,d
_,e
_,f
_,g
_) -> b
u) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> c)
-> Vec n (a, b, c, d, e, f, g) -> Vec n c
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
v,d
_,e
_,f
_,g
_) -> c
v) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> d)
-> Vec n (a, b, c, d, e, f, g) -> Vec n d
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
w,e
_,f
_,g
_) -> d
w) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> e)
-> Vec n (a, b, c, d, e, f, g) -> Vec n e
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
x,f
_,g
_) -> e
x) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> f)
-> Vec n (a, b, c, d, e, f, g) -> Vec n f
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
_,f
y,g
_) -> f
y) Vec n (a, b, c, d, e, f, g)
xs
, ((a, b, c, d, e, f, g) -> g)
-> Vec n (a, b, c, d, e, f, g) -> Vec n g
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (\(a
_,b
_,c
_,d
_,e
_,f
_,g
z) -> g
z) Vec n (a, b, c, d, e, f, g)
xs
)
{-# INLINE unzip7 #-}
index_int :: KnownNat n => Vec n a -> Int -> a
index_int :: Vec n a -> Int -> a
index_int Vec n a
xs i :: Int
i@(I# Int#
n0)
| Int# -> Bool
isTrue# (Int#
n0 Int# -> Int# -> Int#
<# Int#
0#) = String -> a
forall a. HasCallStack => String -> a
error String
"Clash.Sized.Vector.(!!): negative index"
| Bool
otherwise = Vec n a -> Int# -> a
forall (m :: Nat) a. Vec m a -> Int# -> a
sub Vec n a
xs Int#
n0
where
sub :: Vec m a -> Int# -> a
sub :: Vec m a -> Int# -> a
sub Vec m a
Nil Int#
_ = String -> a
forall a. HasCallStack => String -> a
error ([String] -> String
forall (t :: Type -> Type) a. Foldable t => t [a] -> [a]
P.concat [ String
"Clash.Sized.Vector.(!!): index "
, Int -> String
forall a. Show a => a -> String
show Int
i
, String
" is larger than maximum index "
, Int -> String
forall a. Show a => a -> String
show ((Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length Vec n a
xs)Int -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1)
])
sub (a
y `Cons` (!Vec n a
ys)) Int#
n = if Int# -> Bool
isTrue# (Int#
n Int# -> Int# -> Int#
==# Int#
0#)
then a
y
else Vec n a -> Int# -> a
forall (m :: Nat) a. Vec m a -> Int# -> a
sub Vec n a
ys (Int#
n Int# -> Int# -> Int#
-# Int#
1#)
{-# NOINLINE index_int #-}
(!!) :: (KnownNat n, Enum i) => Vec n a -> i -> a
Vec n a
xs !! :: Vec n a -> i -> a
!! i
i = Vec n a -> Int -> a
forall (n :: Nat) a. KnownNat n => Vec n a -> Int -> a
index_int Vec n a
xs (i -> Int
forall a. Enum a => a -> Int
fromEnum i
i)
{-# INLINE (!!) #-}
length :: KnownNat n => Vec n a -> Int
length :: Vec n a -> Int
length = Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Integer -> Int) -> (Vec n a -> Integer) -> Vec n a -> Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> Integer
natVal (Proxy n -> Integer) -> (Vec n a -> Proxy n) -> Vec n a -> Integer
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n a -> Proxy n
forall (n :: Nat) a. Vec n a -> Proxy n
asNatProxy
{-# NOINLINE length #-}
replace_int :: KnownNat n => Vec n a -> Int -> a -> Vec n a
replace_int :: Vec n a -> Int -> a -> Vec n a
replace_int Vec n a
xs i :: Int
i@(I# Int#
n0) a
a
| Int# -> Bool
isTrue# (Int#
n0 Int# -> Int# -> Int#
<# Int#
0#) = String -> Vec n a
forall a. HasCallStack => String -> a
error String
"Clash.Sized.Vector.replace: negative index"
| Bool
otherwise = Vec n a -> Int# -> a -> Vec n a
forall (m :: Nat) b. Vec m b -> Int# -> b -> Vec m b
sub Vec n a
xs Int#
n0 a
a
where
sub :: Vec m b -> Int# -> b -> Vec m b
sub :: Vec m b -> Int# -> b -> Vec m b
sub Vec m b
Nil Int#
_ b
_ = String -> Vec m b
forall a. HasCallStack => String -> a
error ([String] -> String
forall (t :: Type -> Type) a. Foldable t => t [a] -> [a]
P.concat [ String
"Clash.Sized.Vector.replace: index "
, Int -> String
forall a. Show a => a -> String
show Int
i
, String
" is larger than maximum index "
, Int -> String
forall a. Show a => a -> String
show (Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length Vec n a
xs Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
])
sub (b
y `Cons` (!Vec n b
ys)) Int#
n b
b = if Int# -> Bool
isTrue# (Int#
n Int# -> Int# -> Int#
==# Int#
0#)
then b
b b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n b
ys
else b
y b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n b -> Int# -> b -> Vec n b
forall (m :: Nat) b. Vec m b -> Int# -> b -> Vec m b
sub Vec n b
ys (Int#
n Int# -> Int# -> Int#
-# Int#
1#) b
b
{-# NOINLINE replace_int #-}
replace :: (KnownNat n, Enum i) => i -> a -> Vec n a -> Vec n a
replace :: i -> a -> Vec n a -> Vec n a
replace i
i a
y Vec n a
xs = Vec n a -> Int -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => Vec n a -> Int -> a -> Vec n a
replace_int Vec n a
xs (i -> Int
forall a. Enum a => a -> Int
fromEnum i
i) a
y
{-# INLINE replace #-}
take :: SNat m -> Vec (m + n) a -> Vec m a
take :: SNat m -> Vec (m + n) a -> Vec m a
take SNat m
n = (Vec m a, Vec n a) -> Vec m a
forall a b. (a, b) -> a
fst ((Vec m a, Vec n a) -> Vec m a)
-> (Vec (m + n) a -> (Vec m a, Vec n a))
-> Vec (m + n) a
-> Vec m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt SNat m
n
{-# INLINE take #-}
takeI :: KnownNat m => Vec (m + n) a -> Vec m a
takeI :: Vec (m + n) a -> Vec m a
takeI = (SNat m -> Vec (m + n) a -> Vec m a) -> Vec (m + n) a -> Vec m a
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat m -> Vec (m + n) a -> Vec m a
forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec m a
take
{-# INLINE takeI #-}
drop :: SNat m -> Vec (m + n) a -> Vec n a
drop :: SNat m -> Vec (m + n) a -> Vec n a
drop SNat m
n = (Vec m a, Vec n a) -> Vec n a
forall a b. (a, b) -> b
snd ((Vec m a, Vec n a) -> Vec n a)
-> (Vec (m + n) a -> (Vec m a, Vec n a))
-> Vec (m + n) a
-> Vec n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
forall (m :: Nat) (n :: Nat) a.
SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt SNat m
n
{-# INLINE drop #-}
dropI :: KnownNat m => Vec (m + n) a -> Vec n a
dropI :: Vec (m + n) a -> Vec n a
dropI = (SNat m -> Vec (m + n) a -> Vec n a) -> Vec (m + n) a -> Vec n a
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat m -> Vec (m + n) a -> Vec n a
forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec n a
drop
{-# INLINE dropI #-}
at :: SNat m -> Vec (m + (n + 1)) a -> a
at :: SNat m -> Vec (m + (n + 1)) a -> a
at SNat m
n Vec (m + (n + 1)) a
xs = Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head (Vec (n + 1) a -> a) -> Vec (n + 1) a -> a
forall a b. (a -> b) -> a -> b
$ (Vec m a, Vec (n + 1) a) -> Vec (n + 1) a
forall a b. (a, b) -> b
snd ((Vec m a, Vec (n + 1) a) -> Vec (n + 1) a)
-> (Vec m a, Vec (n + 1) a) -> Vec (n + 1) a
forall a b. (a -> b) -> a -> b
$ SNat m -> Vec (m + (n + 1)) a -> (Vec m a, Vec (n + 1) a)
forall (m :: Nat) (n :: Nat) a.
SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt SNat m
n Vec (m + (n + 1)) a
xs
{-# INLINE at #-}
select :: (CmpNat (i + s) (s * n) ~ 'GT)
=> SNat f
-> SNat s
-> SNat n
-> Vec (f + i) a
-> Vec n a
select :: SNat f -> SNat s -> SNat n -> Vec (f + i) a -> Vec n a
select SNat f
f SNat s
s SNat n
n Vec (f + i) a
xs = UNat n -> Vec i a -> Vec n a
forall (n :: Nat) (i :: Nat) a. UNat n -> Vec i a -> Vec n a
select' (SNat n -> UNat n
forall (n :: Nat). SNat n -> UNat n
toUNat SNat n
n) (Vec i a -> Vec n a) -> Vec i a -> Vec n a
forall a b. (a -> b) -> a -> b
$ SNat f -> Vec (f + i) a -> Vec i a
forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec n a
drop SNat f
f Vec (f + i) a
xs
where
select' :: UNat n -> Vec i a -> Vec n a
select' :: UNat n -> Vec i a -> Vec n a
select' UNat n
UZero Vec i a
_ = Vec n a
forall a. Vec 0 a
Nil
select' (USucc UNat n
n') vs :: Vec i a
vs@(a
x `Cons` Vec n a
_) = a
x a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons`
UNat n -> Vec Any a -> Vec n a
forall (n :: Nat) (i :: Nat) a. UNat n -> Vec i a -> Vec n a
select' UNat n
n' (SNat s -> Vec (s + Any) a -> Vec Any a
forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec n a
drop SNat s
s (Vec i a -> Vec (s + Any) a
forall a b. a -> b
unsafeCoerce Vec i a
vs))
{-# NOINLINE select #-}
selectI :: (CmpNat (i + s) (s * n) ~ 'GT, KnownNat n)
=> SNat f
-> SNat s
-> Vec (f + i) a
-> Vec n a
selectI :: SNat f -> SNat s -> Vec (f + i) a -> Vec n a
selectI SNat f
f SNat s
s Vec (f + i) a
xs = (SNat n -> Vec n a) -> Vec n a
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat (\SNat n
n -> SNat f -> SNat s -> SNat n -> Vec (f + i) a -> Vec n a
forall (i :: Nat) (s :: Nat) (n :: Nat) (f :: Nat) a.
(CmpNat (i + s) (s * n) ~ 'GT) =>
SNat f -> SNat s -> SNat n -> Vec (f + i) a -> Vec n a
select SNat f
f SNat s
s SNat n
n Vec (f + i) a
xs)
{-# INLINE selectI #-}
replicate :: SNat n -> a -> Vec n a
replicate :: SNat n -> a -> Vec n a
replicate SNat n
n a
a = UNat n -> a -> Vec n a
forall (n :: Nat) a. UNat n -> a -> Vec n a
replicateU (SNat n -> UNat n
forall (n :: Nat). SNat n -> UNat n
toUNat SNat n
n) a
a
{-# NOINLINE replicate #-}
replicateU :: UNat n -> a -> Vec n a
replicateU :: UNat n -> a -> Vec n a
replicateU UNat n
UZero a
_ = Vec n a
forall a. Vec 0 a
Nil
replicateU (USucc UNat n
s) a
x = a
x a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` UNat n -> a -> Vec n a
forall (n :: Nat) a. UNat n -> a -> Vec n a
replicateU UNat n
s a
x
repeat :: KnownNat n => a -> Vec n a
repeat :: a -> Vec n a
repeat = (SNat n -> a -> Vec n a) -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => (SNat n -> a) -> a
withSNat SNat n -> a -> Vec n a
forall (n :: Nat) a. SNat n -> a -> Vec n a
replicate
{-# INLINE repeat #-}
iterate :: SNat n -> (a -> a) -> a -> Vec n a
iterate :: SNat n -> (a -> a) -> a -> Vec n a
iterate SNat n
SNat = (a -> a) -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI
{-# INLINE iterate #-}
iterateI :: forall n a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI :: (a -> a) -> a -> Vec n a
iterateI a -> a
f a
a = Vec n a
xs
where
xs :: Vec n a
xs = Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init (a
a a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n a
ws)
ws :: Vec n a
ws = (a -> a) -> Vec n a -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> a
f (Vec n a -> Vec n a
forall (n :: Nat) a. KnownNat n => Vec n a -> Vec n a
lazyV Vec n a
xs)
{-# NOINLINE iterateI #-}
{-# ANN iterateI (InlinePrimitive [VHDL,Verilog,SystemVerilog] [I.i| [{
"BlackBoxHaskell": {
"name": "Clash.Sized.Vector.iterateI"
, "templateFunction": "Clash.Primitives.Sized.Vector.iterateBBF"
}}] |]) #-}
unfoldr :: SNat n -> (s -> (a,s)) -> s -> Vec n a
unfoldr :: SNat n -> (s -> (a, s)) -> s -> Vec n a
unfoldr SNat n
SNat = (s -> (a, s)) -> s -> Vec n a
forall (n :: Nat) s a. KnownNat n => (s -> (a, s)) -> s -> Vec n a
unfoldrI
{-# INLINE unfoldr #-}
unfoldrI :: KnownNat n => (s -> (a,s)) -> s -> Vec n a
unfoldrI :: (s -> (a, s)) -> s -> Vec n a
unfoldrI s -> (a, s)
f s
s0 = ((a, s) -> a) -> Vec n (a, s) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (a, s) -> a
forall a b. (a, b) -> a
fst Vec n (a, s)
xs
where
xs :: Vec n (a, s)
xs = Vec (n + 1) (a, s) -> Vec n (a, s)
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init (s -> (a, s)
f s
s0 (a, s) -> Vec n (a, s) -> Vec (n + 1) (a, s)
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n (a, s)
ws)
ws :: Vec n (a, s)
ws = ((a, s) -> (a, s)) -> Vec n (a, s) -> Vec n (a, s)
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (s -> (a, s)
f (s -> (a, s)) -> ((a, s) -> s) -> (a, s) -> (a, s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a, s) -> s
forall a b. (a, b) -> b
snd) (Vec n (a, s) -> Vec n (a, s)
forall (n :: Nat) a. KnownNat n => Vec n a -> Vec n a
lazyV Vec n (a, s)
xs)
{-# INLINE unfoldrI #-}
generate :: SNat n -> (a -> a) -> a -> Vec n a
generate :: SNat n -> (a -> a) -> a -> Vec n a
generate SNat n
SNat a -> a
f a
a = (a -> a) -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI a -> a
f (a -> a
f a
a)
{-# INLINE generate #-}
generateI :: KnownNat n => (a -> a) -> a -> Vec n a
generateI :: (a -> a) -> a -> Vec n a
generateI a -> a
f a
a = (a -> a) -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI a -> a
f (a -> a
f a
a)
{-# INLINE generateI #-}
transpose :: KnownNat n => Vec m (Vec n a) -> Vec n (Vec m a)
transpose :: Vec m (Vec n a) -> Vec n (Vec m a)
transpose = (Vec n a -> Vec n a) -> Vec m (Vec n a) -> Vec n (Vec m a)
forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse# Vec n a -> Vec n a
forall a. a -> a
id
{-# NOINLINE transpose #-}
stencil1d :: KnownNat n
=> SNat (stX + 1)
-> (Vec (stX + 1) a -> b)
-> Vec ((stX + n) + 1) a
-> Vec (n + 1) b
stencil1d :: SNat (stX + 1)
-> (Vec (stX + 1) a -> b) -> Vec ((stX + n) + 1) a -> Vec (n + 1) b
stencil1d SNat (stX + 1)
stX Vec (stX + 1) a -> b
f Vec ((stX + n) + 1) a
xs = (Vec (stX + 1) a -> b)
-> Vec (n + 1) (Vec (stX + 1) a) -> Vec (n + 1) b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map Vec (stX + 1) a -> b
f (SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
forall (n :: Nat) (stX :: Nat) a.
KnownNat n =>
SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
windows1d SNat (stX + 1)
stX Vec ((stX + n) + 1) a
xs)
{-# INLINE stencil1d #-}
stencil2d :: (KnownNat n, KnownNat m)
=> SNat (stY + 1)
-> SNat (stX + 1)
-> (Vec (stY + 1) (Vec (stX + 1) a) -> b)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (n + 1) b)
stencil2d :: SNat (stY + 1)
-> SNat (stX + 1)
-> (Vec (stY + 1) (Vec (stX + 1) a) -> b)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (n + 1) b)
stencil2d SNat (stY + 1)
stY SNat (stX + 1)
stX Vec (stY + 1) (Vec (stX + 1) a) -> b
f Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
xss = ((Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)) -> Vec (n + 1) b)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
-> Vec (m + 1) (Vec (n + 1) b)
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map((Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)) -> Vec (n + 1) b)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
-> Vec (m + 1) (Vec (n + 1) b))
-> ((Vec (stY + 1) (Vec (stX + 1) a) -> b)
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)) -> Vec (n + 1) b)
-> (Vec (stY + 1) (Vec (stX + 1) a) -> b)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
-> Vec (m + 1) (Vec (n + 1) b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Vec (stY + 1) (Vec (stX + 1) a) -> b)
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)) -> Vec (n + 1) b
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map) Vec (stY + 1) (Vec (stX + 1) a) -> b
f (SNat (stY + 1)
-> SNat (stX + 1)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
forall (n :: Nat) (m :: Nat) (stY :: Nat) (stX :: Nat) a.
(KnownNat n, KnownNat m) =>
SNat (stY + 1)
-> SNat (stX + 1)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
windows2d SNat (stY + 1)
stY SNat (stX + 1)
stX Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
xss)
{-# INLINE stencil2d #-}
windows1d :: KnownNat n
=> SNat (stX + 1)
-> Vec ((stX + n) + 1) a
-> Vec (n + 1) (Vec (stX + 1) a)
windows1d :: SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
windows1d SNat (stX + 1)
stX Vec ((stX + n) + 1) a
xs = (Vec ((stX + 1) + n) a -> Vec (stX + 1) a)
-> Vec (n + 1) (Vec ((stX + 1) + n) a)
-> Vec (n + 1) (Vec (stX + 1) a)
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (SNat (stX + 1) -> Vec ((stX + 1) + n) a -> Vec (stX + 1) a
forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec m a
take SNat (stX + 1)
stX) (Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec ((stX + n) + 1) a)
forall (n :: Nat) (n :: Nat) a.
KnownNat n =>
Vec (n + 1) a -> Vec n (Vec (n + 1) a)
rotations Vec ((stX + n) + 1) a
xs)
where
rotateL :: Vec (n + 1) a -> Vec (n + 1) a
rotateL Vec (n + 1) a
ys = Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) a
ys Vec n a -> a -> Vec (n + 1) a
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (n + 1) a
ys
rotations :: Vec (n + 1) a -> Vec n (Vec (n + 1) a)
rotations Vec (n + 1) a
ys = (Vec (n + 1) a -> Vec (n + 1) a)
-> Vec (n + 1) a -> Vec n (Vec (n + 1) a)
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI Vec (n + 1) a -> Vec (n + 1) a
forall (n :: Nat) a. Vec (n + 1) a -> Vec (n + 1) a
rotateL Vec (n + 1) a
ys
{-# INLINE windows1d #-}
windows2d :: (KnownNat n,KnownNat m)
=> SNat (stY + 1)
-> SNat (stX + 1)
-> Vec ((stY + m) + 1) (Vec (stX + n + 1) a)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
windows2d :: SNat (stY + 1)
-> SNat (stX + 1)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
windows2d SNat (stY + 1)
stY SNat (stX + 1)
stX Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
xss = (Vec (stY + 1) (Vec ((stX + n) + 1) a)
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
-> Vec (m + 1) (Vec (stY + 1) (Vec ((stX + n) + 1) a))
-> Vec (m + 1) (Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (Vec (stY + 1) (Vec (n + 1) (Vec (stX + 1) a))
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a))
forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
Vec m (Vec n a) -> Vec n (Vec m a)
transpose (Vec (stY + 1) (Vec (n + 1) (Vec (stX + 1) a))
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a)))
-> (Vec (stY + 1) (Vec ((stX + n) + 1) a)
-> Vec (stY + 1) (Vec (n + 1) (Vec (stX + 1) a)))
-> Vec (stY + 1) (Vec ((stX + n) + 1) a)
-> Vec (n + 1) (Vec (stY + 1) (Vec (stX + 1) a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a))
-> Vec (stY + 1) (Vec ((stX + n) + 1) a)
-> Vec (stY + 1) (Vec (n + 1) (Vec (stX + 1) a))
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
forall (n :: Nat) (stX :: Nat) a.
KnownNat n =>
SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
windows1d SNat (stX + 1)
stX))) (SNat (stY + 1)
-> Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
-> Vec (m + 1) (Vec (stY + 1) (Vec ((stX + n) + 1) a))
forall (n :: Nat) (stX :: Nat) a.
KnownNat n =>
SNat (stX + 1)
-> Vec ((stX + n) + 1) a -> Vec (n + 1) (Vec (stX + 1) a)
windows1d SNat (stY + 1)
stY Vec ((stY + m) + 1) (Vec ((stX + n) + 1) a)
xss)
{-# INLINE windows2d #-}
permute :: (Enum i, KnownNat n, KnownNat m)
=> (a -> a -> a)
-> Vec n a
-> Vec m i
-> Vec (m + k) a
-> Vec n a
permute :: (a -> a -> a) -> Vec n a -> Vec m i -> Vec (m + k) a -> Vec n a
permute a -> a -> a
f Vec n a
defs Vec m i
is Vec (m + k) a
xs = Vec n a
ys
where
ixs :: Vec m (i, a)
ixs = Vec m i -> Vec m a -> Vec m (i, a)
forall (n :: Nat) a b. Vec n a -> Vec n b -> Vec n (a, b)
zip Vec m i
is (Vec (m + k) a -> Vec m a
forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
Vec (m + n) a -> Vec m a
takeI Vec (m + k) a
xs)
ys :: Vec n a
ys = (Vec n a -> (i, a) -> Vec n a)
-> Vec n a -> Vec m (i, a) -> Vec n a
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl (\Vec n a
ks (i
i,a
x) -> let ki :: a
ki = Vec n a
ksVec n a -> i -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!!i
i in i -> a -> Vec n a -> Vec n a
forall (n :: Nat) i a.
(KnownNat n, Enum i) =>
i -> a -> Vec n a -> Vec n a
replace i
i (a -> a -> a
f a
x a
ki) Vec n a
ks) Vec n a
defs Vec m (i, a)
ixs
{-# INLINE permute #-}
backpermute :: (Enum i, KnownNat n)
=> Vec n a
-> Vec m i
-> Vec m a
backpermute :: Vec n a -> Vec m i -> Vec m a
backpermute Vec n a
xs = (i -> a) -> Vec m i -> Vec m a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (Vec n a
xsVec n a -> i -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!!)
{-# INLINE backpermute #-}
scatter :: (Enum i, KnownNat n, KnownNat m)
=> Vec n a
-> Vec m i
-> Vec (m + k) a
-> Vec n a
scatter :: Vec n a -> Vec m i -> Vec (m + k) a -> Vec n a
scatter = (a -> a -> a) -> Vec n a -> Vec m i -> Vec (m + k) a -> Vec n a
forall i (n :: Nat) (m :: Nat) a (k :: Nat).
(Enum i, KnownNat n, KnownNat m) =>
(a -> a -> a) -> Vec n a -> Vec m i -> Vec (m + k) a -> Vec n a
permute a -> a -> a
forall a b. a -> b -> a
const
{-# INLINE scatter #-}
gather :: (Enum i, KnownNat n)
=> Vec n a
-> Vec m i
-> Vec m a
gather :: Vec n a -> Vec m i -> Vec m a
gather Vec n a
xs = (i -> a) -> Vec m i -> Vec m a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map (Vec n a
xsVec n a -> i -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!!)
{-# INLINE gather #-}
interleave :: (KnownNat n, KnownNat d)
=> SNat d
-> Vec (n * d) a
-> Vec (d * n) a
interleave :: SNat d -> Vec (n * d) a -> Vec (d * n) a
interleave SNat d
d = Vec d (Vec n a) -> Vec (d * n) a
forall (n :: Nat) (m :: Nat) a. Vec n (Vec m a) -> Vec (n * m) a
concat (Vec d (Vec n a) -> Vec (d * n) a)
-> (Vec (n * d) a -> Vec d (Vec n a))
-> Vec (n * d) a
-> Vec (d * n) a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n (Vec d a) -> Vec d (Vec n a)
forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
Vec m (Vec n a) -> Vec n (Vec m a)
transpose (Vec n (Vec d a) -> Vec d (Vec n a))
-> (Vec (n * d) a -> Vec n (Vec d a))
-> Vec (n * d) a
-> Vec d (Vec n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SNat d -> Vec (n * d) a -> Vec n (Vec d a)
forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
SNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcat SNat d
d
{-# INLINE interleave #-}
rotateLeft :: (Enum i, KnownNat n)
=> Vec n a
-> i
-> Vec n a
rotateLeft :: Vec n a -> i -> Vec n a
rotateLeft Vec n a
xs i
i = (Int -> a) -> Vec n Int -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map ((Vec n a
xs Vec n a -> Int -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!!) (Int -> a) -> (Int -> Int) -> Int -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
len)) ((Int -> Int) -> Int -> Vec n Int
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
i')
where
i' :: Int
i' = i -> Int
forall a. Enum a => a -> Int
fromEnum i
i
len :: Int
len = Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length Vec n a
xs
{-# INLINE rotateLeft #-}
rotateRight :: (Enum i, KnownNat n)
=> Vec n a
-> i
-> Vec n a
rotateRight :: Vec n a -> i -> Vec n a
rotateRight Vec n a
xs i
i = (Int -> a) -> Vec n Int -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map ((Vec n a
xs Vec n a -> Int -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!!) (Int -> a) -> (Int -> Int) -> Int -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int -> Int -> Int
forall a. Integral a => a -> a -> a
`mod` Int
len)) ((Int -> Int) -> Int -> Vec n Int
forall (n :: Nat) a. KnownNat n => (a -> a) -> a -> Vec n a
iterateI (Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Int
i')
where
i' :: Int
i' = Int -> Int
forall a. Num a => a -> a
negate (i -> Int
forall a. Enum a => a -> Int
fromEnum i
i)
len :: Int
len = Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length Vec n a
xs
{-# INLINE rotateRight #-}
rotateLeftS :: KnownNat n
=> Vec n a
-> SNat d
-> Vec n a
rotateLeftS :: Vec n a -> SNat d -> Vec n a
rotateLeftS Vec n a
xs SNat d
d = Integer -> Vec n a -> Vec n a
forall (k :: Nat) a. Integer -> Vec k a -> Vec k a
go (SNat d -> Integer
forall (n :: Nat). SNat n -> Integer
snatToInteger SNat d
d Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> Integer
natVal (Vec n a -> Proxy n
forall (n :: Nat) a. Vec n a -> Proxy n
asNatProxy Vec n a
xs)) Vec n a
xs
where
go :: Integer -> Vec k a -> Vec k a
go :: Integer -> Vec k a -> Vec k a
go Integer
_ Vec k a
Nil = Vec k a
forall a. Vec 0 a
Nil
go Integer
0 Vec k a
ys = Vec k a
ys
go Integer
n (a
y `Cons` Vec n a
ys) = Integer -> Vec k a -> Vec k a
forall (k :: Nat) a. Integer -> Vec k a -> Vec k a
go (Integer
nInteger -> Integer -> Integer
forall a. Num a => a -> a -> a
-Integer
1) (Vec n a
ys Vec n a -> a -> Vec (n + 1) a
forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
:< a
y)
{-# NOINLINE rotateLeftS #-}
rotateRightS :: KnownNat n
=> Vec n a
-> SNat d
-> Vec n a
rotateRightS :: Vec n a -> SNat d -> Vec n a
rotateRightS Vec n a
xs SNat d
d = Integer -> Vec n a -> Vec n a
forall a (a :: Nat) b. (Eq a, Num a) => a -> Vec a b -> Vec a b
go (SNat d -> Integer
forall (n :: Nat). SNat n -> Integer
snatToInteger SNat d
d Integer -> Integer -> Integer
forall a. Integral a => a -> a -> a
`mod` Proxy n -> Integer
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> Integer
natVal (Vec n a -> Proxy n
forall (n :: Nat) a. Vec n a -> Proxy n
asNatProxy Vec n a
xs)) Vec n a
xs
where
go :: a -> Vec a b -> Vec a b
go a
_ Vec a b
Nil = Vec a b
forall a. Vec 0 a
Nil
go a
0 Vec a b
ys = Vec a b
ys
go a
n ys :: Vec a b
ys@(Cons b
_ Vec n b
_) = a -> Vec a b -> Vec a b
go (a
na -> a -> a
forall a. Num a => a -> a -> a
-a
1) (Vec (n + 1) b -> b
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec a b
Vec (n + 1) b
ys b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> Vec (n + 1) b -> Vec n b
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec a b
Vec (n + 1) b
ys)
{-# NOINLINE rotateRightS #-}
toList :: Vec n a -> [a]
toList :: Vec n a -> [a]
toList = (a -> [a] -> [a]) -> [a] -> Vec n a -> [a]
forall a b (n :: Nat). (a -> b -> b) -> b -> Vec n a -> b
foldr (:) []
{-# INLINE toList #-}
fromList :: forall n a. (KnownNat n) => [a] -> Maybe (Vec n a)
fromList :: [a] -> Maybe (Vec n a)
fromList [a]
xs
| Integer -> [a] -> Bool
forall t a. (Eq t, Num t) => t -> [a] -> Bool
exactLength (KnownNat n => Integer
forall (n :: Nat). KnownNat n => Integer
natToInteger @n) [a]
xs = Vec n a -> Maybe (Vec n a)
forall a. a -> Maybe a
Just ([a] -> Vec n a
forall (n :: Nat) a. KnownNat n => [a] -> Vec n a
unsafeFromList [a]
xs)
| Bool
otherwise = Maybe (Vec n a)
forall a. Maybe a
Nothing
where
exactLength :: t -> [a] -> Bool
exactLength t
0 [a]
acc = [a] -> Bool
forall (t :: Type -> Type) a. Foldable t => t a -> Bool
null [a]
acc
exactLength t
_ [] = Bool
False
exactLength t
i (a
_:[a]
ys) = t -> [a] -> Bool
exactLength (t
i t -> t -> t
forall a. Num a => a -> a -> a
- t
1) [a]
ys
{-# NOINLINE fromList #-}
{-# ANN fromList dontTranslate #-}
unsafeFromList :: forall n a. (KnownNat n) => [a] -> Vec n a
unsafeFromList :: [a] -> Vec n a
unsafeFromList = SNat n -> ([a] -> (a, [a])) -> [a] -> Vec n a
forall (n :: Nat) s a. SNat n -> (s -> (a, s)) -> s -> Vec n a
unfoldr SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat [a] -> (a, [a])
go
where
go :: [a] -> (a, [a])
go :: [a] -> (a, [a])
go (a
x:[a]
xs) = (a
x, [a]
xs)
go [] =
let item :: a
item = String -> a
forall a. HasCallStack => String -> a
error String
"Clash.Sized.Vector.unsafeFromList: vector larger than list"
in (a
forall a. a
item, [])
{-# NOINLINE unsafeFromList #-}
{-# ANN unsafeFromList dontTranslate #-}
listToVecTH :: Lift a => [a] -> ExpQ
listToVecTH :: [a] -> ExpQ
listToVecTH [] = [| Nil |]
listToVecTH (a
x:[a]
xs) = [| x :> $(listToVecTH xs) |]
asNatProxy :: Vec n a -> Proxy n
asNatProxy :: Vec n a -> Proxy n
asNatProxy Vec n a
_ = Proxy n
forall k (t :: k). Proxy t
Proxy
lengthS :: KnownNat n => Vec n a -> SNat n
lengthS :: Vec n a -> SNat n
lengthS Vec n a
_ = SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat
{-# INLINE lengthS #-}
lazyV :: KnownNat n
=> Vec n a
-> Vec n a
lazyV :: Vec n a -> Vec n a
lazyV = Vec n () -> Vec n a -> Vec n a
forall (n :: Nat) a. Vec n () -> Vec n a -> Vec n a
lazyV' (() -> Vec n ()
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat ())
where
lazyV' :: Vec n () -> Vec n a -> Vec n a
lazyV' :: Vec n () -> Vec n a -> Vec n a
lazyV' Vec n ()
Nil Vec n a
_ = Vec n a
forall a. Vec 0 a
Nil
lazyV' (()
_ `Cons` Vec n ()
xs) Vec n a
ys = Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec n a
Vec (n + 1) a
ys a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec n () -> Vec n a -> Vec n a
forall (n :: Nat) a. Vec n () -> Vec n a -> Vec n a
lazyV' Vec n ()
xs (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec n a
Vec (n + 1) a
ys)
{-# NOINLINE lazyV #-}
dfold :: forall p k a . KnownNat k
=> Proxy (p :: TyFun Nat Type -> Type)
-> (forall l . SNat l -> a -> (p @@ l) -> (p @@ (l + 1)))
-> (p @@ 0)
-> Vec k a
-> (p @@ k)
dfold :: Proxy p
-> (forall (l :: Nat). SNat l -> a -> (p @@ l) -> p @@ (l + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold Proxy p
_ forall (l :: Nat). SNat l -> a -> (p @@ l) -> p @@ (l + 1)
f p @@ 0
z Vec k a
xs = SNat k -> Vec k a -> p @@ k
forall (n :: Nat). SNat n -> Vec n a -> p @@ n
go (Proxy k -> SNat k
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> SNat n
snatProxy (Vec k a -> Proxy k
forall (n :: Nat) a. Vec n a -> Proxy n
asNatProxy Vec k a
xs)) Vec k a
xs
where
go :: SNat n -> Vec n a -> (p @@ n)
go :: SNat n -> Vec n a -> p @@ n
go SNat n
_ Vec n a
Nil = p @@ n
p @@ 0
z
go SNat n
s (a
y `Cons` (Vec n a
ys :: Vec z a)) =
let s' :: SNat n
s' = SNat n
SNat (n + 1)
s SNat (n + 1) -> SNat 1 -> SNat n
forall (a :: Nat) (b :: Nat). SNat (a + b) -> SNat b -> SNat a
`subSNat` SNat 1
d1
in SNat n -> a -> (p @@ n) -> p @@ (n + 1)
forall (l :: Nat). SNat l -> a -> (p @@ l) -> p @@ (l + 1)
f SNat n
s' a
y (SNat n -> Vec n a -> p @@ n
forall (n :: Nat). SNat n -> Vec n a -> p @@ n
go SNat n
s' Vec n a
ys)
{-# NOINLINE dfold #-}
dtfold :: forall p k a . KnownNat k
=> Proxy (p :: TyFun Nat Type -> Type)
-> (a -> (p @@ 0))
-> (forall l . SNat l -> (p @@ l) -> (p @@ l) -> (p @@ (l + 1)))
-> Vec (2^k) a
-> (p @@ k)
dtfold :: Proxy p
-> (a -> p @@ 0)
-> (forall (l :: Nat).
SNat l -> (p @@ l) -> (p @@ l) -> p @@ (l + 1))
-> Vec (2 ^ k) a
-> p @@ k
dtfold Proxy p
_ a -> p @@ 0
f forall (l :: Nat). SNat l -> (p @@ l) -> (p @@ l) -> p @@ (l + 1)
g = SNat k -> Vec (2 ^ k) a -> p @@ k
forall (n :: Nat). SNat n -> Vec (2 ^ n) a -> p @@ n
go (SNat k
forall (n :: Nat). KnownNat n => SNat n
SNat :: SNat k)
where
go :: forall n . SNat n -> Vec (2^n) a -> (p @@ n)
go :: SNat n -> Vec (2 ^ n) a -> p @@ n
go SNat n
_ (a
x `Cons` Vec n a
Nil) = a -> p @@ 0
f a
x
go SNat n
sn xs :: Vec (2 ^ n) a
xs@(Cons a
_ (Cons a
_ Vec n a
_)) =
let sn' :: SNat (n - 1)
sn' :: SNat (n - 1)
sn' = SNat n
SNat ((n - 1) + 1)
sn SNat ((n - 1) + 1) -> SNat 1 -> SNat (n - 1)
forall (a :: Nat) (b :: Nat). SNat (a + b) -> SNat b -> SNat a
`subSNat` SNat 1
d1
(Vec (2 ^ (n - 1)) a
xsL,Vec (2 ^ (n - 1)) a
xsR) = SNat (2 ^ (n - 1))
-> Vec ((2 ^ (n - 1)) + (2 ^ (n - 1))) a
-> (Vec (2 ^ (n - 1)) a, Vec (2 ^ (n - 1)) a)
forall (m :: Nat) (n :: Nat) a.
SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt (SNat (n - 1) -> SNat (2 ^ (n - 1))
forall (a :: Nat). SNat a -> SNat (2 ^ a)
pow2SNat SNat (n - 1)
sn') Vec ((2 ^ (n - 1)) + (2 ^ (n - 1))) a
Vec (2 ^ n) a
xs
in SNat (n - 1)
-> (p @@ (n - 1)) -> (p @@ (n - 1)) -> p @@ ((n - 1) + 1)
forall (l :: Nat). SNat l -> (p @@ l) -> (p @@ l) -> p @@ (l + 1)
g SNat (n - 1)
sn' (SNat (n - 1) -> Vec (2 ^ (n - 1)) a -> p @@ (n - 1)
forall (n :: Nat). SNat n -> Vec (2 ^ n) a -> p @@ n
go SNat (n - 1)
sn' Vec (2 ^ (n - 1)) a
xsL) (SNat (n - 1) -> Vec (2 ^ (n - 1)) a -> p @@ (n - 1)
forall (n :: Nat). SNat n -> Vec (2 ^ n) a -> p @@ n
go SNat (n - 1)
sn' Vec (2 ^ (n - 1)) a
xsR)
{-# NOINLINE dtfold #-}
data VCons (a :: Type) (f :: TyFun Nat Type) :: Type
type instance Apply (VCons a) l = Vec l a
vfold :: forall k a b . KnownNat k
=> (forall l . SNat l -> a -> Vec l b -> Vec (l + 1) b)
-> Vec k a
-> Vec k b
vfold :: (forall (l :: Nat). SNat l -> a -> Vec l b -> Vec (l + 1) b)
-> Vec k a -> Vec k b
vfold forall (l :: Nat). SNat l -> a -> Vec l b -> Vec (l + 1) b
f Vec k a
xs = Proxy (VCons b)
-> (forall (l :: Nat).
SNat l -> a -> (VCons b @@ l) -> VCons b @@ (l + 1))
-> (VCons b @@ 0)
-> Vec k a
-> VCons b @@ k
forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (l :: Nat). SNat l -> a -> (p @@ l) -> p @@ (l + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold (Proxy (VCons b)
forall k (t :: k). Proxy t
Proxy @(VCons b)) forall (l :: Nat).
SNat l -> a -> (VCons b @@ l) -> VCons b @@ (l + 1)
forall (l :: Nat). SNat l -> a -> Vec l b -> Vec (l + 1) b
f VCons b @@ 0
forall a. Vec 0 a
Nil Vec k a
xs
{-# INLINE vfold #-}
smap :: forall k a b . KnownNat k => (forall l . SNat l -> a -> b) -> Vec k a -> Vec k b
smap :: (forall (l :: Nat). SNat l -> a -> b) -> Vec k a -> Vec k b
smap forall (l :: Nat). SNat l -> a -> b
f Vec k a
xs = Vec k b -> Vec k b
forall (n :: Nat) a. Vec n a -> Vec n a
reverse
(Vec k b -> Vec k b) -> Vec k b -> Vec k b
forall a b. (a -> b) -> a -> b
$ Proxy (VCons b)
-> (forall (l :: Nat).
SNat l -> a -> (VCons b @@ l) -> VCons b @@ (l + 1))
-> (VCons b @@ 0)
-> Vec k a
-> VCons b @@ k
forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (l :: Nat). SNat l -> a -> (p @@ l) -> p @@ (l + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold (Proxy (VCons b)
forall k (t :: k). Proxy t
Proxy @(VCons b))
(\SNat l
sn a
x VCons b @@ l
xs' -> SNat l -> a -> b
forall (l :: Nat). SNat l -> a -> b
f SNat l
sn a
x b -> Vec l b -> Vec (l + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> VCons b @@ l
Vec l b
xs')
VCons b @@ 0
forall a. Vec 0 a
Nil (Vec k a -> Vec k a
forall (n :: Nat) a. Vec n a -> Vec n a
reverse Vec k a
xs)
{-# INLINE smap #-}
instance (KnownNat n, BitPack a) => BitPack (Vec n a) where
type BitSize (Vec n a) = n * (BitSize a)
pack :: Vec n a -> BitVector (BitSize (Vec n a))
pack = (Vec n a -> BitVector (n * BitSize a))
-> Vec n a -> BitVector (n * BitSize a)
forall (n :: Nat) a.
KnownNat n =>
(a -> BitVector n) -> a -> BitVector n
packXWith (Vec n (BitVector (BitSize a)) -> BitVector (n * BitSize a)
forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
Vec n (BitVector m) -> BitVector (n * m)
concatBitVector# (Vec n (BitVector (BitSize a)) -> BitVector (n * BitSize a))
-> (Vec n a -> Vec n (BitVector (BitSize a)))
-> Vec n a
-> BitVector (n * BitSize a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> BitVector (BitSize a))
-> Vec n a -> Vec n (BitVector (BitSize a))
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> BitVector (BitSize a)
forall a. BitPack a => a -> BitVector (BitSize a)
pack)
unpack :: BitVector (BitSize (Vec n a)) -> Vec n a
unpack = (BitVector (BitSize a) -> a)
-> Vec n (BitVector (BitSize a)) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map BitVector (BitSize a) -> a
forall a. BitPack a => BitVector (BitSize a) -> a
unpack (Vec n (BitVector (BitSize a)) -> Vec n a)
-> (BitVector (n * BitSize a) -> Vec n (BitVector (BitSize a)))
-> BitVector (n * BitSize a)
-> Vec n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BitVector (n * BitSize a) -> Vec n (BitVector (BitSize a))
forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
BitVector (n * m) -> Vec n (BitVector m)
unconcatBitVector#
concatBitVector#
:: forall n m
. (KnownNat n, KnownNat m)
=> Vec n (BitVector m)
-> BitVector (n * m)
concatBitVector# :: Vec n (BitVector m) -> BitVector (n * m)
concatBitVector# = BitVector (n * m) -> Vec n (BitVector m) -> BitVector (n * m)
forall (p :: Nat).
BitVector (n * m) -> Vec p (BitVector m) -> BitVector (n * m)
go BitVector (n * m)
0
where
go :: BitVector (n*m) -> Vec p (BitVector m) -> BitVector (n * m)
go :: BitVector (n * m) -> Vec p (BitVector m) -> BitVector (n * m)
go BitVector (n * m)
acc Vec p (BitVector m)
Nil = BitVector (n * m)
acc
go (BV Natural
accMsk Natural
accVal) ((BV Natural
xMsk Natural
xVal) `Cons` Vec n (BitVector m)
xs) =
let sh :: Int
sh = Integer -> Int
forall a. Num a => Integer -> a
fromInteger (Proxy m -> Integer
forall (n :: Nat) (proxy :: Nat -> Type).
KnownNat n =>
proxy n -> Integer
natVal (Proxy m
forall k (t :: k). Proxy t
Proxy @m)) :: Int in
BitVector (n * m) -> Vec n (BitVector m) -> BitVector (n * m)
forall (p :: Nat).
BitVector (n * m) -> Vec p (BitVector m) -> BitVector (n * m)
go (Natural -> Natural -> BitVector (n * m)
forall (n :: Nat). Natural -> Natural -> BitVector n
BV (Natural -> Int -> Natural
forall a. Bits a => a -> Int -> a
shiftL Natural
accMsk Int
sh Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
.|. Natural
xMsk) (Natural -> Int -> Natural
forall a. Bits a => a -> Int -> a
shiftL Natural
accVal Int
sh Natural -> Natural -> Natural
forall a. Bits a => a -> a -> a
.|. Natural
xVal)) Vec n (BitVector m)
xs
{-# NOINLINE concatBitVector# #-}
unconcatBitVector#
:: forall n m
. (KnownNat n, KnownNat m)
=> BitVector (n * m)
-> Vec n (BitVector m)
unconcatBitVector# :: BitVector (n * m) -> Vec n (BitVector m)
unconcatBitVector# BitVector (n * m)
orig = (BitVector ((n - n) * m), Vec n (BitVector m))
-> Vec n (BitVector m)
forall a b. (a, b) -> b
snd (UNat n -> (BitVector ((n - n) * m), Vec n (BitVector m))
forall (p :: Nat).
(p <= n) =>
UNat p -> (BitVector ((n - p) * m), Vec p (BitVector m))
go (SNat n -> UNat n
forall (n :: Nat). SNat n -> UNat n
toUNat (KnownNat n => SNat n
forall (n :: Nat). KnownNat n => SNat n
SNat @n)))
where
go :: forall p . (p <= n) => UNat p -> (BitVector ((n-p)*m), Vec p (BitVector m))
go :: UNat p -> (BitVector ((n - p) * m), Vec p (BitVector m))
go UNat p
UZero = (BitVector (n * m)
BitVector ((n - p) * m)
orig,Vec p (BitVector m)
forall a. Vec 0 a
Nil)
go (USucc (n :: UNat (p-1))) =
let (BitVector ((n - n) * m)
bv,Vec n (BitVector m)
xs) = UNat n -> (BitVector ((n - n) * m), Vec n (BitVector m))
forall (p :: Nat).
(p <= n) =>
UNat p -> (BitVector ((n - p) * m), Vec p (BitVector m))
go UNat n
UNat (p - 1)
n
(BitVector ((n - p) * m)
l,BitVector m
x) = ((BitVector ((n - n) * m) -> (BitVector ((n - p) * m), BitVector m))
-> BitVector ((n - n) * m)
-> (BitVector ((n - p) * m), BitVector m)
forall a. a -> a
GHC.Magic.noinline BitVector ((n - n) * m) -> (BitVector ((n - p) * m), BitVector m)
forall (n :: Nat) (m :: Nat).
KnownNat n =>
BitVector (m + n) -> (BitVector m, BitVector n)
split#) BitVector ((n - n) * m)
bv
in (BitVector ((n - p) * m)
l,BitVector m
x BitVector m -> Vec n (BitVector m) -> Vec (n + 1) (BitVector m)
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> Vec n (BitVector m)
xs)
{-# NOINLINE unconcatBitVector# #-}
bv2v :: KnownNat n => BitVector n -> Vec n Bit
bv2v :: BitVector n -> Vec n Bit
bv2v = BitVector n -> Vec n Bit
forall a. BitPack a => BitVector (BitSize a) -> a
unpack
v2bv :: KnownNat n => Vec n Bit -> BitVector n
v2bv :: Vec n Bit -> BitVector n
v2bv = Vec n Bit -> BitVector n
forall a. BitPack a => a -> BitVector (BitSize a)
pack
seqV
:: KnownNat n
=> Vec n a
-> b
-> b
seqV :: Vec n a -> b -> b
seqV Vec n a
v b
b =
let s :: () -> a -> ()
s () a
e = a -> () -> ()
seq a
e () in
(() -> a -> ()) -> () -> Vec n a -> ()
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl () -> a -> ()
forall a. () -> a -> ()
s () Vec n a
v () -> b -> b
`seq` b
b
{-# NOINLINE seqV #-}
infixr 0 `seqV`
forceV
:: KnownNat n
=> Vec n a
-> Vec n a
forceV :: Vec n a -> Vec n a
forceV Vec n a
v =
Vec n a
v Vec n a -> Vec n a -> Vec n a
forall (n :: Nat) a b. KnownNat n => Vec n a -> b -> b
`seqV` Vec n a
v
{-# INLINE forceV #-}
seqVX
:: KnownNat n
=> Vec n a
-> b
-> b
seqVX :: Vec n a -> b -> b
seqVX Vec n a
v b
b =
let s :: () -> a -> ()
s () a
e = a -> () -> ()
forall a b. a -> b -> b
seqX a
e () in
(() -> a -> ()) -> () -> Vec n a -> ()
forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl () -> a -> ()
forall a. () -> a -> ()
s () Vec n a
v () -> b -> b
forall a b. a -> b -> b
`seqX` b
b
{-# NOINLINE seqVX #-}
infixr 0 `seqVX`
forceVX
:: KnownNat n
=> Vec n a
-> Vec n a
forceVX :: Vec n a -> Vec n a
forceVX Vec n a
v =
Vec n a
v Vec n a -> Vec n a -> Vec n a
forall (n :: Nat) a b. KnownNat n => Vec n a -> b -> b
`seqVX` Vec n a
v
{-# INLINE forceVX #-}
instance Lift a => Lift (Vec n a) where
lift :: Vec n a -> ExpQ
lift Vec n a
Nil = [| Nil |]
lift (a
x `Cons` Vec n a
xs) = [| x `Cons` $(lift xs) |]
#if MIN_VERSION_template_haskell(2,16,0)
liftTyped :: Vec n a -> Q (TExp (Vec n a))
liftTyped = Vec n a -> Q (TExp (Vec n a))
forall a. Lift a => a -> Q (TExp a)
liftTypedFromUntyped
#endif
instance (KnownNat n, Arbitrary a) => Arbitrary (Vec n a) where
arbitrary :: Gen (Vec n a)
arbitrary = (Gen a -> Gen a) -> Vec n (Gen a) -> Gen (Vec n a)
forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse# Gen a -> Gen a
forall a. a -> a
id (Vec n (Gen a) -> Gen (Vec n a)) -> Vec n (Gen a) -> Gen (Vec n a)
forall a b. (a -> b) -> a -> b
$ Gen a -> Vec n (Gen a)
forall (n :: Nat) a. KnownNat n => a -> Vec n a
repeat Gen a
forall a. Arbitrary a => Gen a
arbitrary
shrink :: Vec n a -> [Vec n a]
shrink = ([a] -> [a]) -> Vec n [a] -> [Vec n a]
forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse# [a] -> [a]
forall a. a -> a
id (Vec n [a] -> [Vec n a])
-> (Vec n a -> Vec n [a]) -> Vec n a -> [Vec n a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> [a]) -> Vec n a -> Vec n [a]
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> [a]
forall a. Arbitrary a => a -> [a]
shrink
instance CoArbitrary a => CoArbitrary (Vec n a) where
coarbitrary :: Vec n a -> Gen b -> Gen b
coarbitrary = [a] -> Gen b -> Gen b
forall a b. CoArbitrary a => a -> Gen b -> Gen b
coarbitrary ([a] -> Gen b -> Gen b)
-> (Vec n a -> [a]) -> Vec n a -> Gen b -> Gen b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vec n a -> [a]
forall (n :: Nat) a. Vec n a -> [a]
toList
type instance Lens.Index (Vec n a) = Index n
type instance Lens.IxValue (Vec n a) = a
instance KnownNat n => Lens.Ixed (Vec n a) where
ix :: Index (Vec n a) -> Traversal' (Vec n a) (IxValue (Vec n a))
ix Index (Vec n a)
i IxValue (Vec n a) -> f (IxValue (Vec n a))
f Vec n a
xs = Vec n a -> Int -> a -> Vec n a
forall (n :: Nat) a. KnownNat n => Vec n a -> Int -> a -> Vec n a
replace_int Vec n a
xs (Index n -> Int
forall a. Enum a => a -> Int
fromEnum Index (Vec n a)
Index n
i) (a -> Vec n a) -> f a -> f (Vec n a)
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
<$> IxValue (Vec n a) -> f (IxValue (Vec n a))
f (Vec n a -> Int -> a
forall (n :: Nat) a. KnownNat n => Vec n a -> Int -> a
index_int Vec n a
xs (Index n -> Int
forall a. Enum a => a -> Int
fromEnum Index (Vec n a)
Index n
i))