 : simd-with ( rep class x -- simd-array )
     [ rep-components ] [ new ] [ '[ _ ] ] tri* swap replicate-as ; inline
 
-: simd-with-fast? ( rep -- ? )
+: simd-with/nth-fast? ( rep -- ? )
     [ \ (simd-vshuffle) supported-simd-op? ]
     [ rep-component-type can-be-unboxed? ]
     bi and ;

:: define-with-custom-inlining ( word rep class -- )
    word [
        drop
        rep simd-with-fast? [
            [ rep rep-coerce rep (simd-with) class boa ]
        ] [ word def>> ] if
    ] "custom-inlining" set-word-prop ;

: simd-nth-fast? ( rep -- ? )
    [ \ (simd-vshuffle) supported-simd-op? ]
    [ rep-component-type can-be-unboxed? ]
    bi and ;

: simd-nth-fast ( rep -- quot )
    [ rep-components ] keep

    rep-component-type dup c:c-type-getter-boxer c:array-accessor ;

MACRO: simd-nth ( rep -- x )
    dup simd-with/nth-fast? [ simd-nth-fast ] [ simd-nth-slow ] if ;

: boa-effect ( rep n -- effect )
    [ rep-components ] dip *
