{-# LANGUAGE CPP #-}
{-# LANGUAGE EmptyCase #-}
{-# 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_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, smapWithBounds
, 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, maximum, minimum
, scanl, scanl1, scanr, scanr1, 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.Distributive
import Data.Functor.Rep
#if MIN_VERSION_base(4,18,0)
import qualified Data.Foldable1 as F1
#endif
import Data.Default (Default (..))
import qualified Data.Foldable as F
import Data.Kind (Type)
import Data.Proxy (Proxy (..))
import Data.Singletons (TyFun,Apply,type (@@))
import GHC.TypeLits (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,
scanl1, scanr, scanr1, splitAt, tail,
take, unzip, unzip3, zip, zip3, zipWith,
zipWith3, maximum, minimum)
import qualified Data.String.Interpolate as I
import qualified Prelude as P
import Test.QuickCheck
(Arbitrary(arbitrary, shrink), CoArbitrary(coarbitrary))
import Clash.Annotations.Primitive
(Primitive(InlineYamlPrimitive), HDL(..), dontTranslate, hasBlackBox)
import Clash.Magic (clashCompileError, clashSimulation)
import Clash.Promoted.Nat
(SNat (..), SNatLE (..), UNat (..), compareSNat, pow2SNat,
snatProxy, snatToInteger, subSNat, withSNat, toUNat, natToInteger)
#if MIN_VERSION_base(4,18,0)
import Clash.Promoted.Nat (leToPlus)
#endif
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
{-# COMPLETE Nil, (:>) #-}
data N
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) (K1 N (Dict (n ~ 0))) :+:
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 :: forall x. Vec n a -> Rep (Vec n a) x
from Vec n a
Nil = (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (0 ~ 0))))
(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) (K1 N (Dict (0 ~ 0)))
:+: 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) (K1 N (Dict (0 ~ 0))) x
-> (:+:)
(M1 C ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (0 ~ 0))))
(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 (K1 N (Dict (0 ~ 0)) x
-> M1 C ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (0 ~ 0))) x
forall k i (c :: Meta) (f :: k -> Type) (p :: k). f p -> M1 i c f p
M1 (Dict (0 ~ 0) -> K1 N (Dict (0 ~ 0)) x
forall k i c (p :: k). c -> K1 i c p
K1 Dict (0 ~ 0)
forall (a :: Constraint). a => Dict a
Dict)))
from (Cons a
x Vec n a
xs) = (:+:)
(C1 ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (n ~ 0))))
(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)
(C1 ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (n ~ 0)))
:+: 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
-> (:+:)
(C1 ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (n ~ 0))))
(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 :: forall x. Rep (Vec n a) x -> Vec n a
to (M1 (:+:)
(C1 ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (n ~ 0))))
(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) = case SNat n -> SNat 0 -> SNatLE n 0
forall (a :: Nat) (b :: Nat). SNat a -> SNat b -> SNatLE a b
compareSNat (forall (n :: Nat). KnownNat n => SNat n
SNat @n) (forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub Dict (n ~ 0)
(n <= 0) => Dict (n ~ 0)
Dict -> Vec n a
Vec 0 a
forall a. Vec 0 a
Nil
SNatLE n 0
SNatGT -> case (:+:)
(C1 ('MetaCons "Nil" 'PrefixI 'False) (K1 N (Dict (n ~ 0))))
(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 a
p) :*: M1 (K1 Vec (n - 1) a
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
L1 (M1 (K1 Dict (n ~ 0)
eqZero)) -> case Dict (n ~ 0)
eqZero of {}
instance (KnownNat n, Typeable a, Data a) => Data (Vec n a) where
gunfold :: forall (c :: Type -> Type).
(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 (forall (n :: Nat). KnownNat n => SNat n
SNat @n) (forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub Dict (n ~ 0)
(n <= 0) => Dict (n ~ 0)
Dict -> Vec n a -> c (Vec n a)
forall r. r -> c r
z Vec n a
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 (forall r. r -> c r
z @(a -> Vec (n-1) a -> Vec n a) a -> Vec (n - 1) a -> Vec n a
a -> Vec (n - 1) a -> Vec ((n - 1) + 1) 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 (c :: Type -> Type).
(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 (forall (n :: Nat). KnownNat n => SNat n
SNat @n) (forall (n :: Nat). KnownNat n => SNat n
SNat @0) of
SNatLE n 0
SNatLE -> case forall (a :: Nat). (a <= 0) :- (a ~ 0)
leZero @n of
Sub Dict (n ~ 0)
(n <= 0) => Dict (n ~ 0)
Dict -> Vec n a -> c (Vec n a)
forall g. g -> c g
z Vec n a
Vec 0 a
forall a. Vec 0 a
Nil
SNatLE n 0
SNatGT -> case Vec n a
xs of
(a
y :> Vec (n - 1) a
ys) -> (forall g. g -> c g
z @(a -> Vec (n-1) a -> Vec n a) a -> Vec (n - 1) a -> Vec n a
a -> Vec (n - 1) a -> Vec ((n - 1) + 1) 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 $m:> :: forall {r} {a} {n :: Nat}.
Vec (n + 1) a -> (a -> Vec n a -> r) -> ((# #) -> r) -> r
$b:> :: forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
(:>) x xs <- ((\Vec (n + 1) a
ys -> (Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head 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)) -> (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 :: forall (m :: Nat). 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 :: forall (m :: Nat). 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 :: forall a. 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 <*> :: forall a b. 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 => F.Foldable (Vec n) where
fold :: forall m. Monoid m => Vec n m -> m
fold Vec n m
Nil = m
forall a. Monoid a => a
mempty
fold z :: Vec n m
z@Cons{} = (m -> m -> m) -> Vec (n + 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
Vec (n + 1) m
z
foldMap :: forall m a. Monoid m => (a -> m) -> Vec n a -> m
foldMap a -> m
_ Vec n a
Nil = m
forall a. Monoid a => a
mempty
foldMap a -> m
f z :: Vec n a
z@Cons{} = (m -> m -> m) -> Vec (n + 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 ((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 Vec n a
z)
foldr :: forall a b. (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 :: forall b a. (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 :: forall a. (a -> a -> a) -> Vec n a -> a
foldr1 a -> a -> a
_ Vec n a
Nil = String -> a
forall a. HasCallStack => String -> a
clashCompileError String
"foldr1: empty Vec"
foldr1 a -> a -> a
f z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 1) a -> a
forall a (n :: Nat). (a -> a -> a) -> Vec (n + 1) a -> a
foldr1 a -> a -> a
f Vec n a
Vec (n + 1) a
z
foldl1 :: forall a. (a -> a -> a) -> Vec n a -> a
foldl1 a -> a -> a
_ Vec n a
Nil = String -> a
forall a. HasCallStack => String -> a
clashCompileError String
"foldl1: empty Vec"
foldl1 a -> a -> a
f z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 1) a -> a
forall a (n :: Nat). (a -> a -> a) -> Vec (n + 1) a -> a
foldl1 a -> a -> a
f Vec n a
Vec (n + 1) a
z
toList :: forall a. Vec n a -> [a]
toList = Vec n a -> [a]
forall (n :: Nat) a. Vec n a -> [a]
toList
null :: forall a. Vec n a -> Bool
null Vec n a
Nil = Bool
True
null Vec n a
_ = Bool
False
length :: forall a. Vec n a -> Int
length = Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length
maximum :: forall a. Ord a => Vec n a -> a
maximum Vec n a
Nil = String -> a
forall a. HasCallStack => String -> a
clashCompileError String
"maximum: empty Vec"
maximum z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 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) Vec n a
Vec (n + 1) a
z
minimum :: forall a. Ord a => Vec n a -> a
minimum Vec n a
Nil = String -> a
forall a. HasCallStack => String -> a
clashCompileError String
"minimum: empty Vec"
minimum z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 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) Vec n a
Vec (n + 1) a
z
sum :: forall a. Num a => Vec n a -> a
sum Vec n a
Nil = a
0
sum z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 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
(+) Vec n a
Vec (n + 1) a
z
product :: forall a. Num a => Vec n a -> a
product Vec n a
Nil = a
1
product z :: Vec n a
z@Cons{} = (a -> a -> a) -> Vec (n + 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
(*) Vec n a
Vec (n + 1) a
z
#if MIN_VERSION_base(4,18,0)
instance (KnownNat n, 1 <= n) => F1.Foldable1 (Vec n) where
fold1 :: forall m. Semigroup m => Vec n m -> m
fold1 = 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. Semigroup a => a -> a -> a
(<>)
foldMap1 :: forall m a. Semigroup m => (a -> m) -> Vec n a -> m
foldMap1 a -> m
f = 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. Semigroup a => a -> a -> a
(<>) (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
maximum :: forall a. Ord a => Vec n a -> a
maximum = forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n Vec n a -> a
Vec (m + 1) a -> a
forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a
forall a (n :: Nat). Ord a => Vec (n + 1) a -> a
maximum
minimum :: forall a. Ord a => Vec n a -> a
minimum = forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n Vec n a -> a
Vec (m + 1) a -> a
forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a
forall a (n :: Nat). Ord a => Vec (n + 1) a -> a
minimum
head :: forall a. Vec n a -> a
head = forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n Vec n a -> a
Vec (m + 1) a -> a
forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head
last :: forall a. Vec n a -> a
last = forall (k :: Nat) (n :: Nat) r.
(k <= n) =>
(forall (m :: Nat). (n ~ (k + m)) => r) -> r
leToPlus @1 @n Vec n a -> a
Vec (m + 1) a -> a
forall (m :: Nat). (n ~ (1 + m)) => Vec n a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last
#endif
instance Functor (Vec n) where
fmap :: forall a b. (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 => Traversable (Vec n) where
traverse :: forall (f :: Type -> Type) a b.
Applicative f =>
(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#
{-# CLASH_OPAQUE traverse# #-}
{-# ANN traverse# hasBlackBox #-}
traverse# :: forall a f b n . Applicative f => (a -> f b) -> Vec n a -> f (Vec n b)
traverse# :: forall a (f :: Type -> Type) b (n :: Nat).
Applicative f =>
(a -> f b) -> Vec n a -> f (Vec n b)
traverse# a -> f b
_ Vec n a
Nil = Vec n b -> f (Vec n b)
forall a. a -> f a
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure Vec n b
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
b -> Vec n b -> Vec (n + 1) 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 a b. f (a -> b) -> f a -> f 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 :: HasCallStack => 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 :: forall (m :: Nat) b. (NFDataX b, KnownNat m) => 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 :: forall a. 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)
{-# CLASH_OPAQUE head #-}
{-# ANN head hasBlackBox #-}
head :: Vec (n + 1) a -> a
head :: forall (n :: Nat) a. Vec (n + 1) a -> a
head (a
x `Cons` Vec n a
_) = a
x
#if !MIN_VERSION_base(4,16,0) || MIN_VERSION_base(4,17,0)
head Vec (n + 1) a
xs = Vec (n + 1) a -> a
forall (n :: Nat) a. (1 <= n) => Vec n a -> a
unreachable Vec (n + 1) a
xs
where
unreachable :: forall n a. 1 <= n => Vec n a -> a
unreachable :: forall (n :: Nat) a. (1 <= n) => Vec n a -> a
unreachable (a
x `Cons` Vec n a
_) = a
x
#endif
{-# CLASH_OPAQUE tail #-}
{-# ANN tail hasBlackBox #-}
tail :: Vec (n + 1) a -> Vec n a
tail :: forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail (a
_ `Cons` Vec n a
xr) = Vec n a
Vec n a
xr
#if !MIN_VERSION_base(4,16,0) || MIN_VERSION_base(4,17,0)
tail Vec (n + 1) a
xs = Vec (n + 1) a -> Vec ((n + 1) - 1) a
forall (n :: Nat) a. (1 <= n) => Vec n a -> Vec (n - 1) a
unreachable Vec (n + 1) a
xs
where
unreachable :: forall n a. 1 <= n => Vec n a -> Vec (n - 1) a
unreachable :: forall (n :: Nat) a. (1 <= n) => Vec n a -> Vec (n - 1) a
unreachable (a
_ `Cons` Vec n a
xr) = Vec n a
Vec (n - 1) a
xr
#endif
{-# CLASH_OPAQUE last #-}
{-# ANN last hasBlackBox #-}
last :: Vec (n + 1) a -> a
last :: forall (n :: Nat) a. Vec (n + 1) a -> a
last (a
x `Cons` Vec n a
Nil) = a
x
last (a
_ `Cons` a
y `Cons` Vec n a
xr) = 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
xr)
#if !MIN_VERSION_base(4,16,0) || MIN_VERSION_base(4,17,0)
last Vec (n + 1) a
xs = Vec (n + 1) a -> a
forall (n :: Nat) a. (1 <= n) => Vec n a -> a
unreachable Vec (n + 1) a
xs
where
unreachable :: 1 <= n => Vec n a -> a
unreachable :: forall (n :: Nat) a. (1 <= n) => Vec n a -> a
unreachable ys :: Vec n a
ys@(Cons a
_ Vec n a
_) = Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec n a
Vec (n + 1) a
ys
#endif
{-# CLASH_OPAQUE init #-}
{-# ANN init hasBlackBox #-}
init :: Vec (n + 1) a -> Vec n a
init :: forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init (a
_ `Cons` Vec n a
Nil) = Vec n a
Vec 0 a
forall a. Vec 0 a
Nil
init (a
x `Cons` a
y `Cons` Vec n a
xr) = 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
xr)
#if !MIN_VERSION_base(4,16,0) || MIN_VERSION_base(4,17,0)
init Vec (n + 1) a
xs = Vec (n + 1) a -> Vec ((n + 1) - 1) a
forall (n :: Nat) a. (1 <= n) => Vec n a -> Vec (n - 1) a
unreachable Vec (n + 1) a
xs
where
unreachable :: 1 <= n => Vec n a -> Vec (n - 1) a
unreachable :: forall (n :: Nat) a. (1 <= n) => Vec n a -> Vec (n - 1) a
unreachable ys :: Vec n a
ys@(Cons a
_ Vec n a
_) = Vec ((n - 1) + 1) a -> Vec (n - 1) a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec n a
Vec ((n - 1) + 1) a
ys
#endif
{-# INLINE shiftInAt0 #-}
shiftInAt0 :: KnownNat n
=> Vec n a
-> Vec m a
-> (Vec n a, Vec m a)
shiftInAt0 :: 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 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 :: 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 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 $m:< :: forall {r} {n :: Nat} {a}.
Vec (n + 1) a -> (Vec n a -> a -> r) -> ((# #) -> r) -> r
$b:< :: forall (n :: Nat) a. Vec n a -> a -> Vec (n + 1) a
(:<) xs x <- ((\Vec (n + 1) a
ys -> (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) a
ys,Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec (n + 1) a
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 +>>
(+>>) :: forall n a . a -> Vec n a -> Vec n a
a
s +>> :: forall (n :: Nat) a. a -> Vec n a -> Vec n a
+>> Vec n a
xs = Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init (a
s a -> Vec n a -> Vec (n + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> Vec n a
xs)
{-# INLINE (+>>) #-}
infixl 4 <<+
(<<+) :: Vec n a -> a -> Vec n a
Vec n a
xs <<+ :: forall (n :: Nat) a. 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 :: forall a (m :: Nat) (n :: Nat).
(Default a, KnownNat m) =>
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 :: forall a (n :: Nat) (m :: Nat).
(Default a, KnownNat n) =>
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 ++ :: forall (n :: Nat) a (m :: Nat). 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
{-# CLASH_OPAQUE (++) #-}
{-# ANN (++) hasBlackBox #-}
splitAt :: SNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAt :: 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) 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
{-# CLASH_OPAQUE splitAt #-}
{-# ANN splitAt hasBlackBox #-}
splitAtU :: UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU :: forall (m :: Nat) (n :: Nat) a.
UNat m -> Vec (m + n) a -> (Vec m a, Vec n a)
splitAtU UNat m
UZero Vec (m + n) a
ys = (Vec m a
Vec 0 a
forall a. Vec 0 a
Nil, Vec n a
Vec (m + n) a
ys)
splitAtU (USucc UNat n
s) Vec (m + 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 + n) a -> (Vec n a, Vec n a))
-> Vec (n + n) a -> (Vec n a, Vec n a)
forall a b. (a -> b) -> a -> b
$ Vec ((n + n) + 1) a -> Vec (n + n) a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (m + n) a
Vec ((n + n) + 1) a
ys
in (Vec ((n + n) + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (m + n) a
Vec ((n + 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 a
as, Vec n a
bs)
splitAtI :: KnownNat m => Vec (m + n) a -> (Vec m a, Vec n a)
splitAtI :: forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
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 :: forall (n :: Nat) (m :: Nat) a. Vec n (Vec m a) -> Vec (n * m) a
concat Vec n (Vec m a)
Nil = Vec 0 a
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
{-# CLASH_OPAQUE concat #-}
{-# ANN concat hasBlackBox #-}
concatMap :: (a -> Vec m b) -> Vec n a -> Vec (n * m) b
concatMap :: forall a (m :: Nat) b (n :: Nat).
(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 :: forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
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
{-# CLASH_OPAQUE unconcat #-}
{-# ANN unconcat hasBlackBox #-}
unconcatU :: UNat n -> UNat m -> Vec (n * m) a -> Vec n (Vec m a)
unconcatU :: forall (n :: Nat) (m :: Nat) a.
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)
Vec 0 (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 :: forall (n :: Nat) (m :: Nat) a.
(KnownNat n, KnownNat m) =>
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 :: Vec n a -> Vec n a -> Vec (2 * n) a
merge :: forall (n :: Nat) a. 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 n (Vec 2 a) -> Vec (n * 2) a)
-> Vec n (Vec 2 a) -> Vec (n * 2) a
forall a b. (a -> b) -> a -> b
$ (a -> a -> Vec 2 a) -> Vec n a -> Vec n a -> Vec n (Vec 2 a)
forall a b c (n :: Nat).
(a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith (\a
a a
b -> a
a a -> Vec 1 a -> Vec (1 + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> a -> Vec 1 a
forall a. a -> Vec 1 a
singleton a
b) Vec n a
x Vec n a
y
{-# INLINE merge #-}
reverse :: Vec n a -> Vec n a
reverse :: forall (n :: Nat) a. Vec n a -> Vec n a
reverse Vec n a
xs = Vec (n - n) a -> Vec n a -> Vec n a
forall (i :: Nat) (n :: Nat) a.
(i <= n) =>
Vec (n - i) a -> Vec i a -> Vec n a
go Vec 0 a
Vec (n - n) a
forall a. Vec 0 a
Nil Vec n a
xs
where
go :: i <= n => Vec (n - i) a -> Vec i a -> Vec n a
go :: forall (i :: Nat) (n :: Nat) a.
(i <= n) =>
Vec (n - i) a -> Vec i a -> Vec n a
go Vec (n - i) a
a (a
y `Cons` Vec n a
ys) = Vec (n - n) a -> Vec n a -> Vec n a
forall (i :: Nat) (n :: Nat) a.
(i <= n) =>
Vec (n - i) a -> Vec i a -> Vec n a
go (a
y a -> Vec (n - i) a -> Vec ((n - i) + 1) a
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec (n - i) a
a) Vec n a
ys
go Vec (n - i) a
a Vec i a
Nil = Vec n a
Vec (n - i) a
a
{-# CLASH_OPAQUE reverse #-}
{-# ANN reverse hasBlackBox #-}
map :: (a -> b) -> Vec n a -> Vec n b
map :: forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map a -> b
_ Vec n a
Nil = Vec n b
Vec 0 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
{-# CLASH_OPAQUE map #-}
{-# ANN map hasBlackBox #-}
imap :: forall n a b . KnownNat n => (Index n -> a -> b) -> Vec n a -> Vec n b
imap :: forall (n :: Nat) a b.
KnownNat n =>
(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 :: forall (m :: Nat). Index n -> Vec m a -> Vec m b
go Index n
_ Vec m a
Nil = Vec m b
Vec 0 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
{-# CLASH_OPAQUE imap #-}
{-# ANN imap hasBlackBox #-}
izipWith :: KnownNat n => (Index n -> a -> b -> c) -> Vec n a -> Vec n b
-> Vec n c
izipWith :: 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 -> 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 :: forall (n :: Nat) a b.
KnownNat n =>
(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 :: forall (n :: Nat) a b.
KnownNat n =>
(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 :: forall (n :: Nat). KnownNat n => 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 :: forall (n :: Nat). KnownNat n => 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 :: forall (n :: Nat) a.
KnownNat n =>
(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 :: forall (n :: Nat) a.
(KnownNat n, Eq a) =>
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 ==)
{-# INLINE elemIndex #-}
zipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
zipWith :: forall a b c (n :: Nat).
(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
Vec 0 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)
{-# CLASH_OPAQUE zipWith #-}
{-# ANN zipWith hasBlackBox #-}
zipWith3 :: (a -> b -> c -> d) -> Vec n a -> Vec n b -> Vec n c -> Vec n d
zipWith3 :: forall a b c d (n :: Nat).
(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 :: 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 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 :: 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 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 :: 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 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 :: 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 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 :: forall a b (n :: Nat). (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)
{-# CLASH_OPAQUE foldr #-}
{-# ANN foldr hasBlackBox #-}
foldl :: forall b a n . (b -> a -> b) -> b -> Vec n a -> b
foldl :: forall b a (n :: Nat). (b -> a -> b) -> b -> Vec n a -> b
foldl b -> a -> b
f b
z0 Vec n a
xs0
| Bool
clashSimulation = b -> Vec n a -> b
forall (m :: Nat). b -> Vec m a -> b
go b
z0 Vec n a
xs0
| Bool
otherwise = 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
z0 Vec n a
xs0)
where
go :: forall m. b -> Vec m a -> b
go :: forall (m :: Nat). b -> Vec m a -> b
go b
z Vec m a
Nil = b
z
go b
z (Cons a
x Vec n a
xs) =
let z1 :: b
z1 = b -> a -> b
f b
z a
x
in b
z1 b -> b -> b
forall a b. a -> b -> b
`seq` b -> Vec n a -> b
forall (m :: Nat). b -> Vec m a -> b
go b
z1 Vec n a
xs
{-# INLINE foldl #-}
foldr1 :: (a -> a -> a) -> Vec (n + 1) a -> a
foldr1 :: forall a (n :: Nat). (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 :: forall a (n :: Nat). (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 :: forall (n :: Nat) a. (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 a. [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
{-# CLASH_OPAQUE fold #-}
{-# ANN fold (InlineYamlPrimitive [VHDL,Verilog,SystemVerilog] [I.__i|
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 :: 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 = 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 #-}
scanl1 :: forall n a. (a -> a -> a) -> Vec (n+1) a -> Vec (n+1) a
scanl1 :: forall (n :: Nat) a.
(a -> a -> a) -> Vec (n + 1) a -> Vec (n + 1) a
scanl1 a -> a -> a
op Vec (n + 1) a
vs = (a -> a -> a) -> a -> Vec n a -> Vec (n + 1) a
forall b a (n :: Nat).
(b -> a -> b) -> b -> Vec n a -> Vec (n + 1) b
scanl a -> a -> a
op (Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
head Vec (n + 1) a
vs) (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
tail Vec (n + 1) a
vs)
{-# INLINE scanl1 #-}
scanr1 :: forall n a. (a -> a -> a) -> Vec (n+1) a -> Vec (n+1) a
scanr1 :: forall (n :: Nat) a.
(a -> a -> a) -> Vec (n + 1) a -> Vec (n + 1) a
scanr1 a -> a -> a
op Vec (n + 1) a
vs = (a -> a -> a) -> a -> Vec n a -> Vec (n + 1) a
forall a b (n :: Nat).
(a -> b -> b) -> b -> Vec n a -> Vec (n + 1) b
scanr a -> a -> a
op (Vec (n + 1) a -> a
forall (n :: Nat) a. Vec (n + 1) a -> a
last Vec (n + 1) a
vs) (Vec (n + 1) a -> Vec n a
forall (n :: Nat) a. Vec (n + 1) a -> Vec n a
init Vec (n + 1) a
vs)
{-# INLINE scanr1 #-}
postscanl :: (b -> a -> b) -> b -> Vec n a -> Vec n b
postscanl :: forall b a (n :: Nat). (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 :: 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 = 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 :: forall a b (n :: Nat). (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 :: forall acc x y (n :: Nat).
(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 :: forall acc x y (n :: Nat).
(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 :: forall (n :: Nat) a b. 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 :: forall (n :: Nat) a b c.
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 :: 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 = (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 :: 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 = (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 :: 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 = (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 :: forall (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
-> 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 :: forall (n :: Nat) a b. 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 :: forall (n :: Nat) a b c.
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 :: forall (n :: Nat) a b c d.
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 :: forall (n :: Nat) a b c d e.
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 :: forall (n :: Nat) a b c d e f.
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 :: forall (n :: Nat) a b c d e f g.
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 :: forall (n :: Nat) a. KnownNat n => 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 :: forall (m :: Nat) a. 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#)
{-# CLASH_OPAQUE index_int #-}
{-# ANN index_int hasBlackBox #-}
(!!) :: (KnownNat n, Enum i) => Vec n a -> i -> a
Vec n a
xs !! :: forall (n :: Nat) i a. (KnownNat n, Enum i) => 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 :: forall (n :: Nat) a. KnownNat n => 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
{-# CLASH_OPAQUE length #-}
{-# ANN length hasBlackBox #-}
replace_int :: KnownNat n => Vec n a -> Int -> a -> Vec n a
replace_int :: forall (n :: Nat) a. KnownNat n => 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 :: forall (m :: Nat) b. 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 out of bounds: "
, if Vec n a -> Int
forall (n :: Nat) a. KnownNat n => Vec n a -> Int
length Vec n a
xs Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0
then String
"<empty range>"
else String
"[0.." String -> ShowS
forall a. Semigroup a => a -> a -> a
<> 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) String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
"]"
])
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
{-# CLASH_OPAQUE replace_int #-}
{-# ANN replace_int hasBlackBox #-}
replace :: (KnownNat n, Enum i) => i -> a -> Vec n a -> Vec n a
replace :: forall (n :: Nat) i a.
(KnownNat n, Enum i) =>
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 :: forall (m :: Nat) (n :: Nat) a. 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 :: forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
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 :: forall (m :: Nat) (n :: Nat) a. 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 :: forall (m :: Nat) (n :: Nat) a.
KnownNat m =>
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 :: forall (m :: Nat) (n :: Nat) a. 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 :: forall i s n f a. s * n + 1 <= i + s
=> SNat f
-> SNat s
-> SNat n
-> Vec (f + i) a
-> Vec n a
select :: forall (i :: Nat) (s :: Nat) (n :: Nat) (f :: Nat) a.
(((s * n) + 1) <= (i + s)) =>
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 (m :: Nat) (j :: Nat) b.
(((s * m) + 1) <= (j + s)) =>
UNat m -> Vec j b -> Vec m b
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' :: forall m j b. (s * m + 1 <= j + s) => UNat m -> Vec j b -> Vec m b
select' :: forall (m :: Nat) (j :: Nat) b.
(((s * m) + 1) <= (j + s)) =>
UNat m -> Vec j b -> Vec m b
select' UNat m
m Vec j b
vs = case UNat m
m of
UNat m
UZero -> Vec m b
Vec 0 b
forall a. Vec 0 a
Nil
USucc UNat n
UZero -> forall (n :: Nat) a. Vec (n + 1) a -> a
head @(j - 1) Vec j b
Vec ((j - 1) + 1) b
vs b -> Vec 0 b -> Vec (0 + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` Vec 0 b
forall a. Vec 0 a
Nil
USucc m' :: UNat n
m'@(USucc UNat n
_) -> case forall (e :: Nat) (k :: Nat) (p :: Nat -> Type).
((e + s) <= (k + s)) =>
p e -> p k -> Dict (e <= k)
deduce @(s * (m - 1) + 1) @j Proxy ((s * (m - 1)) + 1)
forall {k} (t :: k). Proxy t
Proxy Proxy j
forall {k} (t :: k). Proxy t
Proxy of
Dict (((s * (m - 1)) + 1) <= j)
Dict -> forall (n :: Nat) a. Vec (n + 1) a -> a
head @(j - 1) Vec j b
Vec ((j - 1) + 1) b
vs b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
`Cons` UNat n -> Vec (j - s) b -> Vec n b
forall (m :: Nat) (j :: Nat) b.
(((s * m) + 1) <= (j + s)) =>
UNat m -> Vec j b -> Vec m b
select' UNat n
m' (forall (m :: Nat) (n :: Nat) a. SNat m -> Vec (m + n) a -> Vec n a
drop @s @(j - s) SNat s
s Vec j b
Vec (s + (j - s)) b
vs)
deduce :: e + s <= k + s => p e -> p k -> Dict (e <= k)
deduce :: forall (e :: Nat) (k :: Nat) (p :: Nat -> Type).
((e + s) <= (k + s)) =>
p e -> p k -> Dict (e <= k)
deduce p e
_ p k
_ = Dict
(Assert (OrdCond (CmpNat e k) 'True 'True 'False) (TypeError ...))
Dict
(Assert (OrdCond (Compare e k) 'True 'True 'False) (TypeError ...))
forall (a :: Constraint). a => Dict a
Dict
{-# CLASH_OPAQUE select #-}
{-# ANN select hasBlackBox #-}
selectI :: (1 <= s, s * n + 1 <= i + s, KnownNat n)
=> SNat f
-> SNat s
-> Vec (f + i) a
-> Vec n a
selectI :: forall (s :: Nat) (n :: Nat) (i :: Nat) (f :: Nat) a.
(1 <= s, ((s * n) + 1) <= (i + s), KnownNat n) =>
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.
(((s * n) + 1) <= (i + s)) =>
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 :: forall (n :: Nat) a. 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
{-# CLASH_OPAQUE replicate #-}
{-# ANN replicate hasBlackBox #-}
replicateU :: UNat n -> a -> Vec n a
replicateU :: forall (n :: Nat) a. UNat n -> a -> Vec n a
replicateU UNat n
UZero a
_ = Vec n a
Vec 0 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 :: forall (n :: Nat) a. KnownNat n => 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 :: forall (n :: Nat) a. 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 :: forall (n :: Nat) a. KnownNat n => (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)
{-# CLASH_OPAQUE iterateI #-}
{-# ANN iterateI (InlineYamlPrimitive [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 :: forall (n :: Nat) s a. 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 :: forall (n :: Nat) s a. KnownNat n => (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 :: forall (n :: Nat) a. 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 :: forall (n :: Nat) a. KnownNat n => (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 :: forall (n :: Nat) (m :: Nat) a.
KnownNat n =>
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
{-# CLASH_OPAQUE 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 :: forall (n :: Nat) (stX :: Nat) a b.
KnownNat n =>
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 :: forall (n :: Nat) (m :: Nat) (stY :: Nat) (stX :: Nat) a b.
(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)
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 :: 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 = (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 :: 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 = (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 :: 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
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 :: forall i (n :: Nat) a (m :: Nat).
(Enum i, KnownNat n) =>
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
xs!!)
{-# INLINE backpermute #-}
scatter :: (Enum i, KnownNat n, KnownNat m)
=> Vec n a
-> Vec m i
-> Vec (m + k) a
-> Vec n a
scatter :: forall i (n :: Nat) (m :: Nat) a (k :: Nat).
(Enum i, KnownNat n, KnownNat m) =>
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 :: forall i (n :: Nat) a (m :: Nat).
(Enum i, KnownNat n) =>
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
xs!!)
{-# INLINE gather #-}
interleave :: KnownNat n
=> SNat d
-> Vec (n * d) a
-> Vec (d * n) a
interleave :: forall (n :: Nat) (d :: Nat) a.
KnownNat n =>
SNat d -> Vec (n * d) a -> Vec (d * n) a
interleave d :: SNat d
d@SNat d
SNat = 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 :: forall i (n :: Nat) a.
(Enum i, KnownNat n) =>
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 !!) (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 :: forall i (n :: Nat) a.
(Enum i, KnownNat n) =>
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 !!) (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 :: forall (n :: Nat) a (d :: Nat).
KnownNat n =>
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 :: forall (k :: Nat) a. Integer -> Vec k a -> Vec k a
go Integer
_ Vec k a
Nil = Vec k a
Vec 0 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)
{-# CLASH_OPAQUE rotateLeftS #-}
{-# ANN rotateLeftS hasBlackBox #-}
rotateRightS :: KnownNat n
=> Vec n a
-> SNat d
-> Vec n a
rotateRightS :: forall (n :: Nat) a (d :: Nat).
KnownNat n =>
Vec n a -> SNat d -> Vec n a
rotateRightS Vec n a
xs SNat d
d = Integer -> Vec n a -> Vec n a
forall {p} {a :: Nat} {b}. (Eq p, Num p) => p -> 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 :: p -> Vec a b -> Vec a b
go p
_ Vec a b
Nil = Vec a b
Vec 0 b
forall a. Vec 0 a
Nil
go p
0 Vec a b
ys = Vec a b
ys
go p
n ys :: Vec a b
ys@(Cons b
_ Vec n b
_) = p -> Vec a b -> Vec a b
go (p
np -> p -> p
forall a. Num a => a -> a -> a
-p
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)
{-# CLASH_OPAQUE rotateRightS #-}
{-# ANN rotateRightS hasBlackBox #-}
toList :: Vec n a -> [a]
toList :: forall (n :: Nat) a. 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 :: forall (n :: Nat) a. KnownNat n => [a] -> Maybe (Vec n a)
fromList [a]
xs
| Integer -> [a] -> Bool
forall {t} {a}. (Eq t, Num t) => t -> [a] -> Bool
exactLength (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 a. [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
{-# CLASH_OPAQUE fromList #-}
{-# ANN fromList dontTranslate #-}
unsafeFromList :: forall n a. (KnownNat n) => [a] -> Vec n a
unsafeFromList :: forall (n :: Nat) a. KnownNat n => [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, [])
{-# CLASH_OPAQUE unsafeFromList #-}
{-# ANN unsafeFromList dontTranslate #-}
listToVecTH :: Lift a => [a] -> ExpQ
listToVecTH :: forall a. Lift a => [a] -> ExpQ
listToVecTH [] = [| Nil |]
listToVecTH (a
x:[a]
xs) = [| x :> $([a] -> ExpQ
forall a. Lift a => [a] -> ExpQ
listToVecTH [a]
xs) |]
asNatProxy :: Vec n a -> Proxy n
asNatProxy :: forall (n :: Nat) a. 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 :: forall (n :: Nat) a. KnownNat n => 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 :: forall (n :: Nat) a. KnownNat n => 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' :: forall (n :: Nat) a. Vec n () -> Vec n a -> Vec n a
lazyV' Vec n ()
Nil Vec n a
_ = Vec n a
Vec 0 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)
{-# CLASH_OPAQUE lazyV #-}
{-# ANN lazyV hasBlackBox #-}
dfold :: forall p k a . KnownNat k
=> Proxy (p :: TyFun Nat Type -> Type)
-> (forall n . n + 1 <= k => SNat n -> a -> (p @@ n) -> (p @@ (n + 1)))
-> (p @@ 0)
-> Vec k a
-> (p @@ k)
dfold :: forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold Proxy p
_ forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1)
f p @@ 0
z Vec k a
xs = SNat k -> Vec k a -> Apply p k
forall (n :: Nat). (n <= k) => 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 :: n <= k => SNat n -> Vec n a -> (p @@ n)
go :: forall (n :: Nat). (n <= k) => SNat n -> Vec n a -> p @@ n
go SNat n
_ Vec n a
Nil = Apply 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 (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1)
f SNat n
s' a
y (SNat n -> Vec n a -> p @@ n
forall (n :: Nat). (n <= k) => SNat n -> Vec n a -> p @@ n
go SNat n
s' Vec n a
ys)
{-# CLASH_OPAQUE dfold #-}
{-# ANN dfold hasBlackBox #-}
dtfold :: forall p k a . KnownNat k
=> Proxy (p :: TyFun Nat Type -> Type)
-> (a -> (p @@ 0))
-> (forall n . SNat n -> (p @@ n) -> (p @@ n) -> (p @@ (n + 1)))
-> Vec (2^k) a
-> (p @@ k)
dtfold :: forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (a -> p @@ 0)
-> (forall (n :: Nat).
SNat n -> (p @@ n) -> (p @@ n) -> p @@ (n + 1))
-> Vec (2 ^ k) a
-> p @@ k
dtfold Proxy p
_ a -> p @@ 0
f forall (n :: Nat). SNat n -> (p @@ n) -> (p @@ n) -> p @@ (n + 1)
g = SNat k -> Vec (2 ^ k) a -> Apply 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 :: forall (n :: Nat). 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 (n :: Nat). SNat n -> (p @@ n) -> (p @@ n) -> p @@ (n + 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)
#if !MIN_VERSION_base(4,16,0) || MIN_VERSION_base(4,17,0)
go SNat n
_ Vec (2 ^ n) a
Nil =
case (Dict
(Assert
(OrdCond (CmpNat 1 (2 ^ m)) 'True 'True 'False) (TypeError ...))
-> Proxy m
-> Dict
(Assert
(OrdCond (CmpNat 1 (2 ^ m)) 'True 'True 'False) (TypeError ...))
forall a b. a -> b -> a
const Dict
(Assert
(OrdCond (CmpNat 1 (2 ^ m)) 'True 'True 'False) (TypeError ...))
forall (a :: Constraint). a => Dict a
Dict :: forall m. Proxy m -> Dict (1 <= 2 ^ m)) (forall (t :: Nat). Proxy t
forall {k} (t :: k). Proxy t
Proxy @n) of
{}
#endif
{-# CLASH_OPAQUE 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 n . SNat n -> a -> Vec n b -> Vec (n + 1) b)
-> Vec k a
-> Vec k b
vfold :: forall (k :: Nat) a b.
KnownNat k =>
(forall (n :: Nat). SNat n -> a -> Vec n b -> Vec (n + 1) b)
-> Vec k a -> Vec k b
vfold forall (n :: Nat). SNat n -> a -> Vec n b -> Vec (n + 1) b
f Vec k a
xs = Proxy (VCons b)
-> (forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (VCons b @@ n) -> VCons b @@ (n + 1))
-> (VCons b @@ 0)
-> Vec k a
-> VCons b @@ k
forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold (forall {k} (t :: k). Proxy t
forall (t :: TyFun Nat Type -> Type). Proxy t
Proxy @(VCons b)) SNat n -> a -> Apply (VCons b) n -> Apply (VCons b) (n + 1)
SNat n -> a -> Vec n b -> Vec (n + 1) b
forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (VCons b @@ n) -> VCons b @@ (n + 1)
forall (n :: Nat). SNat n -> a -> Vec n b -> Vec (n + 1) b
f VCons b @@ 0
Vec 0 b
forall a. Vec 0 a
Nil Vec k a
xs
{-# INLINE vfold #-}
maximum ::
Ord a =>
Vec (n + 1) a ->
a
maximum :: forall a (n :: Nat). Ord a => Vec (n + 1) a -> a
maximum = (a -> a -> a) -> Vec (n + 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 ::
Ord a =>
Vec (n + 1) a ->
a
minimum :: forall a (n :: Nat). Ord a => Vec (n + 1) a -> a
minimum = (a -> a -> a) -> Vec (n + 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)
smap :: forall k a b . KnownNat k => (forall n . SNat n -> a -> b) -> Vec k a -> Vec k b
smap :: forall (k :: Nat) a b.
KnownNat k =>
(forall (n :: Nat). SNat n -> a -> b) -> Vec k a -> Vec k b
smap forall (n :: Nat). SNat n -> 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 (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (VCons b @@ n) -> VCons b @@ (n + 1))
-> (VCons b @@ 0)
-> Vec k a
-> VCons b @@ k
forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold (forall {k} (t :: k). Proxy t
forall (t :: TyFun Nat Type -> Type). Proxy t
Proxy @(VCons b))
(\SNat n
sn a
x VCons b @@ n
xs' -> SNat n -> a -> b
forall (n :: Nat). SNat n -> a -> b
f SNat n
sn a
x b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> VCons b @@ n
Vec n b
xs')
VCons b @@ 0
Vec 0 b
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 #-}
smapWithBounds ::
forall k a b .
KnownNat k =>
(forall n . n + 1 <= k => SNat n -> a -> b) ->
Vec k a ->
Vec k b
smapWithBounds :: forall (k :: Nat) a b.
KnownNat k =>
(forall (n :: Nat). ((n + 1) <= k) => SNat n -> a -> b)
-> Vec k a -> Vec k b
smapWithBounds forall (n :: Nat). ((n + 1) <= k) => SNat n -> 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 (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (VCons b @@ n) -> VCons b @@ (n + 1))
-> (VCons b @@ 0)
-> Vec k a
-> VCons b @@ k
forall (p :: TyFun Nat Type -> Type) (k :: Nat) a.
KnownNat k =>
Proxy p
-> (forall (n :: Nat).
((n + 1) <= k) =>
SNat n -> a -> (p @@ n) -> p @@ (n + 1))
-> (p @@ 0)
-> Vec k a
-> p @@ k
dfold (forall {k} (t :: k). Proxy t
forall (t :: TyFun Nat Type -> Type). Proxy t
Proxy @(VCons b))
(\SNat n
sn a
x VCons b @@ n
xs' -> SNat n -> a -> b
forall (n :: Nat). ((n + 1) <= k) => SNat n -> a -> b
f SNat n
sn a
x b -> Vec n b -> Vec (n + 1) b
forall a (n :: Nat). a -> Vec n a -> Vec (n + 1) a
:> VCons b @@ n
Vec n b
xs')
VCons b @@ 0
Vec 0 b
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 smapWithBounds #-}
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# :: forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
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 :: forall (p :: Nat).
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 Nat
accMsk Nat
accVal) ((BV Nat
xMsk Nat
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 (forall (t :: Nat). Proxy t
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 (Nat -> Nat -> BitVector (n * m)
forall (n :: Nat). Nat -> Nat -> BitVector n
BV (Nat -> Int -> Nat
forall a. Bits a => a -> Int -> a
shiftL Nat
accMsk Int
sh Nat -> Nat -> Nat
forall a. Bits a => a -> a -> a
.|. Nat
xMsk) (Nat -> Int -> Nat
forall a. Bits a => a -> Int -> a
shiftL Nat
accVal Int
sh Nat -> Nat -> Nat
forall a. Bits a => a -> a -> a
.|. Nat
xVal)) Vec n (BitVector m)
xs
{-# CLASH_OPAQUE concatBitVector# #-}
{-# ANN concatBitVector# hasBlackBox #-}
unconcatBitVector#
:: forall n m
. (KnownNat n, KnownNat m)
=> BitVector (n * m)
-> Vec n (BitVector m)
unconcatBitVector# :: forall (n :: Nat) (m :: Nat).
(KnownNat n, KnownNat m) =>
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 (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 :: forall (p :: Nat).
(p <= n) =>
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)
Vec 0 (BitVector m)
forall a. Vec 0 a
Nil)
go (USucc (UNat (p - 1)
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 - p) * m) + m)
-> (BitVector ((n - p) * m), BitVector m))
-> BitVector (((n - p) * m) + m)
-> (BitVector ((n - p) * m), BitVector m)
forall a. a -> a
GHC.Magic.noinline BitVector (((n - p) * m) + m)
-> (BitVector ((n - p) * m), BitVector m)
forall (n :: Nat) (m :: Nat).
KnownNat n =>
BitVector (m + n) -> (BitVector m, BitVector n)
split#) BitVector (((n - p) * m) + m)
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)
{-# CLASH_OPAQUE unconcatBitVector# #-}
{-# ANN unconcatBitVector# hasBlackBox #-}
bv2v :: KnownNat n => BitVector n -> Vec n Bit
bv2v :: forall (n :: Nat). KnownNat n => BitVector n -> Vec n Bit
bv2v = BitVector n -> Vec n Bit
BitVector (BitSize (Vec n Bit)) -> Vec n Bit
forall a. BitPack a => BitVector (BitSize a) -> a
unpack
v2bv :: KnownNat n => Vec n Bit -> BitVector n
v2bv :: forall (n :: Nat). KnownNat n => Vec n Bit -> BitVector n
v2bv = Vec n Bit -> BitVector n
Vec n Bit -> BitVector (BitSize (Vec n Bit))
forall a. BitPack a => a -> BitVector (BitSize a)
pack
seqV
:: KnownNat n
=> Vec n a
-> b
-> b
seqV :: forall (n :: Nat) a b. KnownNat n => Vec n a -> b -> b
seqV Vec n a
v b
b =
let s :: () -> a -> ()
s () a
e = a -> () -> ()
forall a b. a -> b -> b
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
forall a b. a -> b -> b
`seq` b
b
{-# CLASH_OPAQUE seqV #-}
{-# ANN seqV hasBlackBox #-}
infixr 0 `seqV`
forceV
:: KnownNat n
=> Vec n a
-> Vec n a
forceV :: forall (n :: Nat) a. KnownNat n => 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 :: forall (n :: Nat) a b. KnownNat n => 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
{-# CLASH_OPAQUE seqVX #-}
{-# ANN seqVX hasBlackBox #-}
infixr 0 `seqVX`
forceVX
:: KnownNat n
=> Vec n a
-> Vec n a
forceVX :: forall (n :: Nat) a. KnownNat n => 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 :: forall (m :: Type -> Type). Quote m => Vec n a -> m Exp
lift Vec n a
Nil = [| Nil |]
lift (a
x `Cons` Vec n a
xs) = [| x `Cons` $(Vec n a -> m Exp
forall t (m :: Type -> Type). (Lift t, Quote m) => t -> m Exp
forall (m :: Type -> Type). Quote m => Vec n a -> m Exp
lift Vec n a
xs) |]
#if MIN_VERSION_template_haskell(2,16,0)
liftTyped :: forall (m :: Type -> Type). Quote m => Vec n a -> Code m (Vec n a)
liftTyped = Vec n a -> Code m (Vec n a)
forall a (m :: Type -> Type). (Lift a, Quote m) => a -> Code m 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 a b. (a -> b) -> Vec n a -> Vec n b
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 :: forall b. Vec n a -> Gen b -> Gen b
coarbitrary = [a] -> Gen b -> Gen b
forall b. [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))
instance KnownNat n => Distributive (Vec n) where
distribute :: forall (f :: Type -> Type) a.
Functor f =>
f (Vec n a) -> Vec n (f a)
distribute f (Vec n a)
fxs = (Rep (Vec n) -> f a) -> Vec n (f a)
forall a. (Rep (Vec n) -> a) -> Vec n a
forall (f :: Type -> Type) a.
Representable f =>
(Rep f -> a) -> f a
tabulate ((Rep (Vec n) -> f a) -> Vec n (f a))
-> (Rep (Vec n) -> f a) -> Vec n (f a)
forall a b. (a -> b) -> a -> b
$ \Rep (Vec n)
i -> (Vec n a -> a) -> f (Vec n a) -> f a
forall a b. (a -> b) -> f a -> f b
forall (f :: Type -> Type) a b. Functor f => (a -> b) -> f a -> f b
fmap (Vec n a -> Rep (Vec n) -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
!! Rep (Vec n)
i) f (Vec n a)
fxs
{-# INLINE distribute #-}
instance KnownNat n => Representable (Vec n) where
type Rep (Vec n) = Index n
tabulate :: forall a. (Rep (Vec n) -> a) -> Vec n a
tabulate Rep (Vec n) -> a
f = (Index n -> a) -> Vec n (Index n) -> Vec n a
forall a b (n :: Nat). (a -> b) -> Vec n a -> Vec n b
map Rep (Vec n) -> a
Index n -> a
f Vec n (Index n)
forall (n :: Nat). KnownNat n => Vec n (Index n)
indicesI
{-# INLINE tabulate #-}
index :: forall a. Vec n a -> Rep (Vec n) -> a
index = Vec n a -> Rep (Vec n) -> a
Vec n a -> Index n -> a
forall (n :: Nat) i a. (KnownNat n, Enum i) => Vec n a -> i -> a
(!!)
{-# INLINE index #-}