-- | TODO if we have a table that has min-size @>0@ we need to immediately
-- terminate @addIndexDenseGo@ !

module ADP.Fusion.SynVar.Indices.Unit where

import Data.Proxy
import Data.Vector.Fusion.Stream.Monadic (map,Stream,head,mapM,Step(..))
import Data.Vector.Fusion.Util (delay_inline)
import Prelude hiding (map,head,mapM)

import Data.PrimitiveArray hiding (map)

import ADP.Fusion.Core
import ADP.Fusion.Core.Unit



instance
  ( IndexHdr s x0 i0 us (Unit I) cs c is (Unit I)
  ) => AddIndexDense s (us:.Unit I) (cs:.c) (is:.Unit I) where
  addIndexDenseGo (cs:._) (vs:.IStatic ()) (lbs:._) (ubs:._) (us:._) (is:._)
    = map (\(SvS s t y') -> SvS s (t:.Unit) (y':.:RiU))
    . addIndexDenseGo cs vs lbs ubs us is
  {-# Inline addIndexDenseGo #-}

instance
  ( IndexHdr s x0 i0 us (Unit O) cs c is (Unit O)
  ) => AddIndexDense s (us:.Unit O) (cs:.c) (is:.Unit O) where
  addIndexDenseGo (cs:._) (vs:.OStatic ()) (lbs:.lb) (ubs:.ub) (us:._) (is:._)
    = map (\(SvS s t y') -> SvS s (t:.Unit) (y':.:RiU))
    . addIndexDenseGo cs vs lbs ubs us is
  {-# Inline addIndexDenseGo #-}

instance
  ( IndexHdr s x0 i0 us (Unit I) cs c is (Unit C)
  ) => AddIndexDense s (us:.Unit I) (cs:.c) (is:.Unit C) where
  addIndexDenseGo (cs:._) (vs:.Complemented) (lbs:._) (ubs:._) (us:._) (is:._)
    = map (\(SvS s t y') -> SvS s (t:.Unit) (y':.:RiU))
    . addIndexDenseGo cs vs lbs ubs us is
  {-# Inline addIndexDenseGo #-}

instance
  ( IndexHdr s x0 i0 us (Unit O) cs c is (Unit C)
  ) => AddIndexDense s (us:.Unit O) (cs:.c) (is:.Unit C) where
  addIndexDenseGo (cs:._) (vs:.Complemented) (lbs:._) (ubs:._) (us:._) (is:._)
    = map (\(SvS s t y') -> SvS s (t:.Unit) (y':.:RiU))
    . addIndexDenseGo cs vs lbs ubs us is
  {-# Inline addIndexDenseGo #-}