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