module Test where

import Prelude hiding ((.))
import Control.Category
import Text.MPretty
import qualified Data.Text.Lazy.IO as T
import qualified Data.Set as Set
import Data.Set (Set)
import qualified Data.Map as Map
import Data.Map (Map)
import Util.Lens
import Data.Lens
import Control.Monad.Reader
import Util.HasLens

e1 :: [[Map String [Integer]]]
e1 =
  [ [ Map.fromList 
      [ ("foo", [1111,1112,1113,1114])
      , ("bar", [2222,2223,2224])
      , ("baz", [3333,3334])
      ]
    , Map.empty
    , Map.fromList
      [ ("foo", [4444,4443,4442,4441])
      , ("bar", [5555,5554,5553,5552,5551])
      ]
    ]
  , [ Map.empty
    , Map.fromList
      [ ("foo", [6666,6667,6668,6669])
      , ("bar", [7777,7778,7779])
      ]
    ]
  , []
  , [ Map.fromList
      [ ("foo", [8888,8889])
      , ("bar", [9999])
      , ("baz", [])
      ]
    , Map.empty
    ]
  ]

data Exp = Var String | App Exp Exp | Dollar Exp Exp | Compose Exp Exp | Plus Exp Exp | Minus Exp Exp

instance IsPretty Exp where
  pretty (Var x) = text $ pString x
  pretty (App e1 e2) =
    infixOp LeftD 10 NoBuffer (text $ pString " ") (pretty e1) (pretty e2)
  pretty (Dollar e1 e2) = 
    infixOp RightD 1 Buffer (text $ pString "$") (pretty e1) (pretty e2)
  pretty (Compose e1 e2) =
    infixOp RightD 9 Buffer (text $ pString ".") (pretty e1) (pretty e2)
  pretty (Plus e1 e2) =
    infixOp LeftD 5 Buffer (text $ pString "+") (pretty e1) (pretty e2)
  pretty (Minus e1 e2) =
    infixOp RightD 5 Buffer (text $ pString "-") (pretty e1) (pretty e2)

e2 :: Exp
e2 = Dollar (Var "x") $ Compose (Var "y") $ Dollar (App (App (Var "l") $ Var "z") $ Var "q") $ Var "m"

e3 :: Exp
e3 = Plus (Plus (Var "x") (Var "y")) (Plus (Var "z") (Var "a"))

e4 :: Exp
e4 = Minus (Minus (Var "x") (Var "y")) (Minus (Var "z") (Var "a"))

e5 :: Exp
e5 = Minus (Plus (Var "x") (Var "y")) (Plus (Var "z") (Var "a"))

e6 :: Exp
e6 = Plus (Minus (Var "x") (Var "y")) (Minus (Var "z") (Var "a"))

main :: IO ()
main = do
  T.putStrLn $ execPretty $ styleVariants $ layoutWidth 5 $ pretty e1
  T.putStrLn $ execPretty $ showStyle $ pretty e1
  T.putStrLn $ execPretty $ group $ layoutWidth 5 $ pretty e2
  T.putStrLn $ execPretty $ styleVariants $ layoutWidth 5 $ pretty e2
  T.putStrLn $ execPretty $ pretty e3
  T.putStrLn $ execPretty $ pretty e4
  T.putStrLn $ execPretty $ pretty e5
  T.putStrLn $ execPretty $ pretty e6