module Main where

import Prelude
import Control.Monad.Eff.Console (log)

test1 = \_ -> show "testing"

f :: forall a. Show a => a -> String
f x = show x

test2 = \_ -> f "testing"

test7 :: forall a. Show a => a -> String
test7 = show

test8 = \_ -> show $ "testing"

data Data a = Data a

instance showData :: Show a => Show (Data a) where
  show (Data a) = "Data (" <> show a <> ")"

test3 = \_ -> show (Data "testing")

instance functorData :: Functor Data where
  map = liftM1

instance applyData :: Apply Data where
  apply = ap

instance applicativeData :: Applicative Data where
  pure = Data

instance bindData :: Bind Data where
  bind (Data a) f = f a

instance monadData :: Monad Data

data Maybe a = Nothing | Just a

instance functorMaybe :: Functor Maybe where
  map = liftM1

instance applyMaybe :: Apply Maybe where
  apply = ap

instance applicativeMaybe :: Applicative Maybe where
  pure = Just

instance bindMaybe :: Bind Maybe where
  bind Nothing _ = Nothing
  bind (Just a) f = f a

instance monadMaybe :: Monad Maybe

test4 :: forall a m. Monad m => a -> m Number
test4 = \_ -> pure 1.0

test5 = \_ -> Just 1.0 >>= \n -> pure (n + 1.0)

ask r = r

runReader r f = f r

test9 _ = runReader 0.0 $ do
  n <- ask
  pure $ n + 1.0

main = do
  log (test7 "Hello")
  log "Done"
