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