{-# LANGUAGE TypeFamilies, FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}
--
-- | Given an instance of @ScanVectorMachine V' (V S)@, we can produce
-- a type @V''@ and instance @ScanVectorMachine V'' (V' (V S))@. In
-- other words, given an implementation of vectors with some nonzero
-- nesting depth, this will produce an implementation with nesting
-- depth /one level deeper/.
--
-- This is different from @SegmentedVectors@, which uses flat
-- vectors (0-deep nesting) to emulate segmented vectors (1-deep
-- nesting) by cutting the size of the scalars in half. Here, there
-- is no need to assume that the flat-vector scalars are twice as
-- wide (in terms of bits) as the segmented scalars, so arbitrarily
-- deep nesting may be achieved without sacrificing any additional
-- bit-width. In addition, @NestedVectors@ introduces less overhead
-- than @SegmentedVectors@. For this reason, many hardware/platform
-- providers choose to implement @ScanVectorMachine V' (V S)@
-- instead of @ScanVectorMachine (V S)@; this requires more work
-- (more methods to implement), but eliminates the overhead of
-- @SegmentedVectors@.
--
module NestedVectors where
import ScanVectorMachine as SVM
-- private; isomorphic to (,)
data VecPair v = VecPair v v
-- sanity check that the two vectors have identical segment descriptors; if not, raise an error
check_eq a b = a -- FIXME: implement; for now we just trust the user
instance (SVM.ScanVectorMachine v s,
SVM.ScanVectorMachine v' (v s)) =>
SVM.ScanVectorMachine VecPair (v' (v s)) where
neg (VecPair a alens) = undefined
leq (VecPair a alens) (VecPair b blens) = undefined
op o (VecPair a alens) (VecPair b blens) = undefined
select (VecPair b blens) (VecPair x xlens) (VecPair y ylens) = undefined
permute (VecPair a alens) (VecPair i ilens) = undefined
insert (VecPair a alens) pos v = undefined
extract (VecPair a alens) pos = undefined
distribute v len = undefined
length (VecPair a alens) = undefined
scan o (VecPair a alens) = undefined