diff --git a/scalie.cabal b/scalie.cabal index 5d04b75..bf5a427 100644 --- a/scalie.cabal +++ b/scalie.cabal @@ -24,11 +24,6 @@ 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 diff --git a/src/Language/Scalie/Core/AlgebraicDatatype.hs b/src/Language/Scalie/Core/AlgebraicDatatype.hs deleted file mode 100644 index 3b001db..0000000 --- a/src/Language/Scalie/Core/AlgebraicDatatype.hs +++ /dev/null @@ -1,19 +0,0 @@ -{-# 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)) - } diff --git a/src/Language/Scalie/Core/AlgebraicDatatype/Constructor.hs b/src/Language/Scalie/Core/AlgebraicDatatype/Constructor.hs deleted file mode 100644 index e70144c..0000000 --- a/src/Language/Scalie/Core/AlgebraicDatatype/Constructor.hs +++ /dev/null @@ -1,13 +0,0 @@ -{-# 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)) - } diff --git a/src/Language/Scalie/Core/AlgebraicDatatype/Field.hs b/src/Language/Scalie/Core/AlgebraicDatatype/Field.hs deleted file mode 100644 index 808b4b8..0000000 --- a/src/Language/Scalie/Core/AlgebraicDatatype/Field.hs +++ /dev/null @@ -1,16 +0,0 @@ -{-# 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 - } diff --git a/src/Language/Scalie/Core/AlgebraicDatatype/FieldIdentifier.hs b/src/Language/Scalie/Core/AlgebraicDatatype/FieldIdentifier.hs deleted file mode 100644 index 8892208..0000000 --- a/src/Language/Scalie/Core/AlgebraicDatatype/FieldIdentifier.hs +++ /dev/null @@ -1,8 +0,0 @@ -{-# 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) diff --git a/src/Language/Scalie/Core/AlgebraicDatatype/TypeName.hs b/src/Language/Scalie/Core/AlgebraicDatatype/TypeName.hs deleted file mode 100644 index 14d2667..0000000 --- a/src/Language/Scalie/Core/AlgebraicDatatype/TypeName.hs +++ /dev/null @@ -1,22 +0,0 @@ -{-# 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 - diff --git a/src/Language/Scalie/Core/Definition.hs b/src/Language/Scalie/Core/Definition.hs index 60e2cb8..c1f0f60 100644 --- a/src/Language/Scalie/Core/Definition.hs +++ b/src/Language/Scalie/Core/Definition.hs @@ -60,8 +60,6 @@ deriving stock instance (Show (f (Expression f)), Show (f Scalie.Domain.Type), S deriving stock instance (Read (f (Expression f)), Read (f Scalie.Domain.Type), Read (f Text)) => Read (Definition f) deriving stock instance (Eq (f (Expression f)), Eq (f Scalie.Domain.Type) , Eq (f Text)) => Eq (Definition f) --- | Using custom instances allows extracting just the text whereever possible. - instance ImplicitKeyOf (Definition (Provenance a)) where type KeyType (Definition (Provenance a)) = Text keyOf :: Definition (Provenance a) -> KeyType (Definition (Provenance a)) diff --git a/src/Language/Scalie/Core/Expression.hs b/src/Language/Scalie/Core/Expression.hs index 6511fb7..3c84c15 100644 --- a/src/Language/Scalie/Core/Expression.hs +++ b/src/Language/Scalie/Core/Expression.hs @@ -24,8 +24,6 @@ import Test.QuickCheck.Gen (Gen) import Test.QuickCheck qualified as Gen --- | Desugared expression. - type Expression :: (Type -> Type) -> Type type role Expression nominal data Expression f diff --git a/src/Language/Scalie/Core/Module.hs b/src/Language/Scalie/Core/Module.hs index 6266529..0a0ce69 100644 --- a/src/Language/Scalie/Core/Module.hs +++ b/src/Language/Scalie/Core/Module.hs @@ -5,24 +5,33 @@ {-# LANGUAGE UndecidableInstances #-} -- instance head no smaller... module Language.Scalie.Core.Module (Module(..)) where --- meta import Data.Kind (Type) - --- data types +import Language.Scalie.Core.Definition (Definition) import Data.Map.Implicit (ImplicitMap) --- scalie -import Language.Scalie.Core.Definition (Definition) -import safe Language.Scalie.Core.AlgebraicDatatype ( AlgebraicDatatype ) - --- | A module groups multiple related variable definitions. +-- | A module groups multiple related definitions. +-- +-- >>> import Data.Functor.Identity (Identity(..)) +-- >>> import Data.Map.Implicit qualified as ImplicitMap +-- >>> Module (Identity ImplicitMap.empty) +-- Module {definitions = Identity ImplicitMapElems []} +-- +-- >>> import Data.Maybe (Maybe(..)) +-- >>> Module Nothing +-- Module {definitions = Nothing} +-- +-- >>> import Text.Read (readMaybe) +-- >>> readMaybe "Module { definitions = Just (ImplicitMapElems []) }" :: Maybe (Module Maybe) +-- Just (Module {definitions = Just ImplicitMapElems []}) +-- +-- >>> readMaybe "Module { definitions = Just (ImplicitMapElems [Definition { signature = Nothing, name = Just \"x\", body = Nothing } ]) }" :: Maybe (Module Maybe) +-- Just (Module {definitions = Just ImplicitMapElems [Definition {signature = Nothing, name = Just "x", body = Nothing}]}) type Module :: (Type -> Type) -> Type type role Module nominal -data Module f = Module +newtype Module f = Module { definitions :: f (ImplicitMap (Definition f)) - , datatypes :: f (ImplicitMap (AlgebraicDatatype f)) } -deriving stock instance (Show (f (ImplicitMap (Definition f))), Show (f (ImplicitMap (AlgebraicDatatype f)))) => Show (Module f) -deriving stock instance (Read (f (ImplicitMap (Definition f))), Read (f (ImplicitMap (AlgebraicDatatype f)))) => Read (Module f) +deriving stock instance (Show (f (ImplicitMap (Definition f)))) => Show (Module f) +deriving stock instance (Read (f (ImplicitMap (Definition f)))) => Read (Module f) diff --git a/src/Language/Scalie/Core/Provenance.hs b/src/Language/Scalie/Core/Provenance.hs index 50714c7..d067c69 100644 --- a/src/Language/Scalie/Core/Provenance.hs +++ b/src/Language/Scalie/Core/Provenance.hs @@ -11,8 +11,6 @@ import Data.Bifunctor (Bifunctor (bimap)) import Data.Bifoldable (Bifoldable (bifoldMap)) import Data.Bitraversable (Bitraversable (bitraverse)) --- | Provenance records where something comes from. E.g. file name, file line, other sources. - type Provenance :: Type -> Type -> Type type role Provenance representational representational data Provenance source value = Provenance diff --git a/src/Language/Scalie/Core/Provenance/SourceLocation.hs b/src/Language/Scalie/Core/Provenance/SourceLocation.hs index 3ecf436..ab1f76f 100644 --- a/src/Language/Scalie/Core/Provenance/SourceLocation.hs +++ b/src/Language/Scalie/Core/Provenance/SourceLocation.hs @@ -1,10 +1,9 @@ {-# LANGUAGE Safe #-} module Language.Scalie.Core.Provenance.SourceLocation (SourceLocation(..)) where import Data.Kind (Type) - --- | Location of anything in a user-provided source file. --- --- TODO: Add more constructors +import Text.Show (Show) +import Text.Read (Read) +import Data.Eq (Eq) type SourceLocation :: Type data SourceLocation diff --git a/src/Language/Scalie/Domain/Type.hs b/src/Language/Scalie/Domain/Type.hs index 97354de..92f9f87 100644 --- a/src/Language/Scalie/Domain/Type.hs +++ b/src/Language/Scalie/Domain/Type.hs @@ -3,17 +3,17 @@ module Language.Scalie.Domain.Type (Type(..)) where import Data.Kind qualified +import Text.Show (Show) +import Text.Read (Read) +import Data.Eq (Eq) import Test.QuickCheck (Arbitrary (arbitrary), Gen, oneof) - --- | The type of an expression in Scalie, not to be confused with the 'Type' provided by GHC +import Control.Applicative (Applicative(pure)) type Type :: Data.Kind.Type data Type = RawInt deriving stock (Show, Read, Eq) - -- add to the arbitrary instance when defining constructors - instance Arbitrary Type where arbitrary :: Gen Type arbitrary = oneof [ pure RawInt ]