feat[core]: Algebraic Data Types
This commit is contained in:
parent
3847e1e81e
commit
ebe94e2d9b
6 changed files with 83 additions and 0 deletions
|
@ -24,6 +24,11 @@ library
|
||||||
Language.Scalie.Bytecode.Object
|
Language.Scalie.Bytecode.Object
|
||||||
Language.Scalie.Bytecode.Object.Builder
|
Language.Scalie.Bytecode.Object.Builder
|
||||||
Language.Scalie.Compiler.Bytecode
|
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.Definition
|
||||||
Language.Scalie.Core.Expression
|
Language.Scalie.Core.Expression
|
||||||
Language.Scalie.Core.Expression.ConstructorIdentifier
|
Language.Scalie.Core.Expression.ConstructorIdentifier
|
||||||
|
|
19
src/Language/Scalie/Core/AlgebraicDatatype.hs
Normal file
19
src/Language/Scalie/Core/AlgebraicDatatype.hs
Normal 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))
|
||||||
|
}
|
13
src/Language/Scalie/Core/AlgebraicDatatype/Constructor.hs
Normal file
13
src/Language/Scalie/Core/AlgebraicDatatype/Constructor.hs
Normal 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))
|
||||||
|
}
|
16
src/Language/Scalie/Core/AlgebraicDatatype/Field.hs
Normal file
16
src/Language/Scalie/Core/AlgebraicDatatype/Field.hs
Normal 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
|
||||||
|
}
|
|
@ -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)
|
22
src/Language/Scalie/Core/AlgebraicDatatype/TypeName.hs
Normal file
22
src/Language/Scalie/Core/AlgebraicDatatype/TypeName.hs
Normal 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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue