{-# 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 -> 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
<$ :: forall a b. a -> String fail b -> String fail a
$c<$ :: forall (fail :: * -> *) a b.
Functor fail =>
a -> String fail b -> String fail a
fmap :: forall a b. (a -> b) -> String fail a -> String fail b
$cfmap :: forall (fail :: * -> *) a b.
Functor fail =>
(a -> b) -> String fail a -> String fail b
Functor, 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
<* :: forall a b. String fail a -> String fail b -> String fail a
$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 b
$c*> :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> String fail b -> String fail b
liftA2 :: forall a b c.
(a -> b -> c) -> String fail a -> String fail b -> String fail c
$cliftA2 :: forall (fail :: * -> *) a b c.
Monad fail =>
(a -> b -> c) -> String fail a -> String fail b -> String fail c
<*> :: forall a b. String fail (a -> b) -> String fail a -> String fail b
$c<*> :: forall (fail :: * -> *) a b.
Monad fail =>
String fail (a -> b) -> String fail a -> String fail b
pure :: forall a. a -> String fail a
$cpure :: forall (fail :: * -> *) a. Monad fail => a -> String fail a
Applicative, 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
return :: forall a. a -> String fail a
$creturn :: forall (fail :: * -> *) a. Monad fail => a -> String fail a
>> :: 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 b
>>= :: forall a b. String fail a -> (a -> String fail b) -> String fail b
$c>>= :: forall (fail :: * -> *) a b.
Monad fail =>
String fail a -> (a -> String fail b) -> String fail b
Monad)


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