module SegSum
where

import Data.Array.Parallel.Unlifted

test :: SUArr Int -> UArr Int
test =   sndS
       . loopArr
       . loopSU (\a x -> ((a + x::Int) :*: (Nothing::Maybe ())))
		(\a i -> (a :*: Just a)) 0

{- Inner loop:

     $wtrans_s19S :: GHC.Prim.Int#
		     -> GHC.Prim.Int#
		     -> GHC.Prim.Int#
		     -> GHC.Prim.Int#
		     -> GHC.Prim.Int#
		     -> GHC.Prim.State# s_aLn
		     -> (# GHC.Prim.State# s_aLn, (GHC.Base.Int, GHC.Base.Int) #)
     [Arity 6
      Str: DmdType LLLLLL]
     $wtrans_s19S =
       \ (ww_s18Y :: GHC.Prim.Int#)
	 (ww1_s192 :: GHC.Prim.Int#)
	 (ww2_s196 :: GHC.Prim.Int#)
	 (ww3_s19a :: GHC.Prim.Int#)
	 (ww4_s19e :: GHC.Prim.Int#)
	 (w_s19g :: GHC.Prim.State# s_aLn) ->
	 case ww1_s192 of wild2_X1p {
	   __DEFAULT ->
	     $wtrans_s19S
	       (GHC.Prim.+# ww_s18Y 1)
	       (GHC.Prim.-# wild2_X1p 1)
	       ww2_s196
	       ww3_s19a
	       (GHC.Prim.+#
		  ww4_s19e (GHC.Prim.indexIntArray# rb21_aO7 (GHC.Prim.+# rb11_aO4 ww_s18Y)))
	       w_s19g;
	   0 ->
	     let {
	       $w$j_s19W :: GHC.Prim.State# s_aLn
			    -> GHC.Prim.Int#
			    -> GHC.Prim.Int#
			    -> (# GHC.Prim.State# s_aLn, (GHC.Base.Int, GHC.Base.Int) #)
	       [Arity 3
		Str: DmdType LLL]
	       $w$j_s19W =
		 \ (w1_s18H :: GHC.Prim.State# s_aLn)
		   (ww5_s18M :: GHC.Prim.Int#)
		   (ww6_s18Q :: GHC.Prim.Int#) ->
		   let {
		     a_s104 [Just L] :: GHC.Prim.Int#
		     [Str: DmdType]
		     a_s104 = GHC.Prim.+# ww2_s196 1
		   } in 
		     case GHC.Prim.==# a_s104 rb1_aJe of wild3_aLq {
		       GHC.Base.False ->
			 case a_s104 of wild31_X2J {
			   __DEFAULT ->
			     case GHC.Prim.readIntArray#
				    @ s_aLn marr#1_XPR (GHC.Prim.-# wild31_X2J 1) w1_s18H
			     of wild21_aXE { (# s2#3_aXG, r#_aXH #) ->
			     case GHC.Prim.readIntArray#
				    @ s_aLn marr#_aOP (GHC.Prim.-# wild31_X2J 1) s2#3_aXG
			     of wild22_XZY { (# s2#4_X101, r#1_X103 #) ->
			     case GHC.Prim.writeIntArray#
				    @ s_aLn marr#1_XPR wild31_X2J (GHC.Prim.+# r#_aXH r#1_X103) s2#4_X101
			     of s2#5_aVX { __DEFAULT ->
			     case GHC.Prim.writeIntArray# @ s_aLn marr#_aOP wild31_X2J 0 s2#5_aVX
			     of s2#6_XYb { __DEFAULT ->
			     $wtrans_s19S
			       ww_s18Y
			       (GHC.Prim.indexIntArray# rb2_aJf (GHC.Prim.+# rb_aIC wild31_X2J))
			       wild31_X2J
			       ww5_s18M
			       ww6_s18Q
			       s2#6_XYb
			     }
			     }
			     }
			     };
			   0 ->
			     case GHC.Prim.writeIntArray# @ s_aLn marr#1_XPR 0 0 w1_s18H
			     of s2#3_aVX { __DEFAULT ->
			     case GHC.Prim.writeIntArray# @ s_aLn marr#_aOP 0 0 s2#3_aVX
			     of s2#4_XYb { __DEFAULT ->
			     $wtrans_s19S
			       ww_s18Y
			       (GHC.Prim.indexIntArray# rb2_aJf rb_aIC)
			       0
			       ww5_s18M
			       ww6_s18Q
			       s2#4_XYb
			     }
			     }
			 };
		       GHC.Base.True -> (# w1_s18H, ((GHC.Base.I# ww5_s18M), (GHC.Base.I# ww6_s18Q)) #)
		     }
	     } in 
	       case ww2_s196 of wild3_X1P {
		 __DEFAULT ->
		   case GHC.Prim.writeIntArray# @ s_aLn marr#2_XQ3 ww3_s19a ww4_s19e w_s19g
		   of s2#3_aVX { __DEFAULT ->
		   $w$j_s19W s2#3_aVX (GHC.Prim.+# ww3_s19a 1) ww4_s19e
		   };
		 (-1) -> $w$j_s19W w_s19g ww3_s19a ww4_s19e
	       }
	 };


The matching C routine:

void test (int arr[], int segd[], int n, int m, int out[], int *len)
{
  int acc = 0;
  int arr_i, segd_i, seg_cnt;

  arr_i = 0;
  for (segd_i = 0; segd_i < m; segd_i++) {
    acc = 0;
    for (seg_cnt = segd[segd_i]; seg_cnt == 0; seg_cnt--)
      acc += arr[arr_i++];
    out[segd_i] = acc;
  }
  *len = m;
}

-}
