{-# LANGUAGE Rank2Types #-}

module Data.Attoparsec.Machine where

import Data.Attoparsec.Internal.Types (IResult (..))
import Data.Machine (Is (Refl), MachineT (..), ProcessT, Step (Await, Yield), stopped)

streamParserWith :: (Monoid i, Monad m) => (i -> IResult i a) -> ProcessT m i (Either String a)
streamParserWith :: (i -> IResult i a) -> ProcessT m i (Either String a)
streamParserWith i -> IResult i a
runParser = ProcessT m i (Either String a)
start
  where
    start :: ProcessT m i (Either String a)
start = m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> ProcessT m i (Either String a)
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
 -> ProcessT m i (Either String a))
-> (Step (Is i) (Either String a) (ProcessT m i (Either String a))
    -> m (Step
            (Is i) (Either String a) (ProcessT m i (Either String a))))
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> ProcessT m i (Either String a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Is i) (Either String a) (ProcessT m i (Either String a))
 -> ProcessT m i (Either String a))
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> ProcessT m i (Either String a)
forall a b. (a -> b) -> a -> b
$ (i -> ProcessT m i (Either String a))
-> Is i i
-> ProcessT m i (Either String a)
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall (k :: * -> *) o r t. (t -> r) -> k t -> r -> Step k o r
Await i -> ProcessT m i (Either String a)
parse Is i i
forall a. Is a a
Refl ProcessT m i (Either String a)
forall (k :: * -> *) b. Machine k b
stopped
    parse :: i -> ProcessT m i (Either String a)
parse i
i = m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> ProcessT m i (Either String a)
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
 -> ProcessT m i (Either String a))
-> (IResult i a
    -> m (Step
            (Is i) (Either String a) (ProcessT m i (Either String a))))
-> IResult i a
-> ProcessT m i (Either String a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Is i) (Either String a) (ProcessT m i (Either String a))
 -> m (Step
         (Is i) (Either String a) (ProcessT m i (Either String a))))
-> (IResult i a
    -> Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> IResult i a
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IResult i a
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
f (IResult i a -> ProcessT m i (Either String a))
-> IResult i a -> ProcessT m i (Either String a)
forall a b. (a -> b) -> a -> b
$ i -> IResult i a
runParser i
i
    f :: IResult i a
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
f (Fail i
_ [String]
_ String
e) = Either String a
-> ProcessT m i (Either String a)
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield (String -> Either String a
forall a b. a -> Either a b
Left String
e) ProcessT m i (Either String a)
start
    f (Partial i -> IResult i a
c) = (i -> ProcessT m i (Either String a))
-> Is i i
-> ProcessT m i (Either String a)
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall (k :: * -> *) o r t. (t -> r) -> k t -> r -> Step k o r
Await (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> ProcessT m i (Either String a)
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
 -> ProcessT m i (Either String a))
-> (i
    -> m (Step
            (Is i) (Either String a) (ProcessT m i (Either String a))))
-> i
-> ProcessT m i (Either String a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Is i) (Either String a) (ProcessT m i (Either String a))
 -> m (Step
         (Is i) (Either String a) (ProcessT m i (Either String a))))
