module Builtins where

import Code
import Control.Monad.IO.Class
import Control.Monad.Trans.State.Lazy
import qualified Data.Map as M
import Env hiding (PrlgEnv)
import Interpreter (backtrack)
import qualified Operators as O

bi = Builtin

hello =
  bi $ do
    liftIO $ putStrLn "hllo prlg"
    return Nothing

addBuiltins :: PrlgEnv ()
addBuiltins = do
  a1 <- findStruct "a" 1
  a <- findAtom "a"
  b <- findAtom "b"
  c <- findAtom "c"
  b0 <- findStruct "b" 0
  any1 <- findStruct "any" 1
  eq2 <- findStruct "=" 2
  hello0 <- findStruct "hello" 0
  fail0 <- findStruct "fail" 0
  true0 <- findStruct "true" 0
  prlgstate0 <- findStruct "prlgstate" 0
  modify $ \s ->
    s
      { defs =
          M.fromList
            [ (eq2, [[U (LocalRef 0 Nothing), U (LocalRef 0 Nothing), NoGoal]])
            , (a1, [[U (Atom a), NoGoal], [U (Atom b), NoGoal]])
            , ( b0
              , [ [Goal, U (Struct a1), U (Atom c), LastCall]
                , [Goal, U (Struct a1), U (Atom b), LastCall]
                ])
            , (any1, [[U (VoidRef Nothing), NoGoal]])
            , (hello0, [[Invoke hello]])
            , (fail0, [[Invoke $ bi backtrack]])
            , (true0, [[Invoke $ bi (pure Nothing)]])
            , ( prlgstate0
              , [[Invoke $ bi (get >>= liftIO . print >> pure Nothing)]])
            ]
      , ops = [(O.xfy "," 1000), (O.xfx "=" 700)]
      }