module Induction.Structural.Utils where
import Control.Applicative hiding (empty)
import Control.Monad.State
import Induction.Structural.Types
type TaggedTerm c v = Term c (Tagged v)
type TaggedHypothesis c v t = Hypothesis c (Tagged v) t
argRepr :: Arg t -> t
argRepr (Rec t) = t
argRepr (NonRec t) = t
argRepr (Exp t _) = t
newtype Fresh a = Fresh (State Integer a)
deriving (Functor,Applicative,Monad,MonadState Integer)
runFresh :: Fresh a -> a
runFresh (Fresh m) = evalState m 0
newFresh :: v -> Fresh (Tagged v)
newFresh v = Fresh $ state $ \ s -> (v :~ s,s+1)
newTyped :: v -> t -> Fresh (Tagged v,t)
newTyped v t = flip (,) t <$> newFresh v
refreshTagged :: Tagged v -> Fresh (Tagged v)
refreshTagged (v :~ _) = newFresh v
refreshTypedTagged :: Tagged v -> t -> Fresh (Tagged v,t)
refreshTypedTagged v t = flip (,) t <$> refreshTagged v