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

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

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


data Axiom =
  Axiom
    { Axiom -> VariableIndex
variable :: VariableIndex
    , Axiom -> Seq VariableAssignment
conditions :: Seq VariableAssignment
    , Axiom -> DomainIndex
pre :: DomainIndex
    , Axiom -> DomainIndex
post :: DomainIndex
    }
  deriving
    ( Int -> Axiom -> ShowS
[Axiom] -> ShowS
Axiom -> String
(Int -> Axiom -> ShowS)
-> (Axiom -> String) -> ([Axiom] -> ShowS) -> Show Axiom
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Axiom] -> ShowS
$cshowList :: [Axiom] -> ShowS
show :: Axiom -> String
$cshow :: Axiom -> String
showsPrec :: Int -> Axiom -> ShowS
$cshowsPrec :: Int -> Axiom -> ShowS
Show )


toSAS :: Axiom -> Data.Text.Lazy.Builder.Builder
toSAS :: Axiom -> Builder
toSAS Axiom{Seq VariableAssignment
DomainIndex
VariableIndex
post :: DomainIndex
pre :: DomainIndex
conditions :: Seq VariableAssignment
variable :: VariableIndex
post :: Axiom -> DomainIndex
pre :: Axiom -> DomainIndex
conditions :: Axiom -> Seq VariableAssignment
variable :: Axiom -> VariableIndex
..} =
     Builder
"begin_rule\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
conditions ) 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
conditions
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> VariableIndex -> Builder
VariableIndex.toSAS VariableIndex
variable Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
" " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> DomainIndex -> Builder
DomainIndex.toSAS DomainIndex
pre Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
" " Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> DomainIndex -> Builder
DomainIndex.toSAS DomainIndex
post Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"\n"
  Builder -> Builder -> Builder
forall a. Semigroup a => a -> a -> a
<> Builder
"end_rule"