it's also a comonad. lol.

This commit is contained in:
crumbtoo
2024-01-26 17:53:05 -07:00
parent 8d0f324c63
commit e00e4d3418
3 changed files with 30 additions and 2 deletions

View File

@@ -70,6 +70,7 @@ library
, utf8-string >= 1.0.2 && < 1.1 , utf8-string >= 1.0.2 && < 1.1
, extra >= 1.7.0 && < 2 , extra >= 1.7.0 && < 2
, semigroupoids , semigroupoids
, comonad
hs-source-dirs: src hs-source-dirs: src
default-language: GHC2021 default-language: GHC2021

View File

@@ -13,6 +13,9 @@ import Lens.Micro.Platform
import Data.List.Extra import Data.List.Extra
import Data.Fix import Data.Fix
import Data.Functor.Const import Data.Functor.Const
import Data.Functor.Apply
import Data.Functor.Bind
import Control.Comonad
import Data.Functor import Data.Functor
import Data.Text qualified as T import Data.Text qualified as T
import Data.Void import Data.Void
@@ -125,14 +128,14 @@ Params : {- epsilon -} { [] }
Pat1 :: { Pat' RlpcPs } Pat1 :: { Pat' RlpcPs }
: Var { undefined } : Var { undefined }
| Lit { LitP <$> $1 } | Lit { LitP <<= $1 }
Expr :: { RlpExpr' RlpcPs } Expr :: { RlpExpr' RlpcPs }
: Expr1 varsym Expr { undefined } : Expr1 varsym Expr { undefined }
| Expr1 { $1 } | Expr1 { $1 }
Expr1 :: { RlpExpr' RlpcPs } Expr1 :: { RlpExpr' RlpcPs }
: '(' Expr ')' { fmap ParE' $2 } : '(' Expr ')' { $1 .> $2 <. $3 }
| Lit { fmap LitE' $1 } | Lit { fmap LitE' $1 }
| Var { fmap VarE' $1 } | Var { fmap VarE' $1 }

View File

@@ -27,6 +27,7 @@ import Core.Syntax (Name)
import Control.Monad import Control.Monad
import Control.Monad.State.Strict import Control.Monad.State.Strict
import Control.Monad.Errorful import Control.Monad.Errorful
import Control.Comonad
import Compiler.RlpcError import Compiler.RlpcError
import Data.Text (Text) import Data.Text (Text)
import Data.Maybe import Data.Maybe
@@ -35,6 +36,7 @@ import Data.Functor.Foldable
import Data.Functor.Const import Data.Functor.Const
import Data.Functor.Classes import Data.Functor.Classes
import Data.Functor.Apply import Data.Functor.Apply
import Data.Functor.Bind
import Data.HashMap.Strict qualified as H import Data.HashMap.Strict qualified as H
import Data.Void import Data.Void
import Data.Word (Word8) import Data.Word (Word8)
@@ -177,6 +179,28 @@ instance Apply Located where
LT -> max sa (ab + sb) LT -> max sa (ab + sb)
GT -> max sb (aa + sa) GT -> max sb (aa + sa)
instance Bind Located where
Located sa a >>- k = Located (sa `spanAcross` sb) b
where
Located sb b = k a
spanAcross :: (Int, Int, Int, Int)
-> (Int, Int, Int, Int)
-> (Int, Int, Int, Int)
spanAcross (la,ca,aa,sa) (lb,cb,ab,sb) = (l,c,a,s)
where
l = min la lb
c = min ca cb
a = min aa ab
s = case aa `compare` ab of
EQ -> max sa sb
LT -> max sa (ab + sb)
GT -> max sb (aa + sa)
instance Comonad Located where
extract (Located _ a) = a
extend ck w@(Located p _) = Located p (ck w)
spanFromPos :: Position -> Int -> (Int, Int, Int, Int) spanFromPos :: Position -> Int -> (Int, Int, Int, Int)
spanFromPos (l,c,a) s = (l,c,a,s) spanFromPos (l,c,a) s = (l,c,a,s)