module Language.Haskell.Liquid.Types.Literals (
literalFRefType
, literalFReft
, literalConst
) where
import Prelude hiding (error)
import TypeRep
import Literal
import qualified TyCon as TC
import Language.Haskell.Liquid.Measure
import Language.Haskell.Liquid.Types
import Language.Haskell.Liquid.Types.RefType
import Language.Haskell.Liquid.Transforms.CoreToLogic (mkLit)
import qualified Language.Fixpoint.Types as F
import qualified Data.Text as T
makeRTypeBase (TyVarTy α) x
= RVar (rTyVar α) x
makeRTypeBase (TyConApp c ts) x
= rApp c ((`makeRTypeBase` mempty) <$> ts) [] x
makeRTypeBase _ _
= panic Nothing "RefType : makeRTypeBase"
literalFRefType l
= makeRTypeBase (literalType l) (literalFReft l)
literalFReft l = maybe mempty mkReft $ mkLit l
mkReft e = case e of
F.ESym (F.SL str) ->
F.meet (F.uexprReft e)
(F.reft "v" (F.PAtom F.Eq
(F.mkEApp (name strLen) [F.EVar "v"])
(F.ECon (F.I (fromIntegral (T.length str))))))
_ -> F.exprReft e
literalConst :: F.TCEmb TC.TyCon -> Literal -> (F.Sort, Maybe F.Expr)
literalConst tce l = (t, mkLit l)
where
t = typeSort tce $ literalType l