module Data.Crjdt.Internal.Core where
import Data.Text
import Data.Void
import Data.Set (Set)
import Control.Monad.Free
import Control.Applicative
import Data.String
import Data.Crjdt.Types
data Val
= Number Int
| StringLit Text
| BoolLit Bool
| Null
| EmptyObject
| EmptyArray
deriving (Show, Eq)
instance IsString Val where
fromString = StringLit . pack
data Cmd a
= Let !Text !Expr (Expr -> a)
| Assign !Expr !Val a
| InsertAfter !Expr !Val a
| Delete !Expr a
| Values !Expr ([Val] -> a)
| Keys !Expr (Set (Key Void) -> a)
| Yield a
deriving Functor
newtype Command a = Command { runCommand :: Free Cmd a }
deriving
( Functor
, Applicative
, Monad
, MonadFree Cmd
)
data Expr
= Doc
| Var !Var
| Iter !Expr
| Next !Expr
| GetKey !Expr !(Key Void)
deriving (Show, Eq)
instance IsString Expr where
fromString = Var . fromString