{-# LANGUAGE OverloadedStrings #-} module Funcons.Core.Values.Composite.AlgebraicDatatypeValues.AlgebraicDatatypes where import Funcons.EDSL import Funcons.Types import Data.Text (unpack, pack) library = libFromList [ ("algebraic-datatype", ValueOp evalADT) , ("algebraic-datatype-constructor", ValueOp evalADT_Con) , ("algebraic-datatype-value", ValueOp getADT_Values) ] evalADT [Atom con, v] = rewritten $ ADTVal (pack con) (tuple_unval v) evalADT vs = sortErr (applyFuncon "algebraic-datatype" (fvalues vs)) "algebraic-datatype not applied to correct arguments" evalADT_Con [ADTVal con _] = rewritten $ Atom (unpack con) evalADT_Con vs = sortErr (applyFuncon "algebraid-datatype-constructor" (fvalues vs)) "algebraic-datatype-constructor not applied to an ADT" getADT_Values [ADTVal _ vs] = rewritten (safe_tuple_val vs) getADT_Values vs = sortErr (applyFuncon "algebraic-datatype-value" (fvalues vs)) "algebraic-datatype-value not applied to an ADT"