module DDC.Core.Flow.Process.Pretty where
import DDC.Core.Flow.Process.Process
import DDC.Core.Flow.Process.Operator
import DDC.Core.Flow.Context
import DDC.Base.Pretty
import DDC.Core.Pretty          ()


instance Pretty Process where
 ppr p
  = vcat
  $     [ ppr (processName p)
        , text "  parameters:    " <> ppr (processParamFlags p) 
        , indent 2 $ ppr $ processContext p ]


instance Pretty Context where
 ppr cc
  = case cc of
    ContextRate{}
       -> vcat
        $ [ text "Rate " <> ppr (contextRate cc) ]
          ++ ops
          ++ inner
    ContextSelect{}
       -> vcat
        $ [ text "Select " <> ppr (contextInnerRate cc) <> text " <= " <> ppr (contextOuterRate cc)
          , text " flags: " <> ppr (contextFlags cc) 
          , text " sel:   " <> ppr (contextSelector cc) ]
          ++ ops
          ++ inner
    ContextSegment{}
       -> vcat
        $ [ text "Segment " <> ppr (contextInnerRate cc) <> text " <= " <> ppr (contextOuterRate cc)
          , text " lens:  " <> ppr (contextLens cc) 
          , text " segd:  " <> ppr (contextSegd cc) ]
          ++ ops
          ++ inner
    ContextAppend{}
       -> vcat
        $ [ text "Append " <> ppr (contextRate1 cc) <> text " " <> ppr (contextRate2 cc)
          , indent 2 $ ppr $ contextInner1 cc
          , indent 2 $ ppr $ contextInner2 cc ]

  where
   ops = map (indent 2 . ppr) (contextOps cc)
   inner = map (indent 2 . ppr) (contextInner cc)


instance Pretty Operator where
 ppr op@OpId{}
        = vcat
        [ text "Id"
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " input:   "     <> ppr (opInputSeries   op)
        , text " result:  "     <> ppr (opResultSeries  op) ]

 ppr op@OpRep{}
        = vcat
        [ text "Rep"
        , text " result:      " <> ppr (opResultSeries  op)
        , text " output rate: " <> ppr (opOutputRate    op)
        , text " type:        " <> ppr (opElemType      op) ]

 ppr op@OpReps{}
        = vcat
        [ text "Reps"
        , text " result:      " <> ppr (opResultSeries  op)
        , text " input rate:  " <> ppr (opInputRate     op)
        , text " output rate: " <> ppr (opOutputRate    op)
        , text " type:        " <> ppr (opElemType      op)
        , text " segd:        " <> ppr (opSegdBound     op)
        , text " input:       " <> ppr (opInputSeries   op) ]
 
 ppr op@OpIndices{}
        = vcat
        [ text "Indices"
        , text " result:      " <> ppr (opResultSeries  op)
        , text " input rate:  " <> ppr (opInputRate     op)
        , text " output rate: " <> ppr (opOutputRate    op) ]

 ppr op@OpFill{}
        = vcat
        [ text "Fill"
        , text " target:  "     <> ppr (opTargetVector  op)
        , text " input:   "     <> ppr (opInputSeries   op) ]

 ppr op@OpGather{}
        = vcat
        [ text "Gather"
        , text " result:  "     <> ppr (opResultBind    op)
        , text " vector:  "     <> ppr (opSourceVector  op)
        , text " indices: "     <> ppr (opSourceIndices op)
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " type:    "     <> ppr (opElemType      op) ]

 ppr op@OpScatter{}
        = vcat
        [ text "Scatter"
        , text " vector:  "     <> ppr (opTargetVector  op)
        , text " indices: "     <> ppr (opSourceIndices op)
        , text " elems:   "     <> ppr (opSourceElems   op)
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " type:    "     <> ppr (opElemType      op) ]

 ppr op@OpGenerate{}
        = vcat
        [ text "Generate"
        , text " rate:    "     <> ppr (opOutputRate    op) ]

 ppr op@OpReduce{}
        = vcat
        [ text "Reduce"
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " input:   "     <> ppr (opInputSeries   op) ]

 ppr op@OpMap{}
        = vcat
        [ text "Map"
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " result:  "     <> ppr (opResultSeries  op) ]

 ppr op@OpPack{}
        = vcat
        [ text "Pack"
        , text " input  rate: " <> ppr (opInputRate     op) 
        , text " output rate: " <> ppr (opOutputRate    op) ]

 ppr op@OpSeriesOfRateVec{}
        = vcat
        [ text "SeriesOfRateVec"
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " input:   "     <> ppr (opInputRateVec  op)
        , text " result:  "     <> ppr (opResultSeries  op) ]

 ppr op@OpSeriesOfArgument{}
        = vcat
        [ text "SeriesOfArgument"
        , text " rate:    "     <> ppr (opInputRate     op)
        , text " result:  "     <> ppr (opResultSeries  op) ]