Compare commits

..

No commits in common. "6a28e979872b9c4c58bdef731a7047934889d09e" and "36ae4dd5e0f5974e41a0ab15c28a280898139a1e" have entirely different histories.

12 changed files with 28 additions and 109 deletions

View file

@ -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

View file

@ -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))
}

View file

@ -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))
}

View file

@ -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
}

View file

@ -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)

View file

@ -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

View file

@ -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))

View file

@ -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

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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 ]