--- /dev/null
+USING: math.vectors tools.test kernel ranges arrays ;
+
+{ { 3 12 21 30 } } [ 3 1 10 3 <range> n*v >array ] unit-test
+{ { 3 12 21 30 } } [ 1 10 3 <range> 3 v*n >array ] unit-test
+{ { 4 7 10 13 } } [ 3 1 10 3 <range> n+v >array ] unit-test
+{ { 4 7 10 13 } } [ 1 10 3 <range> 3 v+n >array ] unit-test
+{ { 2 -1 -4 -7 } } [ 3 1 10 3 <range> n-v >array ] unit-test
+{ { -2 1 4 7 } } [ 1 10 3 <range> 3 v-n >array ] unit-test
+{ { 1/3 4/3 7/3 10/3 } } [ 1 10 3 <range> 3 v/n >array ] unit-test
+{ { 6 11 16 21 } } [ 1 10 3 <range> 5 20 2 <range> v+ >array ] unit-test
+{ { -4 -3 -2 -1 } } [ 1 10 3 <range> 5 20 2 <range> v- >array ] unit-test
+
+{ { 3 11/2 8 21/2 } } [ 1 10 3 <range> 5 20 2 <range> vavg >array ] unit-test
+{ { -1 -4 -7 -10 } } [ 1 10 3 <range> vneg >array ] unit-test
--- /dev/null
+! Copyright (C) 2023 Keldan Chapman.
+! See https://factorcode.org/license.txt for BSD license.
+USING: accessors kernel math math.order math.vectors ranges
+ranges.private ;
+IN: math.vectors
+
+M: range vneg >range< [ neg ] tri@ <range> ;
+
+M: range v+n [ >range< ] dip '[ [ _ + ] bi@ ] dip <range> ;
+M: range n+v swap v+n ;
+
+M: range v-n neg v+n ;
+M: range n-v >range< roll '[ [ _ swap - ] bi@ ] dip neg <range> ;
+
+M: range v*n [ >range< ] dip '[ _ * ] tri@ <range> ;
+M: range n*v swap v*n ;
+
+M: range v/n recip v*n ;
+
+M: range v+ over range? [
+ [ [ from>> ] bi@ + ]
+ [ [ length>> ] bi@ min ]
+ [ [ step>> ] bi@ + ] 2tri \ range boa
+ ] [ call-next-method ] if ;
+
+M: range v- >range< [ neg ] tri@ <range> v+ ;
+
+M: range vavg over range?
+ [ v+ 2 v/n ]
+ [ call-next-method ] if ;
! Copyright (C) 2005, 2010 Slava Pestov, Joe Groff.
! See https://factorcode.org/license.txt for BSD license.
USING: arrays assocs combinators grouping kernel math
-math.functions math.libm math.order sequences ;
+math.functions math.libm math.order sequences vocabs.loader ;
QUALIFIED-WITH: alien.c-types c
IN: math.vectors
: angle-between ( v u -- a )
[ normalize ] bi@ hdot acos ;
+
+{ "math.vectors" "ranges" } "math.vectors.ranges" require-when