{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Data.Spreadsheet.CharSource where

import Control.Monad.Trans.State (StateT(StateT), gets, runStateT, mapStateT, )
import Control.Applicative (Applicative, )
import Data.Functor.Identity (Identity(Identity), runIdentity, )

import Data.List.HT (viewL, )
import Data.Tuple.HT (forcePair, )

import qualified Prelude as P
import Prelude hiding (String)


class (Monad (m Maybe), Monad (m Identity)) => C m where
   get   :: m Maybe Char
   isEnd :: m Identity Bool
   stop  :: m Maybe a
   fallible :: m Identity a -> m Maybe a
   {- |
   Try to run a parser.
   If it succeeds, return (Just value) and advance input position.
   If it fails, return Nothing and keep the input position.
   -}
   try  :: m Maybe a -> m Identity (Maybe a)


newtype String fail a = String {forall (fail :: * -> *) a. String fail a -> StateT String fail a
runString :: StateT P.String fail a}
   deriving ((forall a b. (a -> b) -> String fail a -> String fail b)
-> (forall a b. a -> String fail b -> String fail a)
-> Functor (String fail)
forall a b. a -> String fail b -> String fail a
forall a b. (a -> b) -> String fail a -> String fail b
forall (fail :: * -> *) a b.
Functor fail =>
a -> String fail b -> String fail a
forall (fail :: * -> *) a b.
Functor fail =>
(a -> b) -> String fail a -> String fail b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall (fail :: * -> *) a b.
Functor fail =>
(a -> b) -> String fail a -> String fail b
fmap :: forall a b. (a -> b) -> String fail a -> String fail b
$c<$ :: forall (fail :: * -> *) a b.
Functor fail =>
a -> String fail b -> String fail a
<$ :: forall a b. a -> String fail b -> String fail a
Functor, Functor (String fail)
Functor (String fail)
-> (forall a. a -> String fail a)
-> (forall a b.
    String fail (a -> b) -> String fail a -> String fail b)
-> (forall a b c.
    (a -> b -> c) -> String fail a -> String fail b -> String fail c)
-> (forall a b. String fail a -> String fail b -> String fail b)
-> (forall a b. String fail a -> String fail b -> String fail a)
-> Applicative (String fail)
forall a. a -> String fail a
forall a b. String fail a -> String fail b -> String fail a
forall a b. String fail a -> String fail b -> String fail b
forall a b. String fail (a -> b) -> String fail a -> String fail b
forall a b c.
(a -> b -> c) -> String fail a -> String fail b -> String fail c
forall {fail :: * -> *}. Monad fail => Functor (String fail)
forall (fail :: * -> *) a. Monad fail => a -> String fail a
forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail a
forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail b
forall (fail :: * -> *) a b.
Monad fail =>
String fail (a -> b) -> String fail a -> String fail b
forall (fail :: * -> *) a b c.
Monad fail =>
(a -> b -> c) -> String fail a -> String fail b -> String fail c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall (fail :: * -> *) a. Monad fail => a -> String fail a
pure :: forall a. a -> String fail a
$c<*> :: forall (fail :: * -> *) a b.
Monad fail =>
String fail (a -> b) -> String fail a -> String fail b
<*> :: forall a b. String fail (a -> b) -> String fail a -> String fail b
$cliftA2 :: forall (fail :: * -> *) a b c.
Monad fail =>
(a -> b -> c) -> String fail a -> String fail b -> String fail c
liftA2 :: forall a b c.
(a -> b -> c) -> String fail a -> String fail b -> String fail c
$c*> :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail b
*> :: forall a b. String fail a -> String fail b -> String fail b
$c<* :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail a
<* :: forall a b. String fail a -> String fail b -> String fail a
Applicative, Applicative (String fail)
Applicative (String fail)
-> (forall a b.
    String fail a -> (a -> String fail b) -> String fail b)
-> (forall a b. String fail a -> String fail b -> String fail b)
-> (forall a. a -> String fail a)
-> Monad (String fail)
forall a. a -> String fail a
forall a b. String fail a -> String fail b -> String fail b
forall a b. String fail a -> (a -> String fail b) -> String fail b
forall (fail :: * -> *). Monad fail => Applicative (String fail)
forall (fail :: * -> *) a. Monad fail => a -> String fail a
forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail b
forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> (a -> String fail b) -> String fail b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
$c>>= :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> (a -> String fail b) -> String fail b
>>= :: forall a b. String fail a -> (a -> String fail b) -> String fail b
$c>> :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail b
>> :: forall a b. String fail a -> String fail b -> String fail b
$creturn :: forall (fail :: * -> *) a. Monad fail => a -> String fail a
return :: forall a. a -> String fail a
Monad)


instance C String where
   get :: String Maybe Char
get   = StateT String Maybe Char -> String Maybe Char
forall (fail :: * -> *) a. StateT String fail a -> String fail a
String (StateT String Maybe Char -> String Maybe Char)
-> StateT String Maybe Char -> String Maybe Char
forall a b. (a -> b) -> a -> b
$ (String -> Maybe (Char, String)) -> StateT String Maybe Char
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT String -> Maybe (Char, String)
forall a. [a] -> Maybe (a, [a])
viewL
   isEnd :: String Identity Bool
isEnd = StateT String Identity Bool -> String Identity Bool
forall (fail :: * -> *) a. StateT String fail a -> String fail a
String (StateT String Identity Bool -> String Identity Bool)
-> StateT String Identity Bool -> String Identity Bool
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> StateT String Identity Bool
forall (m :: * -> *) s a. Monad m => (s -> a) -> StateT s m a
gets String -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null
   stop :: forall a. String Maybe a
stop  = StateT String Maybe a -> String Maybe a
forall (fail :: * -> *) a. StateT String fail a -> String fail a
String (StateT String Maybe a -> String Maybe a)
-> StateT String Maybe a -> String Maybe a
forall a b. (a -> b) -> a -> b
$ (String -> Maybe (a, String)) -> StateT String Maybe a
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT ((String -> Maybe (a, String)) -> StateT String Maybe a)
-> (String -> Maybe (a, String)) -> StateT String Maybe a
forall a b. (a -> b) -> a -> b
$ Maybe (a, String) -> String -> Maybe (a, String)
forall a b. a -> b -> a
const Maybe (a, String)
forall a. Maybe a
Nothing
   fallible :: forall a. String Identity a -> String Maybe a
fallible String Identity a
x = StateT String Maybe a -> String Maybe a
forall (fail :: * -> *) a. StateT String fail a -> String fail a
String (StateT String Maybe a -> String Maybe a)
-> StateT String Maybe a -> String Maybe a
forall a b. (a -> b) -> a -> b
$ (Identity (a, String) -> Maybe (a, String))
-> StateT String Identity a -> StateT String Maybe a
forall (m :: * -> *) a s (n :: * -> *) b.
(m (a, s) -> n (b, s)) -> StateT s m a -> StateT s n b
mapStateT ((a, String) -> Maybe (a, String)
forall a. a -> Maybe a
Just ((a, String) -> Maybe (a, String))
-> (Identity (a, String) -> (a, String))
-> Identity (a, String)
-> Maybe (a, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Identity (a, String) -> (a, String)
forall a. Identity a -> a
runIdentity) (StateT String Identity a -> StateT String Maybe a)
-> StateT String Identity a -> StateT String Maybe a
forall a b. (a -> b) -> a -> b
$ String Identity a -> StateT String Identity a
forall (fail :: * -> *) a. String fail a -> StateT String fail a
runString String Identity a
x
   try :: forall a. String Maybe a -> String Identity (Maybe a)
try String Maybe a
x = StateT String Identity (Maybe a) -> String Identity (Maybe a)
forall (fail :: * -> *) a. StateT String fail a -> String fail a
String (StateT String Identity (Maybe a) -> String Identity (Maybe a))
-> StateT String Identity (Maybe a) -> String Identity (Maybe a)
forall a b. (a -> b) -> a -> b
$ (String -> Identity (Maybe a, String))
-> StateT String Identity (Maybe a)
forall s (m :: * -> *) a. (s -> m (a, s)) -> StateT s m a
StateT ((String -> Identity (Maybe a, String))
 -> StateT String Identity (Maybe a))
-> (String -> Identity (Maybe a, String))
-> StateT String Identity (Maybe a)
forall a b. (a -> b) -> a -> b
$ \String
s0 ->
      (Maybe a, String) -> Identity (Maybe a, String)
forall a. a -> Identity a
Identity ((Maybe a, String) -> Identity (Maybe a, String))
-> (Maybe a, String) -> Identity (Maybe a, String)
forall a b. (a -> b) -> a -> b
$ (Maybe a, String) -> (Maybe a, String)
forall a b. (a, b) -> (a, b)
forcePair ((Maybe a, String) -> (Maybe a, String))
-> (Maybe a, String) -> (Maybe a, String)
forall a b. (a -> b) -> a -> b
$
      case StateT String Maybe a -> String -> Maybe (a, String)
forall s (m :: * -> *) a. StateT s m a -> s -> m (a, s)
runStateT (String Maybe a -> StateT String Maybe a
forall (fail :: * -> *) a. String fail a -> StateT String fail a
runString String Maybe a
x) String
s0 of
         Maybe (a, String)
Nothing -> (Maybe a
forall a. Maybe a
Nothing, String
s0)
         Just (a
a,String
s1) -> (a -> Maybe a
forall a. a -> Maybe a
Just a
a, String
s1)