--atom functions on primitive atom values plus the basic atom functions
module ProjectM36.AtomFunctions.Basic where
import ProjectM36.Base
import ProjectM36.DataTypes.Day
import ProjectM36.DataTypes.Either
import ProjectM36.DataTypes.Maybe
import ProjectM36.DataTypes.Interval
import ProjectM36.DataTypes.ByteString
import ProjectM36.DataTypes.NonEmptyList
import ProjectM36.AtomFunctions.Primitive
import ProjectM36.AtomFunction
import ProjectM36.DataTypes.List
import ProjectM36.DataTypes.DateTime
import qualified Data.HashSet as HS

basicAtomFunctions :: AtomFunctions
basicAtomFunctions :: AtomFunctions
basicAtomFunctions = forall a. Eq a => [HashSet a] -> HashSet a
HS.unions [AtomFunctions
primitiveAtomFunctions, 
                                AtomFunctions
dayAtomFunctions,
                                AtomFunctions
dateTimeAtomFunctions,
                                AtomFunctions
eitherAtomFunctions,
                                AtomFunctions
maybeAtomFunctions,
                                AtomFunctions
listAtomFunctions,
                                AtomFunctions
nonEmptyListAtomFunctions,
                                AtomFunctions
bytestringAtomFunctions,
                                AtomFunctions
intervalAtomFunctions]

--these special atom functions aren't scripted so they can't be serialized normally. Instead, the body remains in the binary and the serialization/deserialization happens by name only.
precompiledAtomFunctions :: AtomFunctions
precompiledAtomFunctions :: AtomFunctions
precompiledAtomFunctions = forall a. (a -> Bool) -> HashSet a -> HashSet a
HS.filter (Bool -> Bool
not forall b c a. (b -> c) -> (a -> b) -> a -> c
. AtomFunction -> Bool
isScriptedAtomFunction) AtomFunctions
basicAtomFunctions