module DDC.Core.Flow.Transform.Slurp.Operator
(slurpOperator)
where
import DDC.Core.Flow.Process.Operator
import DDC.Core.Flow.Exp
import DDC.Core.Flow.Prim
import DDC.Core.Flow.Prim.TyConPrim
import DDC.Core.Compounds.Simple
import DDC.Type.Pretty ()
slurpOperator
:: Bind Name
-> Exp () Name
-> Maybe Operator
slurpOperator bResult xx
| Just ( NameOpFlow OpFlowVectorOfSeries
, [ XType tRate, XType tA, (XVar uSeries) ])
<- takeXPrimApps xx
= Just $ OpCreate
{ opResultVector = bResult
, opInputRate = tRate
, opInputSeries = uSeries
, opAllocRate = Nothing
, opElemType = tA }
| Just (NameOpFlow (OpFlowMap n), xs)
<- takeXPrimApps xx
, n >= 1
, XType tR : xsArgs2 <- xs
, (xsA, xsArgs3) <- splitAt (n + 1) xsArgs2
, tsA <- [ t | XType t <- xsA ]
, length tsA == n + 1
, xWorker : xsSeries <- xsArgs3
, usSeries <- [ u | XVar u <- xsSeries ]
, length usSeries == n
, Just (psIn, xBody) <- takeXLams xWorker
, length psIn == n
= Just $ OpMap
{ opArity = n
, opResultSeries = bResult
, opInputRate = tR
, opInputSeriess = usSeries
, opWorkerParams = psIn
, opWorkerBody = xBody }
| Just ( NameOpFlow OpFlowFold
, [ XType tRate, XType _tAcc, XType _tElem
, xWorker, xZero, (XVar uSeries)])
<- takeXPrimApps xx
, Just ([pAcc, pElem], xBody) <- takeXLams xWorker
= Just $ OpFold
{ opResultValue = bResult
, opInputRate = tRate
, opInputSeries = uSeries
, opZero = xZero
, opWorkerParamIndex = BNone tInt
, opWorkerParamAcc = pAcc
, opWorkerParamElem = pElem
, opWorkerBody = xBody }
| Just ( NameOpFlow OpFlowFoldIndex
, [ XType tRate, XType _tAcc, XType _tElem
, xWorker, xZero, (XVar uSeries)])
<- takeXPrimApps xx
, Just ([pIx, pAcc, pElem], xBody) <- takeXLams xWorker
= Just $ OpFold
{ opResultValue = bResult
, opInputRate = tRate
, opInputSeries = uSeries
, opZero = xZero
, opWorkerParamIndex = pIx
, opWorkerParamAcc = pAcc
, opWorkerParamElem = pElem
, opWorkerBody = xBody }
| Just ( NameOpFlow OpFlowPack
, [ XType tRateInput, XType tRateOutput, XType tElem
, _xSel, (XVar uSeries) ]) <- takeXPrimApps xx
= Just $ OpPack
{ opResultSeries = bResult
, opInputRate = tRateInput
, opInputSeries = uSeries
, opOutputRate = tRateOutput
, opElemType = tElem }
| otherwise
= Nothing