packages feed

claims-x12-dsl-0.1.0.0: src/Claims/Interpreter.hs

{-# LANGUAGE GADTs #-}
{-# LANGUAGE OverloadedStrings #-}

module Claims.Interpreter
  ( eval
  , validateClaim
  ) where

import Claims.Types

-- | Evaluate a rule against a claim
eval :: Claim -> Rule a -> a
eval claim rule = case rule of
  AmountGreaterThan amt -> totalAmount claim > amt
  AmountLessThan amt -> totalAmount claim < amt
  AmountBetween low high -> totalAmount claim >= low && totalAmount claim <= high
  
  HasDiagnosisCode code -> code `elem` diagnosisCodes claim
  HasProcedureCode code -> code `elem` procedureCodes claim
  
  IsClaimType ct -> claimType claim == ct
  PlaceOfServiceIs p -> placeOfService claim == p
  
  And r1 r2 -> eval claim r1 && eval claim r2
  Or r1 r2 -> eval claim r1 || eval claim r2
  Not r -> not (eval claim r)
  
  Reject msg -> Invalid msg
  Approve -> Valid
  RequireReview msg -> Invalid ("Review Required: " <> msg)
  
  If cond thenRule elseRule ->
    if eval claim cond
      then eval claim thenRule
      else eval claim elseRule

-- | Validate a claim against a list of rules
validateClaim :: Claim -> [Rule ValidationResult] -> [ValidationResult]
validateClaim claim rules = map (eval claim) rules