@@ -1,5 +1,5 @@
1−{-# LANGUAGE PatternGuards #-}
1+{-# LANGUAGE PatternGuards, DeriveFunctor #-}
2−module Idris.Providers (providerTy, getProvided) where
2+module Idris.Providers (providerTy, getProvided, Provided(..)) where
4import Idris.Core.TT
4import Idris.Core.TT
5import Idris.Core.Evaluate
5import Idris.Core.Evaluate
@@ -16,9 +16,14 @@ providerTy fc tm = PApp fc (PRef fc $ sUN "Provider") [PExp 0 [] tm ""]
16ioret = sUN "prim_io_return"
16ioret = sUN "prim_io_return"
17ermod = sNS (sUN "Error") ["Providers"]
17ermod = sNS (sUN "Error") ["Providers"]
18prmod = sNS (sUN "Provide") ["Providers"]
18prmod = sNS (sUN "Provide") ["Providers"]
19+posmod = sNS (sUN "Postulate") ["Providers"]
21+data Provided a = Provide a
23+ deriving (Show, Eq, Functor)
20-- | Handle an error, if the type provider returned an error. Otherwise return the provided term.
25-- | Handle an error, if the type provider returned an error. Otherwise return the provided term.
21−getProvided :: FC -> TT Name -> Idris (TT Name)
26+getProvided :: FC -> TT Name -> Idris (Provided (TT Name))
22getProvided fc tm | (P _ pioret _, [tp, result]) <- unApply tm
27getProvided fc tm | (P _ pioret _, [tp, result]) <- unApply tm
23 , (P _ nm _, [_, err]) <- unApply result
28 , (P _ nm _, [_, err]) <- unApply result
24 , pioret == ioret && nm == ermod
29 , pioret == ioret && nm == ermod
@@ -28,7 +33,11 @@ getProvided fc tm | (P _ pioret _, [tp, result]) <- unApply tm
28 | (P _ pioret _, [tp, result]) <- unApply tm
33 | (P _ pioret _, [tp, result]) <- unApply tm
29 , (P _ nm _, [_, res]) <- unApply result
34 , (P _ nm _, [_, res]) <- unApply result
30 , pioret == ioret && nm == prmod
35 , pioret == ioret && nm == prmod
31− = return res
36+ = return . Provide $ res
37+ | (P _ pioret _, [tp, result]) <- unApply tm
38+ , (P _ nm _, [_]) <- unApply result
39+ , pioret == ioret && nm == posmod
32 | otherwise = ifail $ "Internal type provider error: result was not " ++
41 | otherwise = ifail $ "Internal type provider error: result was not " ++
33 "IO (Provider a), or perhaps missing normalisation."
42 "IO (Provider a), or perhaps missing normalisation."