feat[core]: Algebraic Data Types

This commit is contained in:
vegowotenks 2025-08-15 13:03:31 +02:00
parent 3847e1e81e
commit ebe94e2d9b
6 changed files with 83 additions and 0 deletions

View file

@ -24,6 +24,11 @@ library
Language.Scalie.Bytecode.Object
Language.Scalie.Bytecode.Object.Builder
Language.Scalie.Compiler.Bytecode
Language.Scalie.Core.AlgebraicDatatype
Language.Scalie.Core.AlgebraicDatatype.Constructor
Language.Scalie.Core.AlgebraicDatatype.Field
Language.Scalie.Core.AlgebraicDatatype.FieldIdentifier
Language.Scalie.Core.AlgebraicDatatype.TypeName
Language.Scalie.Core.Definition
Language.Scalie.Core.Expression
Language.Scalie.Core.Expression.ConstructorIdentifier

View file

@ -0,0 +1,19 @@
{-# LANGUAGE Trustworthy #-}
module Language.Scalie.Core.AlgebraicDatatype (AlgebraicDatatype(..)) where
-- meta
import Data.Kind (Type)
-- data structures
import Data.Vector (Vector)
-- scalie
import Language.Scalie.Core.AlgebraicDatatype.TypeName (TypeName)
import Language.Scalie.Core.AlgebraicDatatype.Constructor (Constructor)
type AlgebraicDatatype :: (Type -> Type) -> Type
type role AlgebraicDatatype nominal
data AlgebraicDatatype f = AlgebraicDatatype
{ name :: f TypeName
, constructors :: f (Vector (Constructor f))
}

View file

@ -0,0 +1,13 @@
{-# LANGUAGE Trustworthy #-} -- uses vector operations
module Language.Scalie.Core.AlgebraicDatatype.Constructor (Constructor(..)) where
import Data.Kind (Type)
import Language.Scalie.Core.Expression.ConstructorIdentifier (ConstructorIdentifier)
import Data.Vector (Vector)
import Language.Scalie.Core.AlgebraicDatatype.Field (Field)
type Constructor :: (Type -> Type) -> Type
type role Constructor nominal
data Constructor f = Constructor
{ name :: f ConstructorIdentifier
, fields :: f (Vector (Field f))
}

View file

@ -0,0 +1,16 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Core.AlgebraicDatatype.Field (Field(..)) where
-- meta
import Data.Kind qualified
-- scalie
import Language.Scalie.Core.AlgebraicDatatype.FieldIdentifier (FieldIdentifier)
import Language.Scalie.Domain.Type qualified as Scalie.Domain
type Field :: (Data.Kind.Type -> Data.Kind.Type) -> Data.Kind.Type
type role Field nominal
data Field f = Field
{ name :: f FieldIdentifier
, typ :: f Scalie.Domain.Type
}

View file

@ -0,0 +1,8 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Core.AlgebraicDatatype.FieldIdentifier (FieldIdentifier(..)) where
import Data.Text (Text)
import Data.Kind (Type)
type FieldIdentifier :: Type
newtype FieldIdentifier = FieldIdentifier { get :: Text }
deriving stock (Show, Read, Eq)

View file

@ -0,0 +1,22 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE InstanceSigs #-}
module Language.Scalie.Core.AlgebraicDatatype.TypeName (TypeName(..)) where
-- meta
import Data.Kind (Type)
-- data structures
import Data.Text (Text)
import Data.Text qualified as Text
-- library: QuickCheck
import Test.QuickCheck (Arbitrary (arbitrary), Gen, UnicodeString (getUnicodeString))
type TypeName :: Type
newtype TypeName = TypeName { get :: Text }
deriving stock (Show, Read, Eq)
instance Arbitrary TypeName where
arbitrary :: Gen TypeName
arbitrary = TypeName . Text.pack . getUnicodeString <$> arbitrary