feat[core]: Algebraic Data Types
This commit is contained in:
parent
3847e1e81e
commit
ebe94e2d9b
6 changed files with 83 additions and 0 deletions
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