-> (i
    -> Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> i
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IResult i a
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
f (IResult i a
 -> Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> (i -> IResult i a)
-> i
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. i -> IResult i a
c) Is i i
forall a. Is a a
Refl (ProcessT m i (Either String a)
 -> Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> ProcessT m i (Either String a)
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall a b. (a -> b) -> a -> b
$ (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> ProcessT m i (Either String a)
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step (Is i) (Either String a) (ProcessT m i (Either String a)))
 -> ProcessT m i (Either String a))
-> (IResult i a
    -> m (Step
            (Is i) (Either String a) (ProcessT m i (Either String a))))
-> IResult i a
-> ProcessT m i (Either String a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step (Is i) (Either String a) (ProcessT m i (Either String a))
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step (Is i) (Either String a) (ProcessT m i (Either String a))
 -> m (Step
         (Is i) (Either String a) (ProcessT m i (Either String a))))
-> (IResult i a
    -> Step (Is i) (Either String a) (ProcessT m i (Either String a)))
-> IResult i a
-> m (Step
        (Is i) (Either String a) (ProcessT m i (Either String a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IResult i a
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
f (IResult i a -> ProcessT m i (Either String a))
-> IResult i a -> ProcessT m i (Either String a)
forall a b. (a -> b) -> a -> b
$ i -> IResult i a
c i
forall a. Monoid a => a
mempty)
    f (Done i
i a
r) = Either String a
-> ProcessT m i (Either String a)
-> Step (Is i) (Either String a) (ProcessT m i (Either String a))
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield (a -> Either String a
forall a b. b -> Either a b
Right a
r) (i -> ProcessT m i (Either String a)
parse i
i)

processParserWith :: (Monoid i, Monad m) => (i -> IResult i a) -> ProcessT m i (Either String (i, a))
processParserWith :: (i -> IResult i a) -> ProcessT m i (Either String (i, a))
processParserWith i -> IResult i a
runParser = m (Step
     (Is i)
     (Either String (i, a))
     (ProcessT m i (Either String (i, a))))
-> ProcessT m i (Either String (i, a))
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step
      (Is i)
      (Either String (i, a))
      (ProcessT m i (Either String (i, a))))
 -> ProcessT m i (Either String (i, a)))
-> (Step
      (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
    -> m (Step
            (Is i)
            (Either String (i, a))
            (ProcessT m i (Either String (i, a)))))
-> Step
     (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
-> ProcessT m i (Either String (i, a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step
  (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
-> m (Step
        (Is i)
        (Either String (i, a))
        (ProcessT m i (Either String (i, a))))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
   (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
 -> ProcessT m i (Either String (i, a)))
-> Step
     (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
-> ProcessT m i (Either String (i, a))
forall a b. (a -> b) -> a -> b
$ (i -> ProcessT m i (Either String (i, a)))
-> Is i i
-> ProcessT m i (Either String (i, a))
-> Step
     (Is i) (Either String (i, a)) (ProcessT m i (Either String (i, a)))
forall (k :: * -> *) o r t. (t -> r) -> k t -> r -> Step k o r
Await i -> ProcessT m i (Either String (i, a))
forall (m :: * -> *).
Monad m =>
i -> MachineT m (Is i) (Either String (i, a))
parse Is i i
forall a. Is a a
Refl ProcessT m i (Either String (i, a))
forall (k :: * -> *) b. Machine k b
stopped
  where
    parse :: i -> MachineT m (Is i) (Either String (i, a))
parse i
i = m (Step
     (Is i)
     (Either String (i, a))
     (MachineT m (Is i) (Either String (i, a))))
-> MachineT m (Is i) (Either String (i, a))
forall (m :: * -> *) (k :: * -> *) o.
m (Step k o (MachineT m k o)) -> MachineT m k o
MachineT (m (Step
      (Is i)
      (Either String (i, a))
      (MachineT m (Is i) (Either String (i, a))))
 -> MachineT m (Is i) (Either String (i, a)))
-> (IResult i a
    -> m (Step
            (Is i)
            (Either String (i, a))
            (MachineT m (Is i) (Either String (i, a)))))
-> IResult i a
-> MachineT m (Is i) (Either String (i, a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Step
  (Is i)
  (Either String (i, a))
  (MachineT m (Is i) (Either String (i, a)))
-> m (Step
        (Is i)
        (Either String (i, a))
        (MachineT m (Is i) (Either String (i, a))))
forall (m :: * -> *) a. Monad m => a -> m a
return (Step
   (Is i)
   (Either String (i, a))
   (MachineT m (Is i) (Either String (i, a)))
 -> m (Step
         (Is i)
         (Either String (i, a))
         (MachineT m (Is i) (Either String (i, a)))))
-> (IResult i a
    -> Step
         (Is i)
         (Either String (i, a))
         (MachineT m (Is i) (Either String (i, a))))
-> IResult i a
-> m (Step
        (Is i)
        (Either String (i, a))
        (MachineT m (Is i) (Either String (i, a))))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IResult i a
-> Step
     (Is i)
     (Either String (i, a))
     (MachineT m (Is i) (Either String (i, a)))
forall (m :: * -> *) a b (k :: * -> *).
(Monad m, Monoid a) =>
IResult a b
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
f (IResult i a -> MachineT m (Is i) (Either String (i, a)))
-> IResult i a -> MachineT m (Is i) (Either String (i, a))
forall a b. (a -> b) -> a -> b
$ i -> IResult i a
runParser i
i
    f :: IResult a b
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
f (Fail a
_ [String]
_ String
e) = Either String (a, b)
-> ProcessT m i (Either String (i, a))
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield (String -> Either String (a, b)
forall a b. a -> Either a b
Left String
e) ((i -> IResult i a) -> ProcessT m i (Either String (i, a))
forall i (m :: * -> *) a.
(Monoid i, Monad m) =>
(i -> IResult i a) -> ProcessT m i (Either String (i, a))
processParserWith i -> IResult i a
runParser)
    f (Partial a -> IResult a b
c) = IResult a b
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
f (IResult a b
 -> Step
      k (Either String (a, b)) (ProcessT m i (Either String (i, a))))
-> IResult a b
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
forall a b. (a -> b) -> a -> b
$ a -> IResult a b
c a
forall a. Monoid a => a
mempty
    f (Done a
i b
a) = Either String (a, b)
-> ProcessT m i (Either String (i, a))
-> Step
     k (Either String (a, b)) (ProcessT m i (Either String (i, a)))
forall (k :: * -> *) o r. o -> r -> Step k o r
Yield ((a, b) -> Either String (a, b)
forall a b. b -> Either a b
Right (a
i, b
a)) ((i -> IResult i a) -> ProcessT m i (Either String (i, a))
forall i (m :: * -> *) a.
(Monoid i, Monad m) =>
(i -> IResult i a) -> ProcessT m i (Either String (i, a))
processParserWith i -> IResult i a
runParser)