feat: Ability to specify integer definitions

This commit is contained in:
vegowotenks 2025-08-12 10:12:46 +02:00
parent 4bd766027f
commit 76970d7f9a
11 changed files with 143 additions and 11 deletions

View file

@ -19,14 +19,20 @@ extra-source-files:
description: Please see the README on GitHub at <https://github.com/githubuser/scalie#readme>
default-extensions:
- Safe
- ImportQualifiedPost
- NoImplicitPrelude
- StandaloneKindSignatures
- RoleAnnotations
dependencies:
- base >= 4.7 && < 5
- base
- containers
- text
- vector
ghc-options:
- -Weverything
- -Wno-unsafe
library:
source-dirs: src

View file

@ -19,17 +19,30 @@ extra-source-files:
library
exposed-modules:
Control.Ord.LexicographicallySorted
Data.Map.Implicit
Language.Scalie.Ast
Language.Scalie.Ast.Definition
Language.Scalie.Ast.Definition.Body
Language.Scalie.Ast.Expression
Language.Scalie.Ast.Module
Language.Scalie.Ast.Pattern
Language.Scalie.Domain.Type
other-modules:
Paths_scalie
hs-source-dirs:
src
default-extensions:
Safe
ImportQualifiedPost
NoImplicitPrelude
ghc-options: -Weverything
StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe
build-depends:
base >=4.7 && <5
base
, containers
, text
, vector
default-language: Haskell2010
executable scalie-exe
@ -39,12 +52,17 @@ executable scalie-exe
hs-source-dirs:
app
default-extensions:
Safe
ImportQualifiedPost
NoImplicitPrelude
ghc-options: -Weverything -threaded -rtsopts -with-rtsopts=-N
StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
build-depends:
base >=4.7 && <5
base
, containers
, scalie
, text
, vector
default-language: Haskell2010
test-suite scalie-test
@ -55,10 +73,15 @@ test-suite scalie-test
hs-source-dirs:
test
default-extensions:
Safe
ImportQualifiedPost
NoImplicitPrelude
ghc-options: -Weverything -threaded -rtsopts -with-rtsopts=-N
StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
build-depends:
base >=4.7 && <5
base
, containers
, scalie
, text
, vector
default-language: Haskell2010

22
src/Data/Map/Implicit.hs Normal file
View file

@ -0,0 +1,22 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeFamilies #-}
--
-- | A Map that derives the keys for the mapping from the items.
module Data.Map.Implicit (ImplicitMap(), get, ImplicitKeyOf(..), empty) where
import Data.Kind (Type, Constraint)
import Data.Map (Map)
import Data.Map qualified as Map
type ImplicitMap :: Type -> Type
type role ImplicitMap nominal
newtype ImplicitMap v = ImplicitMap { get :: Map (KeyType v) v }
type ImplicitKeyOf :: Type -> Constraint
class ImplicitKeyOf v where
type KeyType v :: Type
keyOf :: v -> KeyType v
empty :: ImplicitMap v
empty = ImplicitMap Map.empty

View file

@ -1 +1,2 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Ast () where

View file

@ -0,0 +1,28 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE TypeFamilies #-}
module Language.Scalie.Ast.Definition (Definition(..)) where
import Data.Kind (Type)
import Data.Text (Text)
import Language.Scalie.Domain.Type qualified as Scalie.Domain
import Language.Scalie.Ast.Definition.Body (DefinitionBody)
import Data.Map.Implicit (ImplicitKeyOf (KeyType, keyOf))
type Definition :: (Type -> Type) -> Type
type role Definition nominal
data Definition f = Definition
{ signature :: f Scalie.Domain.Type
-- ^ What is the type
, name :: f Text
-- ^ Which name will be used to refer to this definition
, body :: f (DefinitionBody f)
-- ^ What needs to be evaluated to get the value
}
instance ImplicitKeyOf (Definition f) where
type KeyType (Definition f) = f Text
keyOf :: Definition f -> KeyType (Definition f)
keyOf = name

View file

@ -0,0 +1,15 @@
{-# LANGUAGE Trustworthy #-} -- I declare trustworthiness because I only use Vector, I do not call any unsafe functions.
module Language.Scalie.Ast.Definition.Body (DefinitionBody(..)) where
import Data.Vector (Vector)
import Language.Scalie.Ast.Expression (Expression)
import Language.Scalie.Ast.Pattern (Pattern)
import Data.Kind (Type)
type DefinitionBody :: (Type -> Type) -> Type
type role DefinitionBody representational
data DefinitionBody f = DefinitionBody
{ arguments :: f (Vector Pattern)
, rhs :: f Expression
}

View file

@ -0,0 +1,9 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Ast.Expression (Expression(..)) where
import Prelude (Integer)
import Data.Kind (Type)
type Expression :: Type
data Expression
= RawInt Integer

View file

@ -0,0 +1,13 @@
{-# LANGUAGE Safe #-}
{-# LANGUAGE StandaloneKindSignatures #-}
module Language.Scalie.Ast.Module (Module(..)) where
import Data.Kind (Type)
import Language.Scalie.Ast.Definition (Definition)
import Data.Map.Implicit (ImplicitMap)
type Module :: (Type -> Type) -> Type
type role Module nominal
data Module f = Module
{ definitions :: ImplicitMap (Definition f)
}

View file

@ -0,0 +1,6 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Ast.Pattern (Pattern(..)) where
import Prelude (Integer)
data Pattern
= RawInt Integer

View file

@ -0,0 +1,8 @@
{-# LANGUAGE Safe #-}
module Language.Scalie.Domain.Type (Type(..)) where
import Data.Kind qualified
type Type :: Data.Kind.Type
data Type
= RawInt

View file

@ -19,6 +19,7 @@
# snapshot: https://example.com/snapshots/2024-01-01.yaml
snapshot:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/24/3.yaml
compiler: ghc-9.12.1
# User packages to be built.
# Various formats can be used as shown in the example below.