{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE OverloadedStrings #-}
module Swarm.Game.CESK (
Frame (..),
Cont,
WorldUpdate (..),
RobotUpdate (..),
Store,
Addr,
emptyStore,
allocate,
resolveValue,
lookupStore,
setStore,
CESK (..),
initMachine,
continue,
cancel,
prepareTerm,
finalValue,
suspendedEnv,
store,
cont,
) where
import Control.Lens (Lens', Traversal', lens, traversal, (^.))
import Data.Aeson (FromJSON (..), ToJSON (..), genericParseJSON, genericToJSON)
import Data.IntMap.Strict (IntMap)
import Data.IntMap.Strict qualified as IM
import GHC.Generics (Generic)
import Prettyprinter (Doc, Pretty (..), encloseSep, hsep, (<+>))
import Swarm.Game.Entity (Entity)
import Swarm.Game.Exception
import Swarm.Game.Ingredients (Count)
import Swarm.Game.Tick
import Swarm.Game.World (WorldUpdate (..))
import Swarm.Language.Elaborate (insertSuspend)
import Swarm.Language.Requirements.Type (Requirements)
import Swarm.Language.Syntax
import Swarm.Language.Types
import Swarm.Language.Value as V
import Swarm.Pretty (PrettyPrec (..), pparens, ppr)
import Swarm.Util.JSON (optionsMinimize)
data Frame
=
FSnd Term Env
|
FFst Value
|
FArg Term Env
|
FVArg Value
|
FApp Value
|
FLet Var (Maybe (Polytype, Requirements)) Term Env
|
FTry Value
|
FExec
|
FBind (Maybe Var) (Maybe (Polytype, Requirements)) Term Env
|
FImmediate Const [WorldUpdate Entity] [RobotUpdate]
|
FUpdate Addr
|
FFinishAtomic
|
FRcd Env [(Var, Value)] Var [(Var, Maybe Term)]
|
FProj Var
|
FSuspend Env
|
FRestoreEnv Env
deriving ((forall x. Frame -> Rep Frame x)
-> (forall x. Rep Frame x -> Frame) -> Generic Frame
forall x. Rep Frame x -> Frame
forall x. Frame -> Rep Frame x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Frame -> Rep Frame x
from :: forall x. Frame -> Rep Frame x
$cto :: forall x. Rep Frame x -> Frame
to :: forall x. Rep Frame x -> Frame
Generic)
instance ToJSON Frame where
toJSON :: Frame -> Value
toJSON = Options -> Frame -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
type Cont = [Frame]
type Addr = Int
data Store = Store {Store -> Addr
next :: Addr, Store -> IntMap Value
mu :: IntMap Value}
deriving ((forall x. Store -> Rep Store x)
-> (forall x. Rep Store x -> Store) -> Generic Store
forall x. Rep Store x -> Store
forall x. Store -> Rep Store x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Store -> Rep Store x
from :: forall x. Store -> Rep Store x
$cto :: forall x. Rep Store x -> Store
to :: forall x. Rep Store x -> Store
Generic, [Store] -> Value
[Store] -> Encoding
Store -> Bool
Store -> Value
Store -> Encoding
(Store -> Value)
-> (Store -> Encoding)
-> ([Store] -> Value)
-> ([Store] -> Encoding)
-> (Store -> Bool)
-> ToJSON Store
forall a.
(a -> Value)
-> (a -> Encoding)
-> ([a] -> Value)
-> ([a] -> Encoding)
-> (a -> Bool)
-> ToJSON a
$ctoJSON :: Store -> Value
toJSON :: Store -> Value
$ctoEncoding :: Store -> Encoding
toEncoding :: Store -> Encoding
$ctoJSONList :: [Store] -> Value
toJSONList :: [Store] -> Value
$ctoEncodingList :: [Store] -> Encoding
toEncodingList :: [Store] -> Encoding
$comitField :: Store -> Bool
omitField :: Store -> Bool
ToJSON)
emptyStore :: Store
emptyStore :: Store
emptyStore = Addr -> IntMap Value -> Store
Store Addr
0 IntMap Value
forall a. IntMap a
IM.empty
allocate :: Value -> Store -> (Addr, Store)
allocate :: Value -> Store -> (Addr, Store)
allocate Value
v (Store Addr
n IntMap Value
m) = (Addr
n, Addr -> IntMap Value -> Store
Store (Addr
n Addr -> Addr -> Addr
forall a. Num a => a -> a -> a
+ Addr
1) (Addr -> Value -> IntMap Value -> IntMap Value
forall a. Addr -> a -> IntMap a -> IntMap a
IM.insert Addr
n Value
v IntMap Value
m))
resolveValue :: Store -> Value -> Either Addr Value
resolveValue :: Store -> Value -> Either Addr Value
resolveValue Store
s = \case
VIndir Addr
loc -> Store -> Addr -> Either Addr Value
lookupStore Store
s Addr
loc
Value
v -> Value -> Either Addr Value
forall a b. b -> Either a b
Right Value
v
lookupStore :: Store -> Addr -> Either Addr Value
lookupStore :: Store -> Addr -> Either Addr Value
lookupStore Store
s = Addr -> Either Addr Value
go
where
go :: Addr -> Either Addr Value
go Addr
loc = case Addr -> IntMap Value -> Maybe Value
forall a. Addr -> IntMap a -> Maybe a
IM.lookup Addr
loc (Store -> IntMap Value
mu Store
s) of
Maybe Value
Nothing -> Addr -> Either Addr Value
forall a b. a -> Either a b
Left Addr
loc
Just Value
v -> case Value
v of
VIndir Addr
loc' -> Addr -> Either Addr Value
go Addr
loc'
Value
_ -> Value -> Either Addr Value
forall a b. b -> Either a b
Right Value
v
setStore :: Addr -> Value -> Store -> Store
setStore :: Addr -> Value -> Store -> Store
setStore Addr
n Value
c (Store Addr
nxt IntMap Value
m) = Addr -> IntMap Value -> Store
Store Addr
nxt (Addr -> Value -> IntMap Value -> IntMap Value
forall a. Addr -> a -> IntMap a -> IntMap a
IM.insert Addr
n Value
c IntMap Value
m)
data CESK
=
In Term Env Store Cont
|
Out Value Store Cont
|
Up Exn Store Cont
|
Waiting TickNumber CESK
|
Suspended Value Env Store Cont
deriving ((forall x. CESK -> Rep CESK x)
-> (forall x. Rep CESK x -> CESK) -> Generic CESK
forall x. Rep CESK x -> CESK
forall x. CESK -> Rep CESK x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. CESK -> Rep CESK x
from :: forall x. CESK -> Rep CESK x
$cto :: forall x. Rep CESK x -> CESK
to :: forall x. Rep CESK x -> CESK
Generic)
instance ToJSON CESK where
toJSON :: CESK -> Value
toJSON = Options -> CESK -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
finalValue :: CESK -> Maybe Value
{-# INLINE finalValue #-}
finalValue :: CESK -> Maybe Value
finalValue (Out Value
v Store
_ []) = Value -> Maybe Value
forall a. a -> Maybe a
Just Value
v
finalValue (Suspended Value
v Env
_ Store
_ []) = Value -> Maybe Value
forall a. a -> Maybe a
Just Value
v
finalValue CESK
_ = Maybe Value
forall a. Maybe a
Nothing
suspendedEnv :: Traversal' CESK Env
suspendedEnv :: Traversal' CESK Env
suspendedEnv = ((Env -> f Env) -> CESK -> f CESK)
-> (Env -> f Env) -> CESK -> f CESK
forall a (f :: * -> *) b s t.
((a -> f b) -> s -> f t) -> (a -> f b) -> s -> f t
traversal (Env -> f Env) -> CESK -> f CESK
Traversal' CESK Env
go
where
go :: Applicative f => (Env -> f Env) -> CESK -> f CESK
go :: Traversal' CESK Env
go Env -> f Env
f (Suspended Value
v Env
e Store
s [Frame]
k) = Value -> Env -> Store -> [Frame] -> CESK
Suspended Value
v (Env -> Store -> [Frame] -> CESK)
-> f Env -> f (Store -> [Frame] -> CESK)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Env -> f Env
f Env
e f (Store -> [Frame] -> CESK) -> f Store -> f ([Frame] -> CESK)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Store -> f Store
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Store
s f ([Frame] -> CESK) -> f [Frame] -> f CESK
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [Frame] -> f [Frame]
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure [Frame]
k
go Env -> f Env
_ CESK
cesk = CESK -> f CESK
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure CESK
cesk
store :: Lens' CESK Store
store :: Lens' CESK Store
store = (CESK -> Store) -> (CESK -> Store -> CESK) -> Lens' CESK Store
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens CESK -> Store
get CESK -> Store -> CESK
set
where
get :: CESK -> Store
get = \case
In Term
_ Env
_ Store
s [Frame]
_ -> Store
s
Out Value
_ Store
s [Frame]
_ -> Store
s
Up Exn
_ Store
s [Frame]
_ -> Store
s
Waiting TickNumber
_ CESK
c -> CESK -> Store
get CESK
c
Suspended Value
_ Env
_ Store
s [Frame]
_ -> Store
s
set :: CESK -> Store -> CESK
set CESK
cesk Store
s = case CESK
cesk of
In Term
t Env
e Store
_ [Frame]
k -> Term -> Env -> Store -> [Frame] -> CESK
In Term
t Env
e Store
s [Frame]
k
Out Value
v Store
_ [Frame]
k -> Value -> Store -> [Frame] -> CESK
Out Value
v Store
s [Frame]
k
Up Exn
x Store
_ [Frame]
k -> Exn -> Store -> [Frame] -> CESK
Up Exn
x Store
s [Frame]
k
Waiting TickNumber
t CESK
c -> TickNumber -> CESK -> CESK
Waiting TickNumber
t (CESK -> Store -> CESK
set CESK
c Store
s)
Suspended Value
v Env
e Store
_ [Frame]
k -> Value -> Env -> Store -> [Frame] -> CESK
Suspended Value
v Env
e Store
s [Frame]
k
cont :: Lens' CESK Cont
cont :: Lens' CESK [Frame]
cont = (CESK -> [Frame])
-> (CESK -> [Frame] -> CESK) -> Lens' CESK [Frame]
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
lens CESK -> [Frame]
get CESK -> [Frame] -> CESK
set
where
get :: CESK -> [Frame]
get = \case
In Term
_ Env
_ Store
_ [Frame]
k -> [Frame]
k
Out Value
_ Store
_ [Frame]
k -> [Frame]
k
Up Exn
_ Store
_ [Frame]
k -> [Frame]
k
Waiting TickNumber
_ CESK
c -> CESK -> [Frame]
get CESK
c
Suspended Value
_ Env
_ Store
_ [Frame]
k -> [Frame]
k
set :: CESK -> [Frame] -> CESK
set CESK
cesk [Frame]
k = case CESK
cesk of
In Term
t Env
e Store
s [Frame]
_ -> Term -> Env -> Store -> [Frame] -> CESK
In Term
t Env
e Store
s [Frame]
k
Out Value
v Store
s [Frame]
_ -> Value -> Store -> [Frame] -> CESK
Out Value
v Store
s [Frame]
k
Up Exn
x Store
s [Frame]
_ -> Exn -> Store -> [Frame] -> CESK
Up Exn
x Store
s [Frame]
k
Waiting TickNumber
t CESK
c -> TickNumber -> CESK -> CESK
Waiting TickNumber
t (CESK -> [Frame] -> CESK
set CESK
c [Frame]
k)
Suspended Value
v Env
e Store
s [Frame]
_ -> Value -> Env -> Store -> [Frame] -> CESK
Suspended Value
v Env
e Store
s [Frame]
k
initMachine :: TSyntax -> CESK
initMachine :: TSyntax -> CESK
initMachine TSyntax
t = Term -> Env -> Store -> [Frame] -> CESK
In (Env -> TSyntax -> Term
prepareTerm Env
V.emptyEnv TSyntax
t) Env
V.emptyEnv Store
emptyStore [Frame
FExec]
continue :: TSyntax -> CESK -> CESK
continue :: TSyntax -> CESK -> CESK
continue TSyntax
t = \case
Suspended Value
_ Env
e Store
s [Frame]
k -> Term -> Env -> Store -> [Frame] -> CESK
In (Term -> Term
insertSuspend (Term -> Term) -> Term -> Term
forall a b. (a -> b) -> a -> b
$ Env -> TSyntax -> Term
prepareTerm Env
e TSyntax
t) Env
e Store
s (Frame
FExec Frame -> [Frame] -> [Frame]
forall a. a -> [a] -> [a]
: Env -> Frame
FRestoreEnv Env
e Frame -> [Frame] -> [Frame]
forall a. a -> [a] -> [a]
: [Frame]
k)
CESK
cesk -> Term -> Env -> Store -> [Frame] -> CESK
In (Term -> Term
insertSuspend (Term -> Term) -> Term -> Term
forall a b. (a -> b) -> a -> b
$ Env -> TSyntax -> Term
prepareTerm Env
V.emptyEnv TSyntax
t) Env
V.emptyEnv (CESK
cesk CESK -> Getting Store CESK Store -> Store
forall s a. s -> Getting a s a -> a
^. Getting Store CESK Store
Lens' CESK Store
store) (Frame
FExec Frame -> [Frame] -> [Frame]
forall a. a -> [a] -> [a]
: (CESK
cesk CESK -> Getting [Frame] CESK [Frame] -> [Frame]
forall s a. s -> Getting a s a -> a
^. Getting [Frame] CESK [Frame]
Lens' CESK [Frame]
cont))
prepareTerm :: Env -> TSyntax -> Term
prepareTerm :: Env -> TSyntax -> Term
prepareTerm Env
e TSyntax
t = case TDCtx -> Type -> Type
whnfType (Env
e Env -> Getting TDCtx Env TDCtx -> TDCtx
forall s a. s -> Getting a s a -> a
^. Getting TDCtx Env TDCtx
Lens' Env TDCtx
envTydefs) (Poly 'Quantified Type -> Type
forall (q :: ImplicitQuantification) t. Poly q t -> t
ptBody (TSyntax
t TSyntax
-> Getting (Poly 'Quantified Type) TSyntax (Poly 'Quantified Type)
-> Poly 'Quantified Type
forall s a. s -> Getting a s a -> a
^. Getting (Poly 'Quantified Type) TSyntax (Poly 'Quantified Type)
forall ty (f :: * -> *).
Functor f =>
(ty -> f ty) -> Syntax' ty -> f (Syntax' ty)
sType)) of
TyCmd Type
_ -> Term
t'
Type
_ -> Term -> Term -> Term
TApp (Const -> Term
forall ty. Const -> Term' ty
TConst Const
Pure) Term
t'
where
t' :: Term
t' = TSyntax -> Term
forall ty. Syntax' ty -> Term
eraseS TSyntax
t
cancel :: CESK -> CESK
cancel :: CESK -> CESK
cancel CESK
cesk = Exn -> Store -> [Frame] -> CESK
Up Exn
Cancel (CESK
cesk CESK -> Getting Store CESK Store -> Store
forall s a. s -> Getting a s a -> a
^. Getting Store CESK Store
Lens' CESK Store
store) (CESK
cesk CESK -> Getting [Frame] CESK [Frame] -> [Frame]
forall s a. s -> Getting a s a -> a
^. Getting [Frame] CESK [Frame]
Lens' CESK [Frame]
cont)
instance PrettyPrec CESK where
prettyPrec :: forall ann. Addr -> CESK -> Doc ann
prettyPrec Addr
_ = \case
In Term
c Env
_ Store
_ [Frame]
k -> [Frame] -> (Addr, Doc ann) -> Doc ann
forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [Frame]
k (Addr
11, Doc ann
"▶" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Term
c Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"◀")
Out Value
v Store
_ [Frame]
k -> [Frame] -> (Addr, Doc ann) -> Doc ann
forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [Frame]
k (Addr
11, Doc ann
"◀" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr (Value -> Term
valueToTerm Value
v) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"▶")
Up Exn
e Store
_ [Frame]
k -> [Frame] -> (Addr, Doc ann) -> Doc ann
forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [Frame]
k (Addr
11, Doc ann
"!" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> (Var -> Doc ann
forall ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (EntityMap -> Exn -> Var
formatExn EntityMap
forall a. Monoid a => a
mempty Exn
e) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"!"))
Waiting TickNumber
t CESK
cesk -> Doc ann
"🕑" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> TickNumber -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. TickNumber -> Doc ann
pretty TickNumber
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> CESK -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr CESK
cesk Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")"
Suspended Value
v Env
_ Store
_ [Frame]
k -> [Frame] -> (Addr, Doc ann) -> Doc ann
forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [Frame]
k (Addr
11, Doc ann
"◀" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr (Value -> Term
valueToTerm Value
v) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"...▶")
prettyCont :: Cont -> (Int, Doc ann) -> Doc ann
prettyCont :: forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [] (Addr
_, Doc ann
inner) = Doc ann
inner
prettyCont (Frame
f : [Frame]
k) (Addr, Doc ann)
inner = [Frame] -> (Addr, Doc ann) -> Doc ann
forall ann. [Frame] -> (Addr, Doc ann) -> Doc ann
prettyCont [Frame]
k (Frame -> (Addr, Doc ann) -> (Addr, Doc ann)
forall ann. Frame -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyFrame Frame
f (Addr, Doc ann)
inner)
prettyFrame :: Frame -> (Int, Doc ann) -> (Int, Doc ann)
prettyFrame :: forall ann. Frame -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyFrame Frame
f (Addr
p, Doc ann
inner) = case Frame
f of
FSnd Term
t Env
_ -> (Addr
11, Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Term
t Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")")
FFst Value
v -> (Addr
11, Doc ann
"(" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr (Value -> Term
valueToTerm Value
v) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"," Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
")")
FArg Term
t Env
_ -> (Addr
10, Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
10) Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr -> Term -> Doc ann
forall ann. Addr -> Term -> Doc ann
forall a ann. PrettyPrec a => Addr -> a -> Doc ann
prettyPrec Addr
11 Term
t)
FVArg Value
v -> (Addr
10, Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
10) Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr -> Term -> Doc ann
forall ann. Addr -> Term -> Doc ann
forall a ann. PrettyPrec a => Addr -> a -> Doc ann
prettyPrec Addr
11 (Value -> Term
valueToTerm Value
v))
FApp Value
v -> (Addr
10, Addr -> Term -> Doc ann
forall ann. Addr -> Term -> Doc ann
forall a ann. PrettyPrec a => Addr -> a -> Doc ann
prettyPrec Addr
10 (Value -> Term
valueToTerm Value
v) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner)
FLet Var
x Maybe (Poly 'Quantified Type, Requirements)
_ Term
t Env
_ -> (Addr
11, [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep [Doc ann
"let", Var -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Var
x, Doc ann
"=", Doc ann
inner, Doc ann
"in", Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Term
t])
FTry Value
v -> (Addr
10, Doc ann
"try" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Addr -> Term -> Doc ann
forall ann. Addr -> Term -> Doc ann
forall a ann. PrettyPrec a => Addr -> a -> Doc ann
prettyPrec Addr
11 (Value -> Term
valueToTerm Value
v))
Frame
FExec -> Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
forall ann. Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyPrefix Doc ann
"E·" (Addr
p, Doc ann
inner)
FBind Maybe Var
Nothing Maybe (Poly 'Quantified Type, Requirements)
_ Term
t Env
_ -> (Addr
0, Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
1) Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Term
t)
FBind (Just Var
x) Maybe (Poly 'Quantified Type, Requirements)
_ Term
t Env
_ -> (Addr
0, [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep [Var -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Var
x, Doc ann
"<-", Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
1) Doc ann
inner, Doc ann
";", Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Term
t])
FImmediate Const
c [WorldUpdate Entity]
_worldUpds [RobotUpdate]
_robotUpds -> Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
forall ann. Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyPrefix (Doc ann
"I[" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Const -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Const
c Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"]·") (Addr
p, Doc ann
inner)
FUpdate {} -> (Addr
p, Doc ann
inner)
Frame
FFinishAtomic -> Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
forall ann. Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyPrefix Doc ann
"A·" (Addr
p, Doc ann
inner)
FRcd Env
_ [(Var, Value)]
done Var
foc [(Var, Maybe Term)]
rest -> (Addr
11, Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep Doc ann
"[" Doc ann
"]" Doc ann
", " ([Doc ann]
forall {ann}. [Doc ann]
pDone [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a] -> [a]
++ [Doc ann
pFoc] [Doc ann] -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a] -> [a]
++ [Doc ann]
forall {ann}. [Doc ann]
pRest))
where
pDone :: [Doc ann]
pDone = ((Var, Value) -> Doc ann) -> [(Var, Value)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (\(Var
x, Value
v) -> Var -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Var
x Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Term -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr (Value -> Term
valueToTerm Value
v)) ([(Var, Value)] -> [(Var, Value)]
forall a. [a] -> [a]
reverse [(Var, Value)]
done)
pFoc :: Doc ann
pFoc = Var -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Var
foc Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
inner
pRest :: [Doc ann]
pRest = ((Var, Maybe Term) -> Doc ann) -> [(Var, Maybe Term)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (Var, Maybe Term) -> Doc ann
forall {a} {a} {ann}.
(PrettyPrec a, PrettyPrec a) =>
(a, Maybe a) -> Doc ann
pprEq [(Var, Maybe Term)]
rest
pprEq :: (a, Maybe a) -> Doc ann
pprEq (a
x, Maybe a
Nothing) = a -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr a
x
pprEq (a
x, Just a
t) = a -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr a
x Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"=" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> a -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr a
t
FProj Var
x -> (Addr
11, Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Var -> Doc ann
forall a ann. PrettyPrec a => a -> Doc ann
ppr Var
x)
FSuspend Env
_ -> (Addr
10, Doc ann
"suspend" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner)
FRestoreEnv Env
_ -> (Addr
10, Doc ann
"restore" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner)
prettyPrefix :: Doc ann -> (Int, Doc ann) -> (Int, Doc ann)
prettyPrefix :: forall ann. Doc ann -> (Addr, Doc ann) -> (Addr, Doc ann)
prettyPrefix Doc ann
pre (Addr
p, Doc ann
inner) = (Addr
11, Doc ann
pre Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bool -> Doc ann -> Doc ann
forall ann. Bool -> Doc ann -> Doc ann
pparens (Addr
p Addr -> Addr -> Bool
forall a. Ord a => a -> a -> Bool
< Addr
11) Doc ann
inner)
data RobotUpdate
=
AddEntity Count Entity
|
LearnEntity Entity
deriving (RobotUpdate -> RobotUpdate -> Bool
(RobotUpdate -> RobotUpdate -> Bool)
-> (RobotUpdate -> RobotUpdate -> Bool) -> Eq RobotUpdate
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: RobotUpdate -> RobotUpdate -> Bool
== :: RobotUpdate -> RobotUpdate -> Bool
$c/= :: RobotUpdate -> RobotUpdate -> Bool
/= :: RobotUpdate -> RobotUpdate -> Bool
Eq, Eq RobotUpdate
Eq RobotUpdate =>
(RobotUpdate -> RobotUpdate -> Ordering)
-> (RobotUpdate -> RobotUpdate -> Bool)
-> (RobotUpdate -> RobotUpdate -> Bool)
-> (RobotUpdate -> RobotUpdate -> Bool)
-> (RobotUpdate -> RobotUpdate -> Bool)
-> (RobotUpdate -> RobotUpdate -> RobotUpdate)
-> (RobotUpdate -> RobotUpdate -> RobotUpdate)
-> Ord RobotUpdate
RobotUpdate -> RobotUpdate -> Bool
RobotUpdate -> RobotUpdate -> Ordering
RobotUpdate -> RobotUpdate -> RobotUpdate
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: RobotUpdate -> RobotUpdate -> Ordering
compare :: RobotUpdate -> RobotUpdate -> Ordering
$c< :: RobotUpdate -> RobotUpdate -> Bool
< :: RobotUpdate -> RobotUpdate -> Bool
$c<= :: RobotUpdate -> RobotUpdate -> Bool
<= :: RobotUpdate -> RobotUpdate -> Bool
$c> :: RobotUpdate -> RobotUpdate -> Bool
> :: RobotUpdate -> RobotUpdate -> Bool
$c>= :: RobotUpdate -> RobotUpdate -> Bool
>= :: RobotUpdate -> RobotUpdate -> Bool
$cmax :: RobotUpdate -> RobotUpdate -> RobotUpdate
max :: RobotUpdate -> RobotUpdate -> RobotUpdate
$cmin :: RobotUpdate -> RobotUpdate -> RobotUpdate
min :: RobotUpdate -> RobotUpdate -> RobotUpdate
Ord, Addr -> RobotUpdate -> ShowS
[RobotUpdate] -> ShowS
RobotUpdate -> String
(Addr -> RobotUpdate -> ShowS)
-> (RobotUpdate -> String)
-> ([RobotUpdate] -> ShowS)
-> Show RobotUpdate
forall a.
(Addr -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Addr -> RobotUpdate -> ShowS
showsPrec :: Addr -> RobotUpdate -> ShowS
$cshow :: RobotUpdate -> String
show :: RobotUpdate -> String
$cshowList :: [RobotUpdate] -> ShowS
showList :: [RobotUpdate] -> ShowS
Show, (forall x. RobotUpdate -> Rep RobotUpdate x)
-> (forall x. Rep RobotUpdate x -> RobotUpdate)
-> Generic RobotUpdate
forall x. Rep RobotUpdate x -> RobotUpdate
forall x. RobotUpdate -> Rep RobotUpdate x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. RobotUpdate -> Rep RobotUpdate x
from :: forall x. RobotUpdate -> Rep RobotUpdate x
$cto :: forall x. Rep RobotUpdate x -> RobotUpdate
to :: forall x. Rep RobotUpdate x -> RobotUpdate
Generic)
instance ToJSON RobotUpdate where
toJSON :: RobotUpdate -> Value
toJSON = Options -> RobotUpdate -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
optionsMinimize
instance FromJSON RobotUpdate where
parseJSON :: Value -> Parser RobotUpdate
parseJSON = Options -> Value -> Parser RobotUpdate
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
optionsMinimize