module Lava.Vector
( vempty
, (+>)
, (<+)
, velems
, vsize
, sized
, vec
, vecOf
, ofSize
, sameSize
, vecn
, vextend
, vsingle
, vhead
, vtail
, vlast
, vinit
, vlength
, vmap
, vzipWith
, vreverse
, vfoldl
, vfoldr
, vmapAccumL
, vmapAccumR
, (<++>)
, vconcat
, vat
, vtake
, vdrop
, vsplitAt
, vgroup
, vtranspose
, vshr
, vshl
, vreplicate
, vrepeat
, vsequence
, vrigid
, N0, N1, N2, N3
, N4, N5, N6, N7
, N8, N9, N10, N11
, N12, N13, N14, N15
, N16, N17, N18, N19
, N20, N21, N22, N23
, N24, N25, N26, N27
, N28, N29, N30, N31
, N32, N33, N34, N35
, N36, N37, N38, N39
, N40, N41, N42, N43
, N44, N45, N46, N47
, N48, N49, N50, N51
, N52, N53, N54, N55
, N56, N57, N58, N59
, N60, N61, N62, N63
, N64, N65, N66, N67
, N68, N69, N70, N71
, N72, N73, N74, N75
, N76, N77, N78, N79
, N80, N81, N82, N83
, N84, N85, N86, N87
, N88, N89, N90, N91
, N92, N93, N94, N95
, N96, N97, N98, N99
, N100, N101, N102, N103
, N104, N105, N106, N107
, N108, N109, N110, N111
, N112, N113, N114, N115
, N116, N117, N118, N119
, N120, N121, N122, N123
, N124, N125, N126, N127
, N128, N129, N130, N131
, N132, N133, N134, N135
, N136, N137, N138, N139
, N140, N141, N142, N143
, N144, N145, N146, N147
, N148, N149, N150, N151
, N152, N153, N154, N155
, N156, N157, N158, N159
, N160, N161, N162, N163
, N164, N165, N166, N167
, N168, N169, N170, N171
, N172, N173, N174, N175
, N176, N177, N178, N179
, N180, N181, N182, N183
, N184, N185, N186, N187
, N188, N189, N190, N191
, N192, N193, N194, N195
, N196, N197, N198, N199
, N200, N201, N202, N203
, N204, N205, N206, N207
, N208, N209, N210, N211
, N212, N213, N214, N215
, N216, N217, N218, N219
, N220, N221, N222, N223
, N224, N225, N226, N227
, N228, N229, N230, N231
, N232, N233, N234, N235
, N236, N237, N238, N239
, N240, N241, N242, N243
, N244, N245, N246, N247
, N248, N249, N250, N251
, N252, N253, N254, N255
, n0, n1, n2, n3
, n4, n5, n6, n7
, n8, n9, n10, n11
, n12, n13, n14, n15
, n16, n17, n18, n19
, n20, n21, n22, n23
, n24, n25, n26, n27
, n28, n29, n30, n31
, n32, n33, n34, n35
, n36, n37, n38, n39
, n40, n41, n42, n43
, n44, n45, n46, n47
, n48, n49, n50, n51
, n52, n53, n54, n55
, n56, n57, n58, n59
, n60, n61, n62, n63
, n64, n65, n66, n67
, n68, n69, n70, n71
, n72, n73, n74, n75
, n76, n77, n78, n79
, n80, n81, n82, n83
, n84, n85, n86, n87
, n88, n89, n90, n91
, n92, n93, n94, n95
, n96, n97, n98, n99
, n100, n101, n102, n103
, n104, n105, n106, n107
, n108, n109, n110, n111
, n112, n113, n114, n115
, n116, n117, n118, n119
, n120, n121, n122, n123
, n124, n125, n126, n127
, n128, n129, n130, n131
, n132, n133, n134, n135
, n136, n137, n138, n139
, n140, n141, n142, n143
, n144, n145, n146, n147
, n148, n149, n150, n151
, n152, n153, n154, n155
, n156, n157, n158, n159
, n160, n161, n162, n163
, n164, n165, n166, n167
, n168, n169, n170, n171
, n172, n173, n174, n175
, n176, n177, n178, n179
, n180, n181, n182, n183
, n184, n185, n186, n187
, n188, n189, n190, n191
, n192, n193, n194, n195
, n196, n197, n198, n199
, n200, n201, n202, n203
, n204, n205, n206, n207
, n208, n209, n210, n211
, n212, n213, n214, n215
, n216, n217, n218, n219
, n220, n221, n222, n223
, n224, n225, n226, n227
, n228, n229, n230, n231
, n232, n233, n234, n235
, n236, n237, n238, n239
, n240, n241, n242, n243
, n244, n245, n246, n247
, n248, n249, n250, n251
, n252, n253, n254, n255
, Z(), S()
, Vec(Vec)
, N(value)
, Add
, Mul
, Less
) where
import Data.List
import Monad
data Z = Z
data S a = S a
type N0 = Z
type N1 = S N0
type N2 = S N1
type N3 = S N2
type N4 = S N3
type N5 = S N4
type N6 = S N5
type N7 = S N6
type N8 = S N7
type N9 = S N8
type N10 = S N9
type N11 = S N10
type N12 = S N11
type N13 = S N12
type N14 = S N13
type N15 = S N14
type N16 = S N15
type N17 = S N16
type N18 = S N17
type N19 = S N18
type N20 = S N19
type N21 = S N20
type N22 = S N21
type N23 = S N22
type N24 = S N23
type N25 = S N24
type N26 = S N25
type N27 = S N26
type N28 = S N27
type N29 = S N28
type N30 = S N29
type N31 = S N30
type N32 = S N31
type N33 = S N32
type N34 = S N33
type N35 = S N34
type N36 = S N35
type N37 = S N36
type N38 = S N37
type N39 = S N38
type N40 = S N39
type N41 = S N40
type N42 = S N41
type N43 = S N42
type N44 = S N43
type N45 = S N44
type N46 = S N45
type N47 = S N46
type N48 = S N47
type N49 = S N48
type N50 = S N49
type N51 = S N50
type N52 = S N51
type N53 = S N52
type N54 = S N53
type N55 = S N54
type N56 = S N55
type N57 = S N56
type N58 = S N57
type N59 = S N58
type N60 = S N59
type N61 = S N60
type N62 = S N61
type N63 = S N62
type N64 = S N63
type N65 = S N64
type N66 = S N65
type N67 = S N66
type N68 = S N67
type N69 = S N68
type N70 = S N69
type N71 = S N70
type N72 = S N71
type N73 = S N72
type N74 = S N73
type N75 = S N74
type N76 = S N75
type N77 = S N76
type N78 = S N77
type N79 = S N78
type N80 = S N79
type N81 = S N80
type N82 = S N81
type N83 = S N82
type N84 = S N83
type N85 = S N84
type N86 = S N85
type N87 = S N86
type N88 = S N87
type N89 = S N88
type N90 = S N89
type N91 = S N90
type N92 = S N91
type N93 = S N92
type N94 = S N93
type N95 = S N94
type N96 = S N95
type N97 = S N96
type N98 = S N97
type N99 = S N98
type N100 = S N99
type N101 = S N100
type N102 = S N101
type N103 = S N102
type N104 = S N103
type N105 = S N104
type N106 = S N105
type N107 = S N106
type N108 = S N107
type N109 = S N108
type N110 = S N109
type N111 = S N110
type N112 = S N111
type N113 = S N112
type N114 = S N113
type N115 = S N114
type N116 = S N115
type N117 = S N116
type N118 = S N117
type N119 = S N118
type N120 = S N119
type N121 = S N120
type N122 = S N121
type N123 = S N122
type N124 = S N123
type N125 = S N124
type N126 = S N125
type N127 = S N126
type N128 = S N127
type N129 = S N128
type N130 = S N129
type N131 = S N130
type N132 = S N131
type N133 = S N132
type N134 = S N133
type N135 = S N134
type N136 = S N135
type N137 = S N136
type N138 = S N137
type N139 = S N138
type N140 = S N139
type N141 = S N140
type N142 = S N141
type N143 = S N142
type N144 = S N143
type N145 = S N144
type N146 = S N145
type N147 = S N146
type N148 = S N147
type N149 = S N148
type N150 = S N149
type N151 = S N150
type N152 = S N151
type N153 = S N152
type N154 = S N153
type N155 = S N154
type N156 = S N155
type N157 = S N156
type N158 = S N157
type N159 = S N158
type N160 = S N159
type N161 = S N160
type N162 = S N161
type N163 = S N162
type N164 = S N163
type N165 = S N164
type N166 = S N165
type N167 = S N166
type N168 = S N167
type N169 = S N168
type N170 = S N169
type N171 = S N170
type N172 = S N171
type N173 = S N172
type N174 = S N173
type N175 = S N174
type N176 = S N175
type N177 = S N176
type N178 = S N177
type N179 = S N178
type N180 = S N179
type N181 = S N180
type N182 = S N181
type N183 = S N182
type N184 = S N183
type N185 = S N184
type N186 = S N185
type N187 = S N186
type N188 = S N187
type N189 = S N188
type N190 = S N189
type N191 = S N190
type N192 = S N191
type N193 = S N192
type N194 = S N193
type N195 = S N194
type N196 = S N195
type N197 = S N196
type N198 = S N197
type N199 = S N198
type N200 = S N199
type N201 = S N200
type N202 = S N201
type N203 = S N202
type N204 = S N203
type N205 = S N204
type N206 = S N205
type N207 = S N206
type N208 = S N207
type N209 = S N208
type N210 = S N209
type N211 = S N210
type N212 = S N211
type N213 = S N212
type N214 = S N213
type N215 = S N214
type N216 = S N215
type N217 = S N216
type N218 = S N217
type N219 = S N218
type N220 = S N219
type N221 = S N220
type N222 = S N221
type N223 = S N222
type N224 = S N223
type N225 = S N224
type N226 = S N225
type N227 = S N226
type N228 = S N227
type N229 = S N228
type N230 = S N229
type N231 = S N230
type N232 = S N231
type N233 = S N232
type N234 = S N233
type N235 = S N234
type N236 = S N235
type N237 = S N236
type N238 = S N237
type N239 = S N238
type N240 = S N239
type N241 = S N240
type N242 = S N241
type N243 = S N242
type N244 = S N243
type N245 = S N244
type N246 = S N245
type N247 = S N246
type N248 = S N247
type N249 = S N248
type N250 = S N249
type N251 = S N250
type N252 = S N251
type N253 = S N252
type N254 = S N253
type N255 = S N254
n0 :: N0
n0 = Z
n1 :: N1
n1 = S n0
n2 :: N2
n2 = S n1
n3 :: N3
n3 = S n2
n4 :: N4
n4 = S n3
n5 :: N5
n5 = S n4
n6 :: N6
n6 = S n5
n7 :: N7
n7 = S n6
n8 :: N8
n8 = S n7
n9 :: N9
n9 = S n8
n10 :: N10
n10 = S n9
n11 :: N11
n11 = S n10
n12 :: N12
n12 = S n11
n13 :: N13
n13 = S n12
n14 :: N14
n14 = S n13
n15 :: N15
n15 = S n14
n16 :: N16
n16 = S n15
n17 :: N17
n17 = S n16
n18 :: N18
n18 = S n17
n19 :: N19
n19 = S n18
n20 :: N20
n20 = S n19
n21 :: N21
n21 = S n20
n22 :: N22
n22 = S n21
n23 :: N23
n23 = S n22
n24 :: N24
n24 = S n23
n25 :: N25
n25 = S n24
n26 :: N26
n26 = S n25
n27 :: N27
n27 = S n26
n28 :: N28
n28 = S n27
n29 :: N29
n29 = S n28
n30 :: N30
n30 = S n29
n31 :: N31
n31 = S n30
n32 :: N32
n32 = S n31
n33 :: N33
n33 = S n32
n34 :: N34
n34 = S n33
n35 :: N35
n35 = S n34
n36 :: N36
n36 = S n35
n37 :: N37
n37 = S n36
n38 :: N38
n38 = S n37
n39 :: N39
n39 = S n38
n40 :: N40
n40 = S n39
n41 :: N41
n41 = S n40
n42 :: N42
n42 = S n41
n43 :: N43
n43 = S n42
n44 :: N44
n44 = S n43
n45 :: N45
n45 = S n44
n46 :: N46
n46 = S n45
n47 :: N47
n47 = S n46
n48 :: N48
n48 = S n47
n49 :: N49
n49 = S n48
n50 :: N50
n50 = S n49
n51 :: N51
n51 = S n50
n52 :: N52
n52 = S n51
n53 :: N53
n53 = S n52
n54 :: N54
n54 = S n53
n55 :: N55
n55 = S n54
n56 :: N56
n56 = S n55
n57 :: N57
n57 = S n56
n58 :: N58
n58 = S n57
n59 :: N59
n59 = S n58
n60 :: N60
n60 = S n59
n61 :: N61
n61 = S n60
n62 :: N62
n62 = S n61
n63 :: N63
n63 = S n62
n64 :: N64
n64 = S n63
n65 :: N65
n65 = S n64
n66 :: N66
n66 = S n65
n67 :: N67
n67 = S n66
n68 :: N68
n68 = S n67
n69 :: N69
n69 = S n68
n70 :: N70
n70 = S n69
n71 :: N71
n71 = S n70
n72 :: N72
n72 = S n71
n73 :: N73
n73 = S n72
n74 :: N74
n74 = S n73
n75 :: N75
n75 = S n74
n76 :: N76
n76 = S n75
n77 :: N77
n77 = S n76
n78 :: N78
n78 = S n77
n79 :: N79
n79 = S n78
n80 :: N80
n80 = S n79
n81 :: N81
n81 = S n80
n82 :: N82
n82 = S n81
n83 :: N83
n83 = S n82
n84 :: N84
n84 = S n83
n85 :: N85
n85 = S n84
n86 :: N86
n86 = S n85
n87 :: N87
n87 = S n86
n88 :: N88
n88 = S n87
n89 :: N89
n89 = S n88
n90 :: N90
n90 = S n89
n91 :: N91
n91 = S n90
n92 :: N92
n92 = S n91
n93 :: N93
n93 = S n92
n94 :: N94
n94 = S n93
n95 :: N95
n95 = S n94
n96 :: N96
n96 = S n95
n97 :: N97
n97 = S n96
n98 :: N98
n98 = S n97
n99 :: N99
n99 = S n98
n100 :: N100
n100 = S n99
n101 :: N101
n101 = S n100
n102 :: N102
n102 = S n101
n103 :: N103
n103 = S n102
n104 :: N104
n104 = S n103
n105 :: N105
n105 = S n104
n106 :: N106
n106 = S n105
n107 :: N107
n107 = S n106
n108 :: N108
n108 = S n107
n109 :: N109
n109 = S n108
n110 :: N110
n110 = S n109
n111 :: N111
n111 = S n110
n112 :: N112
n112 = S n111
n113 :: N113
n113 = S n112
n114 :: N114
n114 = S n113
n115 :: N115
n115 = S n114
n116 :: N116
n116 = S n115
n117 :: N117
n117 = S n116
n118 :: N118
n118 = S n117
n119 :: N119
n119 = S n118
n120 :: N120
n120 = S n119
n121 :: N121
n121 = S n120
n122 :: N122
n122 = S n121
n123 :: N123
n123 = S n122
n124 :: N124
n124 = S n123
n125 :: N125
n125 = S n124
n126 :: N126
n126 = S n125
n127 :: N127
n127 = S n126
n128 :: N128
n128 = S n127
n129 :: N129
n129 = S n128
n130 :: N130
n130 = S n129
n131 :: N131
n131 = S n130
n132 :: N132
n132 = S n131
n133 :: N133
n133 = S n132
n134 :: N134
n134 = S n133
n135 :: N135
n135 = S n134
n136 :: N136
n136 = S n135
n137 :: N137
n137 = S n136
n138 :: N138
n138 = S n137
n139 :: N139
n139 = S n138
n140 :: N140
n140 = S n139
n141 :: N141
n141 = S n140
n142 :: N142
n142 = S n141
n143 :: N143
n143 = S n142
n144 :: N144
n144 = S n143
n145 :: N145
n145 = S n144
n146 :: N146
n146 = S n145
n147 :: N147
n147 = S n146
n148 :: N148
n148 = S n147
n149 :: N149
n149 = S n148
n150 :: N150
n150 = S n149
n151 :: N151
n151 = S n150
n152 :: N152
n152 = S n151
n153 :: N153
n153 = S n152
n154 :: N154
n154 = S n153
n155 :: N155
n155 = S n154
n156 :: N156
n156 = S n155
n157 :: N157
n157 = S n156
n158 :: N158
n158 = S n157
n159 :: N159
n159 = S n158
n160 :: N160
n160 = S n159
n161 :: N161
n161 = S n160
n162 :: N162
n162 = S n161
n163 :: N163
n163 = S n162
n164 :: N164
n164 = S n163
n165 :: N165
n165 = S n164
n166 :: N166
n166 = S n165
n167 :: N167
n167 = S n166
n168 :: N168
n168 = S n167
n169 :: N169
n169 = S n168
n170 :: N170
n170 = S n169
n171 :: N171
n171 = S n170
n172 :: N172
n172 = S n171
n173 :: N173
n173 = S n172
n174 :: N174
n174 = S n173
n175 :: N175
n175 = S n174
n176 :: N176
n176 = S n175
n177 :: N177
n177 = S n176
n178 :: N178
n178 = S n177
n179 :: N179
n179 = S n178
n180 :: N180
n180 = S n179
n181 :: N181
n181 = S n180
n182 :: N182
n182 = S n181
n183 :: N183
n183 = S n182
n184 :: N184
n184 = S n183
n185 :: N185
n185 = S n184
n186 :: N186
n186 = S n185
n187 :: N187
n187 = S n186
n188 :: N188
n188 = S n187
n189 :: N189
n189 = S n188
n190 :: N190
n190 = S n189
n191 :: N191
n191 = S n190
n192 :: N192
n192 = S n191
n193 :: N193
n193 = S n192
n194 :: N194
n194 = S n193
n195 :: N195
n195 = S n194
n196 :: N196
n196 = S n195
n197 :: N197
n197 = S n196
n198 :: N198
n198 = S n197
n199 :: N199
n199 = S n198
n200 :: N200
n200 = S n199
n201 :: N201
n201 = S n200
n202 :: N202
n202 = S n201
n203 :: N203
n203 = S n202
n204 :: N204
n204 = S n203
n205 :: N205
n205 = S n204
n206 :: N206
n206 = S n205
n207 :: N207
n207 = S n206
n208 :: N208
n208 = S n207
n209 :: N209
n209 = S n208
n210 :: N210
n210 = S n209
n211 :: N211
n211 = S n210
n212 :: N212
n212 = S n211
n213 :: N213
n213 = S n212
n214 :: N214
n214 = S n213
n215 :: N215
n215 = S n214
n216 :: N216
n216 = S n215
n217 :: N217
n217 = S n216
n218 :: N218
n218 = S n217
n219 :: N219
n219 = S n218
n220 :: N220
n220 = S n219
n221 :: N221
n221 = S n220
n222 :: N222
n222 = S n221
n223 :: N223
n223 = S n222
n224 :: N224
n224 = S n223
n225 :: N225
n225 = S n224
n226 :: N226
n226 = S n225
n227 :: N227
n227 = S n226
n228 :: N228
n228 = S n227
n229 :: N229
n229 = S n228
n230 :: N230
n230 = S n229
n231 :: N231
n231 = S n230
n232 :: N232
n232 = S n231
n233 :: N233
n233 = S n232
n234 :: N234
n234 = S n233
n235 :: N235
n235 = S n234
n236 :: N236
n236 = S n235
n237 :: N237
n237 = S n236
n238 :: N238
n238 = S n237
n239 :: N239
n239 = S n238
n240 :: N240
n240 = S n239
n241 :: N241
n241 = S n240
n242 :: N242
n242 = S n241
n243 :: N243
n243 = S n242
n244 :: N244
n244 = S n243
n245 :: N245
n245 = S n244
n246 :: N246
n246 = S n245
n247 :: N247
n247 = S n246
n248 :: N248
n248 = S n247
n249 :: N249
n249 = S n248
n250 :: N250
n250 = S n249
n251 :: N251
n251 = S n250
n252 :: N252
n252 = S n251
n253 :: N253
n253 = S n252
n254 :: N254
n254 = S n253
n255 :: N255
n255 = S n254
npred :: S a -> a
npred n = undefined
class N a where
value :: a -> Int
instance N Z where
value n = 0
instance N a => N (S a) where
value n = 1 + value (npred n)
class Less a b
instance Less Z (S a)
instance Less a b => Less (S a) (S b)
class Add a b c | a b -> c
instance Add Z b b
instance Add a b c => Add (S a) b (S c)
class Mul a b c | a b -> c
instance Mul Z b Z
instance (Mul a b x, Add x b c) => Mul (S a) b c
newtype Vec n a = Vec [a]
deriving Show
vempty :: Vec Z a
vempty = Vec []
infixr 5 +>
(+>) :: a -> Vec n a -> Vec (S n) a
a +> Vec as = Vec (a:as)
infixl 5 <+
(<+) :: Vec n a -> a -> Vec (S n) a
Vec as <+ a = Vec (as++[a])
velems :: Vec n a -> [a]
velems (Vec as) = as
vsize :: Vec n a -> n
vsize = undefined
sized :: N n => (Int -> Vec n a) -> Vec n a
sized f = let v = f (value $ vsize v) in v
vec :: N n => [a] -> Vec n a
vec as = sized $ \n -> Vec $ take n (as ++ repeat err)
where err = error "Unitialised element in vector"
vecOf :: N n => a -> Vec n a
vecOf a = sized $ \n -> Vec (replicate n a)
ofSize :: Vec n a -> n -> Vec n a
ofSize v n = v
sameSize :: Vec n a -> Vec n a -> Vec n a
sameSize v w = v
vecn :: N n => n -> [a] -> Vec n a
vecn n as = vec as
vextend :: N m => a -> Vec n a -> Vec m a
vextend a (Vec xs) = sized $ \m -> Vec (take m (xs ++ repeat a))
vsingle :: a -> Vec N1 a
vsingle a = Vec [a]
vhead :: Vec (S n) a -> a
vhead (Vec as) = head as
vtail :: Vec (S n) a -> Vec n a
vtail (Vec as) = Vec (tail as)
vlast :: Vec (S n) a -> a
vlast (Vec as) = last as
vinit :: Vec (S n) a -> Vec n a
vinit (Vec as) = Vec (init as)
vlength :: Vec n a -> Int
vlength (Vec as) = length as
vmap :: (a -> b) -> Vec n a -> Vec n b
vmap f (Vec as) = Vec (map f as)
vzipWith :: (a -> b -> c) -> Vec n a -> Vec n b -> Vec n c
vzipWith f (Vec as) (Vec bs) = Vec (zipWith f as bs)
instance Functor (Vec n) where
fmap = vmap
vreverse :: Vec n a -> Vec n a
vreverse (Vec as) = Vec (reverse as)
vfoldl :: (a -> b -> a) -> a -> Vec n b -> a
vfoldl f z (Vec bs) = foldl f z bs
vfoldr :: (a -> b -> b) -> b -> Vec n a -> b
vfoldr f z (Vec as) = foldr f z as
vmapAccumL :: (a -> b -> (a, c)) -> a -> Vec n b -> (a, Vec n c)
vmapAccumL f acc (Vec bs) = (a, Vec cs)
where (a, cs) = mapAccumL f acc bs
vmapAccumR :: (a -> b -> (a, c)) -> a -> Vec n b -> (a, Vec n c)
vmapAccumR f acc (Vec bs) = (a, Vec cs)
where (a, cs) = mapAccumR f acc bs
infixr 5 <++>
(<++>) :: Add n m o => Vec n a -> Vec m a -> Vec o a
Vec as <++> Vec bs = Vec (as ++ bs)
vconcat :: Mul n m o => Vec n (Vec m a) -> Vec o a
vconcat (Vec v) = Vec $ concatMap velems v
vat :: (N n, Less n m) => Vec m a -> n -> a
Vec vs `vat` n = vs !! value n
vtake :: N n => n -> Vec m a -> Vec n a
vtake n (Vec as) = Vec $ take (value n) as
vdrop :: (N n, Add n o m) => n -> Vec m a -> Vec o a
vdrop n (Vec as) = Vec $ drop (value n) as
vsplitAt :: (N m, Add m n o) => m -> Vec o a -> (Vec m a, Vec n a)
vsplitAt m (Vec as) = (Vec bs, Vec cs)
where (bs, cs) = splitAt (value m) as
vgroup :: (N n, Mul n o m) => n -> Vec m a -> Vec o (Vec n a)
vgroup n (Vec as) = Vec $ map Vec $ groupN (value n) as
where groupN n [] = []
groupN n xs = take n xs : groupN n (drop n xs)
vtranspose :: Vec n (Vec m a) -> Vec m (Vec n a)
vtranspose (Vec vs) = Vec $ map Vec $ transpose $ map velems vs
vshr :: a -> Vec n a -> Vec n a
vshr a (Vec as) = Vec (if null as then [] else a:init as)
vshl :: Vec n a -> a -> Vec n a
vshl (Vec as) a = Vec (if null as then [] else tail as ++ [a])
vreplicate :: N n => n -> a -> Vec n a
vreplicate n a = Vec $ replicate (value n) a
vrepeat :: N n => a -> Vec n a
vrepeat a = sized $ \n -> Vec (replicate n a)
vsequence :: Monad m => Vec n (m a) -> m (Vec n a)
vsequence (Vec ms) = liftM Vec (sequence ms)
vrigid :: N n => Vec n a -> Vec n a
vrigid (Vec xs) = sized (\n -> Vec [xs !! i | i <- [0..n1]])