{-# LANGUAGE OverloadedStrings #-}

module Funcons.Core.Computations.Normal.GeneratingBuiltin where

import Funcons.EDSL
import Funcons.Operations hiding (Values,tobool,libFromList)

import Data.Set (fromList)

library :: FunconLibrary
library = [(Name, EvalFunction)] -> FunconLibrary
libFromList [ 
        (Name
"initialise-generating", NonStrictFuncon -> EvalFunction
NonStrictFuncon NonStrictFuncon
stepInitialise_generating)
    ]

initialise_generating_ :: Funcons
initialise_generating_ = Name -> Funcons
FName Name
"initialise-generating"
stepInitialise_generating :: NonStrictFuncon
stepInitialise_generating [Funcons]
fargs =
    [Rewrite Rewritten] -> [MSOS StepRes] -> Rewrite Rewritten
evalRules [] [MSOS StepRes
step1]
    where step1 :: MSOS StepRes
step1 = do
            let env :: Map k a
env = forall {k} {a}. Map k a
emptyEnv
            Env
env <- [Funcons] -> [FPattern] -> Env -> MSOS Env
lifted_fsMatch [Funcons]
fargs [MetaVar -> FPattern
PMetaVar MetaVar
"P"] forall {k} {a}. Map k a
env
            Env
env <- Name -> [VPattern] -> Env -> MSOS Env
getMutPatt Name
"used-atom-set" [VPattern
VPWildCard] Env
env
            Name -> [Values] -> MSOS ()
putMut Name
"used-atom-set" [Values
reserved_atoms]
            FTerm -> Env -> MSOS StepRes
stepTermTo (MetaVar -> FTerm
TVar MetaVar
"P") Env
env
          reserved_atoms :: Values
reserved_atoms = forall t. ValueSets (Values t) -> Values t
Set (forall a. Ord a => [a] -> Set a
fromList [])