{-# language OverloadedStrings #-}
{-# language RecordWildCards #-}

module FastDownward.SAS.Operator ( Operator(..), toSAS ) where

import Data.Sequence ( Seq )
import qualified Data.Sequence as Seq
import qualified Data.Text.Lazy
import qualified Data.Text.Lazy.Builder
import qualified Data.Text.Lazy.Builder.Int
import FastDownward.SAS.Effect ( Effect )
import qualified FastDownward.SAS.Effect as Effect
import FastDownward.SAS.VariableAssignment ( VariableAssignment )
import qualified FastDownward.SAS.VariableAssignment as VariableAssignment


data Operator =
  Operator
    { Operator -> Text
name :: Data.Text.Lazy.Text
    , Operator -> Seq VariableAssignment
prevail :: Seq VariableAssignment
    , Operator -> Seq Effect
effects :: Seq Effect
    }
  deriving
    ( Int -> Operator -> ShowS
[Operator] -> ShowS
Operator -> String
(Int -> Operator -> ShowS)
-> (Operator -> String) -> ([Operator] -> ShowS) -> Show Operator
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Operator] -> ShowS
$cshowList :: [Operator] -> ShowS
show :: Operator -> String
$cshow :: Operator -> String
showsPrec :: Int -> Operator -> ShowS
$cshowsPrec :: Int -> Operator -> ShowS
Show )


toSAS :: Operator -> Data.Text.Lazy.Builder.Builder
toSAS :: Operator -> Builder
toSAS Operator{Seq VariableAssignment
Seq Effect
Text
effects :: Seq Effect
prevail :: Seq VariableAssignment
name :: Text
effects :: Operator -> Seq Effect
prevail :: Operator -> Seq VariableAssignment
name :: Operator -> Text
..} =
     Builder
"begin_operator\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Text -> Builder
Data.Text.Lazy.Builder.fromLazyText Text
name Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
Data.Text.Lazy.Builder.Int.decimal ( Seq VariableAssignment -> Int
forall a. Seq a -> Int
Seq.length Seq VariableAssignment
prevail ) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (VariableAssignment -> Builder)
-> Seq VariableAssignment -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ( \VariableAssignment
x -> VariableAssignment -> Builder
VariableAssignment.toSAS VariableAssignment
x Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n" ) Seq VariableAssignment
prevail
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Int -> Builder
forall a. Integral a => a -> Builder
Data.Text.Lazy.Builder.Int.decimal ( Seq Effect -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length Seq Effect
effects ) Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> (Effect -> Builder) -> Seq Effect -> Builder
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ( \Effect
x -> Effect -> Builder
Effect.toSAS Effect
x Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n" ) Seq Effect
effects
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"0\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"end_operator"