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> description: Please see the README on GitHub at <https://github.com/githubuser/scalie#readme>
default-extensions: default-extensions:
- Safe - ImportQualifiedPost
- NoImplicitPrelude - NoImplicitPrelude
- StandaloneKindSignatures
- RoleAnnotations
dependencies: dependencies:
- base >= 4.7 && < 5 - base
- containers
- text
- vector
ghc-options: ghc-options:
- -Weverything - -Weverything
- -Wno-unsafe
library: library:
source-dirs: src source-dirs: src

View file

@ -19,17 +19,30 @@ extra-source-files:
library library
exposed-modules: exposed-modules:
Control.Ord.LexicographicallySorted
Data.Map.Implicit
Language.Scalie.Ast 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: other-modules:
Paths_scalie Paths_scalie
hs-source-dirs: hs-source-dirs:
src src
default-extensions: default-extensions:
Safe ImportQualifiedPost
NoImplicitPrelude NoImplicitPrelude
ghc-options: -Weverything StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe
build-depends: build-depends:
base >=4.7 && <5 base
, containers
, text
, vector
default-language: Haskell2010 default-language: Haskell2010
executable scalie-exe executable scalie-exe
@ -39,12 +52,17 @@ executable scalie-exe
hs-source-dirs: hs-source-dirs:
app app
default-extensions: default-extensions:
Safe ImportQualifiedPost
NoImplicitPrelude NoImplicitPrelude
ghc-options: -Weverything -threaded -rtsopts -with-rtsopts=-N StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
build-depends: build-depends:
base >=4.7 && <5 base
, containers
, scalie , scalie
, text
, vector
default-language: Haskell2010 default-language: Haskell2010
test-suite scalie-test test-suite scalie-test
@ -55,10 +73,15 @@ test-suite scalie-test
hs-source-dirs: hs-source-dirs:
test test
default-extensions: default-extensions:
Safe ImportQualifiedPost
NoImplicitPrelude NoImplicitPrelude
ghc-options: -Weverything -threaded -rtsopts -with-rtsopts=-N StandaloneKindSignatures
RoleAnnotations
ghc-options: -Weverything -Wno-unsafe -threaded -rtsopts -with-rtsopts=-N
build-depends: build-depends:
base >=4.7 && <5 base
, containers
, scalie , scalie
, text
, vector
default-language: Haskell2010 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 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: https://example.com/snapshots/2024-01-01.yaml
snapshot: snapshot:
url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/24/3.yaml url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/24/3.yaml
compiler: ghc-9.12.1
# User packages to be built. # User packages to be built.
# Various formats can be used as shown in the example below. # Various formats can be used as shown in the example below.