module Data.Thrist.List ( List(..) ) where

import Data.Thrist
import Control.Monad ()
import Control.Applicative (Applicative(..))

-- Adapter for creating lists:
--   (Thrist List a a) is isomorphic to [a]

data List :: * -> * -> * where
  El :: a -> List a a

-- It forms a monad
--

newtype List' a = List' (Thrist List a a)

instance Functor List' where
  fmap _ (List' Nil) = List' Nil
  fmap f (List' (Cons (El a) as)) = List' $ Cons (El $ f a) (unlist' . fmap f $ List' as)
    where unlist' (List' l) = l

instance Applicative List' where
  pure = return
  (<*>) = undefined -- TODO

instance Monad List' where
  return a = List' $ Cons (El a) Nil
  List' a >>= f = undefined -- TODO

{- We need something like:

instance  Monad []  where
    m >>= k             = foldr ((++) . k) [] m
    m >> k              = foldr ((++) . (\ _ -> k)) [] m
    return x            = [x]
    fail _              = []
-}