module Data.ASN1.Stream
( ASN1Repr
, getConstructedEnd
, getConstructedEndRepr
) where
import Data.ASN1.Types ( ASN1 (..) )
import Data.ASN1.Types.Lowlevel ( ASN1Event )
type ASN1Repr = (ASN1, [ASN1Event])
getConstructedEnd ::
Int
-> [ASN1]
-> ([ASN1], [ASN1])
getConstructedEnd :: Int -> [ASN1] -> ([ASN1], [ASN1])
getConstructedEnd Int
_ [] = ([], [])
getConstructedEnd Int
i (x :: ASN1
x@(Start ASN1ConstructionType
_) : [ASN1]
xs) =
let ([ASN1]
ys, [ASN1]
zs) = Int -> [ASN1] -> ([ASN1], [ASN1])
getConstructedEnd (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [ASN1]
xs
in (ASN1
x ASN1 -> [ASN1] -> [ASN1]
forall a. a -> [a] -> [a]
: [ASN1]
ys, [ASN1]
zs)
getConstructedEnd Int
0 ((End ASN1ConstructionType
_) : [ASN1]
xs) = ([], [ASN1]
xs)
getConstructedEnd Int
i (x :: ASN1
x@(End ASN1ConstructionType
_) : [ASN1]
xs) =
let ([ASN1]
ys, [ASN1]
zs) = Int -> [ASN1] -> ([ASN1], [ASN1])
getConstructedEnd (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [ASN1]
xs
in (ASN1
x ASN1 -> [ASN1] -> [ASN1]
forall a. a -> [a] -> [a]
: [ASN1]
ys, [ASN1]
zs)
getConstructedEnd Int
i (ASN1
x : [ASN1]
xs) =
let ([ASN1]
ys, [ASN1]
zs) = Int -> [ASN1] -> ([ASN1], [ASN1])
getConstructedEnd Int
i [ASN1]
xs
in (ASN1
x ASN1 -> [ASN1] -> [ASN1]
forall a. a -> [a] -> [a]
: [ASN1]
ys, [ASN1]
zs)
getConstructedEndRepr :: [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr :: [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr [] = ([], [])
getConstructedEndRepr (x :: ASN1Repr
x@(Start ASN1ConstructionType
_, [ASN1Event]
_) : [ASN1Repr]
xs) =
let ([ASN1Repr]
ys, [ASN1Repr]
zs) = Int -> [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' Int
1 [ASN1Repr]
xs
in (ASN1Repr
x ASN1Repr -> [ASN1Repr] -> [ASN1Repr]
forall a. a -> [a] -> [a]
: [ASN1Repr]
ys, [ASN1Repr]
zs)
getConstructedEndRepr (ASN1Repr
x : [ASN1Repr]
xs) = ([ASN1Repr
x], [ASN1Repr]
xs)
getConstructedEndRepr' ::
Int
-> [ASN1Repr]
-> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' :: Int -> [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' Int
_ [] = ([], [])
getConstructedEndRepr' Int
0 [ASN1Repr]
xs = ([], [ASN1Repr]
xs)
getConstructedEndRepr' Int
i (x :: ASN1Repr
x@(Start ASN1ConstructionType
_, [ASN1Event]
_) : [ASN1Repr]
xs) =
let ([ASN1Repr]
ys, [ASN1Repr]
zs) = Int -> [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) [ASN1Repr]
xs
in (ASN1Repr
x ASN1Repr -> [ASN1Repr] -> [ASN1Repr]
forall a. a -> [a] -> [a]
: [ASN1Repr]
ys, [ASN1Repr]
zs)
getConstructedEndRepr' Int
i (x :: ASN1Repr
x@(End ASN1ConstructionType
_, [ASN1Event]
_):[ASN1Repr]
xs) =
let ([ASN1Repr]
ys, [ASN1Repr]
zs) = Int -> [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' (Int
i Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [ASN1Repr]
xs
in (ASN1Repr
x ASN1Repr -> [ASN1Repr] -> [ASN1Repr]
forall a. a -> [a] -> [a]
: [ASN1Repr]
ys, [ASN1Repr]
zs)
getConstructedEndRepr' Int
i (ASN1Repr
x : [ASN1Repr]
xs) =
let ([ASN1Repr]
ys, [ASN1Repr]
zs) = Int -> [ASN1Repr] -> ([ASN1Repr], [ASN1Repr])
getConstructedEndRepr' Int
i [ASN1Repr]
xs
in (ASN1Repr
x ASN1Repr -> [ASN1Repr] -> [ASN1Repr]
forall a. a -> [a] -> [a]
: [ASN1Repr]
ys, [ASN1Repr]
zs)