{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# 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, hasBlackBox)
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 (..), seqX, isX)
#define CONS_PREC 5
infixr CONS_PREC `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 CONS_PREC :>
instance Show a => Show (Vec n a) where
showsPrec :: Int -> Vec n a -> ShowS
showsPrec Int
n = \case
Vec n a
Nil -> String -> ShowS
showString String
"Nil"
Vec n a
vs -> Bool -> ShowS -> ShowS
showParen (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> CONS_PREC) (go vs)
where
go :: Vec m a -> ShowS
go :: Vec m a -> ShowS
go Vec m a
Nil = String -> ShowS
showString String
"Nil"
go (a
x `Cons` Vec n a
xs) =
Int -> a -> ShowS
forall a. Show a => Int -> a -> ShowS
showsPrec (CONS_PREC + 1) 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
go Vec n a
xs
instance ShowX a => ShowX (Vec n a) where
showsPrecX :: Int -> Vec n a -> ShowS
showsPrecX Int
n Vec n a
vs =
case Vec n a -> Either String (Vec n a)
forall a. a -> Either String a
isX Vec n a
vs of
Right Vec n a
Nil -> String -> ShowS
showString String
"Nil"
Left String
_ -> String -> ShowS
showString String
"undefined"
Either String (Vec n a)
_ -> Bool -> ShowS -> ShowS
showParen (Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> CONS_PREC) (go vs)
where
go :: Vec m a -> ShowS
go :: Vec m a -> ShowS
go (Vec m a -> Either String (Vec m a)
forall a. a -> Either String a
isX -> Left String
_) = String -> ShowS
showString String
"undefined"
go Vec m a
Nil = String -> ShowS
showString String
"Nil"
go (a
x `Cons` Vec n a
xs) =
Int -> a -> ShowS
forall a. ShowX a => Int -> a -> ShowS
showsPrecX (CONS_PREC + 1) 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
go 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# #-}
{-# ANN traverse# hasBlackBox #-}
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 #-}
{-# ANN head hasBlackBox #-}
head :: Vec (n + 1) a -> a
head :: Vec (n + 1) a -> a
head (a
x `Cons` Vec n a
_) = a
x
{-# NOINLINE tail #-}
{-# ANN tail hasBlackBox #-}
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 #-}
{-# ANN last hasBlackBox #-}
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 #-}
{-# ANN init hasBlackBox #-}
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 (++) #-}
{-# ANN (++) hasBlackBox #-}
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 #-}
{-# ANN splitAt hasBlackBox #-}
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 #-}
{-# ANN concat hasBlackBox #-}
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 #-}
{-# ANN unconcat hasBlackBox #-}
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 #-}
{-# ANN reverse hasBlackBox #-}
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 #-}
{-# ANN map hasBlackBox #-}
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 #-}
{-# ANN imap hasBlackBox #-}
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 #-}
{-# ANN zipWith hasBlackBox #-}
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 #-}
{-# ANN foldr hasBlackBox #-}
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 #-}
{-# ANN index_int hasBlackBox #-}
(!!) :: (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 #-}
{-# ANN length hasBlackBox #-}
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 #-}
{-# ANN replace_int hasBlackBox #-}
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 #-}
{-# ANN select hasBlackBox #-}
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 #-}
{-# ANN replicate hasBlackBox #-}
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 #-}
{-# ANN transpose hasBlackBox #-}
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 #-}
{-# ANN rotateLeftS hasBlackBox #-}
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 #-}
{-# ANN rotateRightS hasBlackBox #-}
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 #-}
{-# ANN lazyV hasBlackBox #-}
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) =
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 #-}
{-# ANN dfold hasBlackBox #-}
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 #-}
{-# ANN dtfold hasBlackBox #-}
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# #-}
{-# ANN concatBitVector# hasBlackBox #-}
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# #-}
{-# ANN unconcatBitVector# hasBlackBox #-}
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 #-}
{-# ANN seqV hasBlackBox #-}
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 #-}
{-# ANN seqVX hasBlackBox #-}
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))