{-# LANGUAGE UndecidableInstances #-}

module Symparsec.Parser.TakeRest where

import Symparsec.Parser.Common
import Singleraeh.Symbol ( RevCharsToSymbol, revCharsToSymbol )
import Singleraeh.List ( SList(..) )
import Singleraeh.Either ( SEither(..) )
import GHC.TypeLits hiding ( ErrorMessage(..) )
import DeFun.Core

-- | Return the remaining input string.
type TakeRest = 'PParser TakeRestChSym TakeRestEndSym '[]

sTakeRest :: SParser (SList SChar) SSymbol TakeRest
sTakeRest :: SParser (SList SChar) SSymbol TakeRest
sTakeRest = SParserChSym (SList SChar) SSymbol TakeRestChSym
-> SParserEndSym (SList SChar) SSymbol TakeRestEndSym
-> SList SChar '[]
-> SParser (SList SChar) SSymbol TakeRest
forall {s} {r} (ss :: s -> Type) (sr :: r -> Type)
       (pCh :: ParserChSym s r) (pEnd :: ParserEndSym s r) (s0 :: s).
SParserChSym ss sr pCh
-> SParserEndSym ss sr pEnd
-> ss s0
-> SParser ss sr ('PParser pCh pEnd s0)
SParser SParserChSym (SList SChar) SSymbol TakeRestChSym
sTakeRestChSym SParserEndSym (SList SChar) SSymbol TakeRestEndSym
sTakeRestEndSym SList SChar '[]
forall {a} (sa :: a -> Type). SList sa '[]
SNil

instance SingParser TakeRest where
    type PS TakeRest = SList SChar
    type PR TakeRest = SSymbol
    singParser' :: SParser (PS TakeRest) (PR TakeRest) TakeRest
singParser' = SParser (SList SChar) SSymbol TakeRest
SParser (PS TakeRest) (PR TakeRest) TakeRest
sTakeRest

type TakeRestChSym :: ParserChSym [Char] Symbol
data TakeRestChSym f
type instance App TakeRestChSym f = TakeRestChSym1 f

type TakeRestChSym1 :: ParserChSym1 [Char] Symbol
data TakeRestChSym1 ch chs
type instance App (TakeRestChSym1 ch) chs = Cont (ch : chs)

sTakeRestChSym :: SParserChSym (SList SChar) SSymbol TakeRestChSym
sTakeRestChSym :: SParserChSym (SList SChar) SSymbol TakeRestChSym
sTakeRestChSym = LamRep2
  SChar (SList SChar) (SResult (SList SChar) SSymbol) TakeRestChSym
-> SParserChSym (SList SChar) SSymbol TakeRestChSym
forall {a1} {a2} {b1} (a3 :: a1 -> Type) (b2 :: a2 -> Type)
       (c :: b1 -> Type) (fun :: a1 ~> (a2 ~> b1)).
LamRep2 a3 b2 c fun -> Lam2 a3 b2 c fun
Lam2 (LamRep2
   SChar (SList SChar) (SResult (SList SChar) SSymbol) TakeRestChSym
 -> SParserChSym (SList SChar) SSymbol TakeRestChSym)
-> LamRep2
     SChar (SList SChar) (SResult (SList SChar) SSymbol) TakeRestChSym
-> SParserChSym (SList SChar) SSymbol TakeRestChSym
forall a b. (a -> b) -> a -> b
$ \SChar x
ch SList SChar y
chs -> SList SChar (x : y)
-> SResult (SList SChar) SSymbol ('Cont (x : y))
forall {s} {r} (ss :: s -> Type) (s1 :: s) (sr :: r -> Type).
ss s1 -> SResult ss sr ('Cont s1)
SCont (SList SChar (x : y)
 -> SResult (SList SChar) SSymbol ('Cont (x : y)))
-> SList SChar (x : y)
-> SResult (SList SChar) SSymbol ('Cont (x : y))
forall a b. (a -> b) -> a -> b
$ SChar x -> SList SChar y -> SList SChar (x : y)
forall {a} (sa :: a -> Type) (a1 :: a) (as1 :: [a]).
sa a1 -> SList sa as1 -> SList sa (a1 : as1)
SCons SChar x
ch SList SChar y
chs

type TakeRestEndSym :: ParserEndSym [Char] Symbol
data TakeRestEndSym chs
type instance App TakeRestEndSym chs = Right (RevCharsToSymbol chs)

sTakeRestEndSym :: SParserEndSym (SList SChar) SSymbol TakeRestEndSym
sTakeRestEndSym :: SParserEndSym (SList SChar) SSymbol TakeRestEndSym
sTakeRestEndSym = LamRep (SList SChar) (SResultEnd SSymbol) TakeRestEndSym
-> SParserEndSym (SList SChar) SSymbol TakeRestEndSym
forall a b (a1 :: a -> Type) (b1 :: b -> Type) (f :: a ~> b).
LamRep a1 b1 f -> Lam a1 b1 f
Lam (LamRep (SList SChar) (SResultEnd SSymbol) TakeRestEndSym
 -> SParserEndSym (SList SChar) SSymbol TakeRestEndSym)
-> LamRep (SList SChar) (SResultEnd SSymbol) TakeRestEndSym
-> SParserEndSym (SList SChar) SSymbol TakeRestEndSym
forall a b. (a -> b) -> a -> b
$ \SList SChar x
chs -> SSymbol (RevCharsToSymbol' "" x)
-> SEither SE SSymbol ('Right (RevCharsToSymbol' "" x))
forall {r} {l} (sr :: r -> Type) (r1 :: r) (sl :: l -> Type).
sr r1 -> SEither sl sr ('Right r1)
SRight (SSymbol (RevCharsToSymbol' "" x)
 -> SEither SE SSymbol ('Right (RevCharsToSymbol' "" x)))
-> SSymbol (RevCharsToSymbol' "" x)
-> SEither SE SSymbol ('Right (RevCharsToSymbol' "" x))
forall a b. (a -> b) -> a -> b
$ SList SChar x -> SSymbol (RevCharsToSymbol' "" x)
forall (chs :: [Char]).
SList SChar chs -> SSymbol (RevCharsToSymbol chs)
revCharsToSymbol SList SChar x
chs