module DDC.Core.Flow.Transform.Schedule.Base
( elemBindOfSeriesBind
, elemBoundOfSeriesBound
, elemTypeOfSeriesType
, rateTypeOfSeriesType
, slurpRateOfParamTypes
, elemTypeOfVectorType)
where
import DDC.Core.Flow.Transform.Schedule.Error
import DDC.Core.Flow.Compounds
import DDC.Core.Flow.Prim
import DDC.Core.Flow.Exp
import Data.Maybe
elemBindOfSeriesBind :: BindF -> Maybe BindF
elemBindOfSeriesBind bSeries
| BName nSeries tSeries' <- bSeries
, nElem <- NameVarMod nSeries "elem"
, Just tElem <- elemTypeOfSeriesType tSeries'
= Just $ BName nElem tElem
| otherwise
= Nothing
elemBoundOfSeriesBound :: BoundF -> Maybe BoundF
elemBoundOfSeriesBound uSeries
| UName nSeries <- uSeries
, nElem <- NameVarMod nSeries "elem"
= Just $ UName nElem
| otherwise
= Nothing
elemTypeOfSeriesType :: TypeF -> Maybe TypeF
elemTypeOfSeriesType tSeries'
| Just (_tcSeries, [_tK, tE]) <- takeTyConApps tSeries'
= Just tE
| otherwise
= Nothing
rateTypeOfSeriesType :: TypeF -> Maybe TypeF
rateTypeOfSeriesType tSeries'
| Just (_tcSeries, [tK, _tE]) <- takeTyConApps tSeries'
= Just tK
| otherwise
= Nothing
slurpRateOfParamTypes :: [Type Name] -> Either Error (Type Name)
slurpRateOfParamTypes tsParam
= case mapMaybe rateTypeOfSeriesType tsParam of
[] -> Left ErrorNoSeriesParameters
[tK] -> Right tK
(tK : ts)
| all (== tK) ts -> Right tK
| otherwise -> Left ErrorMultipleRates
elemTypeOfVectorType :: TypeF -> Maybe TypeF
elemTypeOfVectorType tVector'
| Just (_tcVector, [tE]) <- takeTyConApps tVector'
= Just tE
| otherwise
= Nothing