{-# 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.Context
import Swarm.Language.Elaborate (insertSuspend)
import Swarm.Language.Pretty
import Swarm.Language.Requirements.Type (Requirements)
import Swarm.Language.Syntax
import Swarm.Language.Types
import Swarm.Language.Value as V
import Swarm.Util.JSON (optionsMinimize)
data Frame
=
FSnd Term Env
|
FFst Value
|
FArg Term Env
|
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 (Frame -> Frame -> Bool
(Frame -> Frame -> Bool) -> (Frame -> Frame -> Bool) -> Eq Frame
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Frame -> Frame -> Bool
== :: Frame -> Frame -> Bool
$c/= :: Frame -> Frame -> Bool
/= :: Frame -> Frame -> Bool
Eq, Addr -> Frame -> ShowS
[Frame] -> ShowS
Frame -> String
(Addr -> Frame -> ShowS)
-> (Frame -> String) -> ([Frame] -> ShowS) -> Show Frame
forall a.
(Addr -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Addr -> Frame -> ShowS
showsPrec :: Addr -> Frame -> ShowS
$cshow :: Frame -> String
show :: Frame -> String
$cshowList :: [Frame] -> ShowS
showList :: [Frame] -> ShowS
Show, (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
instance FromJSON Frame where
parseJSON :: Value -> Parser Frame
parseJSON = Options -> Value -> Parser Frame
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON Options
optionsMinimize
type Cont = [Frame]
type Addr = Int
data Store = Store {Store -> Addr
next :: Addr, Store -> IntMap Value
mu :: IntMap Value}
deriving (Addr -> Store -> ShowS
[Store] -> ShowS
Store -> String
(Addr -> Store -> ShowS)
-> (Store -> String) -> ([Store] -> ShowS) -> Show Store
forall a.
(Addr -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Addr -> Store -> ShowS
showsPrec :: Addr -> Store -> ShowS
$cshow :: Store -> String
show :: Store -> String
$cshowList :: [Store] -> ShowS
showList :: [Store] -> ShowS
Show, Store -> Store -> Bool
(Store -> Store -> Bool) -> (Store -> Store -> Bool) -> Eq Store
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Store -> Store -> Bool
== :: Store -> Store -> Bool
$c/= :: Store -> Store -> Bool
/= :: Store -> Store -> Bool
Eq, (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, Maybe Store
Value -> Parser [Store]
Value -> Parser Store
(Value -> Parser Store)
-> (Value -> Parser [Store]) -> Maybe Store -> FromJSON Store
forall a.
(Value -> Parser a)
-> (Value -> Parser [a]) -> Maybe a -> FromJSON a
$cparseJSON :: Value -> Parser Store
parseJSON :: Value -> Parser Store
$cparseJSONList :: Value -> Parser [Store]
parseJSONList :: Value -> Parser [Store]
$comittedField :: Maybe Store
omittedField :: Maybe Store
FromJSON, [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 (CESK -> CESK -> Bool
(CESK -> CESK -> Bool) -> (CESK -> CESK -> Bool) -> Eq CESK
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CESK -> CESK -> Bool
== :: CESK -> CESK -> Bool
$c/= :: CESK -> CESK -> Bool
/= :: CESK -> CESK -> Bool
Eq, Addr -> CESK -> ShowS
[CESK] -> ShowS
CESK -> String
(Addr -> CESK -> ShowS)
-> (CESK -> String) -> ([CESK] -> ShowS) -> Show CESK
forall a.
(Addr -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Addr -> CESK -> ShowS
showsPrec :: Addr -> CESK -> ShowS
$cshow :: CESK -> String
show :: CESK -> String
$cshowList :: [CESK] -> ShowS
showList :: [CESK] -> ShowS
Show, (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
instance FromJSON CESK where
parseJSON :: Value -> Parser CESK
parseJSON = Options -> Value -> Parser CESK
forall a.
(Generic a, GFromJSON Zero (Rep a)) =>
Options -> Value -> Parser a
genericParseJSON 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
forall a. Monoid a => a
mempty TSyntax
t) Env
forall a. Monoid a => a
mempty 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
forall a. Monoid a => a
mempty TSyntax
t) Env
forall a. Monoid a => a
mempty (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 Type -> Type
forall t. Poly t -> t
ptBody (TSyntax
t TSyntax -> Getting (Poly Type) TSyntax (Poly Type) -> Poly Type
forall s a. s -> Getting a s a -> a
^. Getting (Poly Type) TSyntax (Poly 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
Return) 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)
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 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 ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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 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 Type, Requirements)
_ Term
t Env
_ -> (Addr
0, [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep [Var -> Doc ann
forall ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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 ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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 ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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}.
(Pretty 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 ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
x
pprEq (a
x, Just a
t) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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 ann. Var -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty 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