packages feed

lhae-0.0.2: src/Model/CellExpression/Evaluator/Common.hs

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