1
1
mirror of https://github.com/github/semantic.git synced 2024-12-26 08:25:19 +03:00

Fix Core.Core.

This commit is contained in:
Rob Rix 2019-10-28 11:09:41 -04:00
parent e4dfe76ce9
commit c2a1a298a8
No known key found for this signature in database
GPG Key ID: F188A01508EA1CF7

View File

@ -36,8 +36,8 @@ module Core.Core
, stripAnnotations , stripAnnotations
) where ) where
import Control.Algebra
import Control.Applicative (Alternative (..)) import Control.Applicative (Alternative (..))
import Control.Carrier
import Core.Name import Core.Name
import Data.Bifunctor (Bifunctor (..)) import Data.Bifunctor (Bifunctor (..))
import Data.Foldable (foldl') import Data.Foldable (foldl')
@ -47,8 +47,10 @@ import Data.Text (Text)
import GHC.Generics (Generic1) import GHC.Generics (Generic1)
import GHC.Stack import GHC.Stack
import Source.Span import Source.Span
import Syntax.Functor
import Syntax.Scope import Syntax.Scope
import Syntax.Stack import Syntax.Stack
import Syntax.Sum
import Syntax.Module import Syntax.Module
import Syntax.Term import Syntax.Term
@ -89,6 +91,24 @@ infixl 9 :.
infix 3 := infix 3 :=
instance HFunctor Core instance HFunctor Core
instance Effect Core where
type CanHandle Core ctx = Traversable ctx
handle ctx dst = \case
Rec b -> Rec (handle ctx dst <$> b)
a :>> b -> dst (a <$ ctx) :>> dst (b <$ ctx)
a :>>= f -> (dst . (<$ ctx) <$> a) :>>= handle ctx dst f
Lam b -> Lam (handle ctx dst <$> b)
f :$ a -> dst (f <$ ctx) :$ dst (a <$ ctx)
Unit -> Unit
Bool b -> Bool b
If c t e -> If (dst (c <$ ctx)) (dst (t <$ ctx)) (dst (e <$ ctx))
String s -> String s
Load t -> Load (dst (t <$ ctx))
Record fs -> Record (map (fmap (dst . (<$ ctx))) fs)
f :. n -> dst (f <$ ctx) :. n
f :? n -> dst (f <$ ctx) :? n
f := a -> dst (f <$ ctx) := dst (a <$ ctx)
deriving instance (Eq a, forall a . Eq a => Eq (f a), Monad f) => Eq (Core f a) deriving instance (Eq a, forall a . Eq a => Eq (f a), Monad f) => Eq (Core f a)
deriving instance (Ord a, forall a . Eq a => Eq (f a) deriving instance (Ord a, forall a . Eq a => Eq (f a)
@ -120,7 +140,7 @@ a >>> b = send (a :>> b)
infixr 1 >>> infixr 1 >>>
unseq :: (Alternative m, Member Core sig) => Term sig a -> m (Term sig a, Term sig a) unseq :: (Alternative m, Project Core sig) => Term sig a -> m (Term sig a, Term sig a)
unseq (Alg sig) | Just (a :>> b) <- prj sig = pure (a, b) unseq (Alg sig) | Just (a :>> b) <- prj sig = pure (a, b)
unseq _ = empty unseq _ = empty
@ -137,7 +157,7 @@ Named u n :<- a >>>= b = send (Named u a :>>= abstract1 n b)
infixr 1 >>>= infixr 1 >>>=
unbind :: (Alternative m, Member Core sig, RightModule sig) => a -> Term sig a -> m (Named a :<- Term sig a, Term sig a) unbind :: (Alternative m, Project Core sig, RightModule sig) => a -> Term sig a -> m (Named a :<- Term sig a, Term sig a)
unbind n (Alg sig) | Just (Named u a :>>= b) <- prj sig = pure (Named u n :<- a, instantiate1 (pure n) b) unbind n (Alg sig) | Just (Named u a :>>= b) <- prj sig = pure (Named u n :<- a, instantiate1 (pure n) b)
unbind _ _ = empty unbind _ _ = empty
@ -166,7 +186,7 @@ lam (Named u n) b = send (Lam (Named u (abstract1 n b)))
lams :: (Eq a, Foldable t, Has Core sig m) => t (Named a) -> m a -> m a lams :: (Eq a, Foldable t, Has Core sig m) => t (Named a) -> m a -> m a
lams names body = foldr lam body names lams names body = foldr lam body names
unlam :: (Alternative m, Member Core sig, RightModule sig) => a -> Term sig a -> m (Named a, Term sig a) unlam :: (Alternative m, Project Core sig, RightModule sig) => a -> Term sig a -> m (Named a, Term sig a)
unlam n (Alg sig) | Just (Lam b) <- prj sig = pure (n <$ b, instantiate1 (pure n) (namedValue b)) unlam n (Alg sig) | Just (Lam b) <- prj sig = pure (n <$ b, instantiate1 (pure n) (namedValue b))
unlam _ _ = empty unlam _ _ = empty
@ -181,7 +201,7 @@ infixl 8 $$
infixl 8 $$* infixl 8 $$*
unapply :: (Alternative m, Member Core sig) => Term sig a -> m (Term sig a, Term sig a) unapply :: (Alternative m, Project Core sig) => Term sig a -> m (Term sig a, Term sig a)
unapply (Alg sig) | Just (f :$ a) <- prj sig = pure (f, a) unapply (Alg sig) | Just (f :$ a) <- prj sig = pure (f, a)
unapply _ = empty unapply _ = empty
@ -229,6 +249,8 @@ data Ann ann f a
deriving (Eq, Foldable, Functor, Generic1, Ord, Show, Traversable) deriving (Eq, Foldable, Functor, Generic1, Ord, Show, Traversable)
instance HFunctor (Ann ann) instance HFunctor (Ann ann)
instance Effect (Ann ann) where
handle ctx dst (Ann a b) = Ann a (dst (b <$ ctx))
instance RightModule (Ann ann) where instance RightModule (Ann ann) where
Ann l b >>=* f = Ann l (b >>= f) Ann l b >>=* f = Ann l (b >>= f)
@ -244,7 +266,7 @@ annWith :: Has (Ann Span) sig m => CallStack -> m a -> m a
annWith callStack = maybe id (annAt . spanFromSrcLoc . snd) (listToMaybe (getCallStack callStack)) annWith callStack = maybe id (annAt . spanFromSrcLoc . snd) (listToMaybe (getCallStack callStack))
stripAnnotations :: forall ann a sig . (HFunctor sig, forall g . Functor g => Functor (sig g)) => Term (Ann ann :+: sig) a -> Term sig a stripAnnotations :: forall ann a sig . RightModule sig => Term (Ann ann :+: sig) a -> Term sig a
stripAnnotations (Var v) = Var v stripAnnotations (Var v) = Var v
stripAnnotations (Alg (L (Ann _ b))) = stripAnnotations b stripAnnotations (Alg (L (Ann _ b))) = stripAnnotations b
stripAnnotations (Alg (R b)) = Alg (hmap stripAnnotations b) stripAnnotations (Alg (R b)) = Alg (hmap stripAnnotations b)