module Types.Positional (
Positional(..),
alwaysPair,
processPairs,
processPairs_,
processPairsT,
) where
import Control.Monad.Trans (MonadTrans(..))
import Base.CompileError
newtype Positional a =
Positional {
pValues :: [a]
}
deriving (Eq,Ord,Show)
instance Functor Positional where
fmap f = Positional . fmap f . pValues
alwaysPair :: Monad m => a -> b -> m (a,b)
alwaysPair x y = return (x,y)
processPairs :: (Show a, Show b, CompileErrorM m) =>
(a -> b -> m c) -> Positional a -> Positional b -> m [c]
processPairs f (Positional ps1) (Positional ps2)
| length ps1 == length ps2 =
collectAllOrErrorM $ map (uncurry f) (zip ps1 ps2)
| otherwise =
compileError $ "Parameter count mismatch: " ++ show ps1 ++ " vs. " ++ show ps2
processPairs_ :: (Show a, Show b, CompileErrorM m) =>
(a -> b -> m c) -> Positional a -> Positional b -> m ()
processPairs_ f xs ys = processPairs f xs ys >> return ()
processPairsT :: (MonadTrans t, Monad (t m), Show a, Show b, CompileErrorM m) =>
(a -> b -> t m c) -> Positional a -> Positional b -> t m [c]
processPairsT f (Positional ps1) (Positional ps2)
| length ps1 == length ps2 =
sequence $ map (uncurry f) (zip ps1 ps2)
| otherwise =
lift $ compileError $ "Parameter count mismatch: " ++ show ps1 ++ " vs. " ++ show ps2