module Model.CellExpression.Evaluator.Common (withNum,withString,withList,withNumList,getNumList,fLength) where import Model.CellContent (CellValue (..),RuntimeReason(..)) withNum :: CellValue -> (Double -> CellValue) -> CellValue withNum value f = case value of NumberValue a -> f a Error a -> Error $ Inherited value a a -> Error $ TypeError a withString :: CellValue -> (String -> CellValue) -> CellValue withString value f = case value of StringValue a -> f a Error a -> Error $ Inherited value a a -> Error $ TypeError a withList :: CellValue -> ([CellValue] -> CellValue) -> CellValue withList value f = case value of ListValue a -> f a Error a -> Error $ Inherited value a a -> Error $ TypeError a withNumList :: CellValue -> ([Double] -> CellValue) -> CellValue withNumList value f = case value of ListValue a -> either (Error . Inherited value) f $ getNumList a Error a -> Error $ Inherited value a a -> Error $ TypeError a getNumList :: [CellValue] -> Either RuntimeReason [Double] getNumList = foldr (\value accu -> case (value,accu) of (NumberValue n,Right list) -> Right $ n:list (Error a,Right _) -> Left $ Inherited value a (a,Right _) -> Left $ TypeError a (_,Left a) -> Left a ) (Right []) fLength :: Num b => [a] -> b fLength = fromIntegral . length