feat: Ability to specify integer definitions
This commit is contained in:
parent
4bd766027f
commit
bf525c2dfd
11 changed files with 142 additions and 12 deletions
10
package.yaml
10
package.yaml
|
@ -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
|
||||||
|
|
41
scalie.cabal
41
scalie.cabal
|
@ -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
22
src/Data/Map/Implicit.hs
Normal 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
|
|
@ -1 +0,0 @@
|
||||||
module Language.Scalie.Ast () where
|
|
28
src/Language/Scalie/Ast/Definition.hs
Normal file
28
src/Language/Scalie/Ast/Definition.hs
Normal 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
|
||||||
|
|
15
src/Language/Scalie/Ast/Definition/Body.hs
Normal file
15
src/Language/Scalie/Ast/Definition/Body.hs
Normal 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
|
||||||
|
}
|
9
src/Language/Scalie/Ast/Expression.hs
Normal file
9
src/Language/Scalie/Ast/Expression.hs
Normal 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
|
13
src/Language/Scalie/Ast/Module.hs
Normal file
13
src/Language/Scalie/Ast/Module.hs
Normal 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)
|
||||||
|
}
|
6
src/Language/Scalie/Ast/Pattern.hs
Normal file
6
src/Language/Scalie/Ast/Pattern.hs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{-# LANGUAGE Safe #-}
|
||||||
|
module Language.Scalie.Ast.Pattern (Pattern(..)) where
|
||||||
|
import Prelude (Integer)
|
||||||
|
|
||||||
|
data Pattern
|
||||||
|
= RawInt Integer
|
8
src/Language/Scalie/Domain/Type.hs
Normal file
8
src/Language/Scalie/Domain/Type.hs
Normal 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
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue