- mkPort = \x -> Single Port
- hsargs = map (mkHsValueMap mkPort) arg_tys
- hsres = mkHsValueMap mkPort res_ty
- hsname = getOccString f
+ -- The last argument must be state
+ state_ty = last arg_tys
+ state = mkState state_ty
+ -- All but the last argument are inports
+ inports = map mkPort (init arg_tys)
+ hsargs = inports ++ [state]
+ hsres = case splitTupleType res_ty of
+ -- Result type must be a two tuple (state, ports)
+ Just [outstate_ty, outport_ty] -> if Type.coreEqType state_ty outstate_ty
+ then
+ Tuple [state, mkPort outport_ty]
+ else
+ error $ "Input state type of function " ++ hsname ++ ": " ++ (showSDoc $ ppr state_ty) ++ " does not match output state type: " ++ (showSDoc $ ppr outstate_ty)
+ otherwise -> error $ "Return type of top-level function " ++ hsname ++ " must be a two-tuple containing a state and output ports."