-- | New parsers and structures for secondary structures. The structures here a strict.
--
-- TODO Parser should check if a @#Vienna Secondary Structure@ or @#Extended Secondary Structure@ precedes the entries.

module Biobase.Secondary.New where

import Control.Applicative
import Control.Lens
import Control.Monad.Except
import Data.Attoparsec.ByteString.Char8
import Data.ByteString.Char8 (ByteString,pack)
import Data.Functor
import Data.Tree
import Data.Vector (Vector, fromList)
import GHC.Generics (Generic)



-- | A completely closed sub-structure. An unpaired region @.@ is closed. A
-- paired region @(r)@ is closed, where @r@ contains arbitrarily many unpaired
-- and paired elements.
--
-- TODO Should be extended with @Extended@, but this requires knowing which of
-- the ends overlap with paired: left, right, or both.

data SubStructure (t :: *) a
  = Unpaired { SubStructure t a -> a
_label :: !a }
  | Paired   { _label :: !a, SubStructure t a -> Vector (SubStructure t a)
_subStructures :: !(Vector (SubStructure t a)) }
  deriving (Int -> SubStructure t a -> ShowS
[SubStructure t a] -> ShowS
SubStructure t a -> String
(Int -> SubStructure t a -> ShowS)
-> (SubStructure t a -> String)
-> ([SubStructure t a] -> ShowS)
-> Show (SubStructure t a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall t a. Show a => Int -> SubStructure t a -> ShowS
forall t a. Show a => [SubStructure t a] -> ShowS
forall t a. Show a => SubStructure t a -> String
showList :: [SubStructure t a] -> ShowS
$cshowList :: forall t a. Show a => [SubStructure t a] -> ShowS
show :: SubStructure t a -> String
$cshow :: forall t a. Show a => SubStructure t a -> String
showsPrec :: Int -> SubStructure t a -> ShowS
$cshowsPrec :: forall t a. Show a => Int -> SubStructure t a -> ShowS
Show, ReadPrec [SubStructure t a]
ReadPrec (SubStructure t a)
Int -> ReadS (SubStructure t a)
ReadS [SubStructure t a]
(Int -> ReadS (SubStructure t a))
-> ReadS [SubStructure t a]
-> ReadPrec (SubStructure t a)
-> ReadPrec [SubStructure t a]
-> Read (SubStructure t a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall t a. Read a => ReadPrec [SubStructure t a]
forall t a. Read a => ReadPrec (SubStructure t a)
forall t a. Read a => Int -> ReadS (SubStructure t a)
forall t a. Read a => ReadS [SubStructure t a]
readListPrec :: ReadPrec [SubStructure t a]
$creadListPrec :: forall t a. Read a => ReadPrec [SubStructure t a]
readPrec :: ReadPrec (SubStructure t a)
$creadPrec :: forall t a. Read a => ReadPrec (SubStructure t a)
readList :: ReadS [SubStructure t a]
$creadList :: forall t a. Read a => ReadS [SubStructure t a]
readsPrec :: Int -> ReadS (SubStructure t a)
$creadsPrec :: forall t a. Read a => Int -> ReadS (SubStructure t a)
Read, a -> SubStructure t b -> SubStructure t a
(a -> b) -> SubStructure t a -> SubStructure t b
(forall a b. (a -> b) -> SubStructure t a -> SubStructure t b)
-> (forall a b. a -> SubStructure t b -> SubStructure t a)
-> Functor (SubStructure t)
forall a b. a -> SubStructure t b -> SubStructure t a
forall a b. (a -> b) -> SubStructure t a -> SubStructure t b
forall t a b. a -> SubStructure t b -> SubStructure t a
forall t a b. (a -> b) -> SubStructure t a -> SubStructure t b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> SubStructure t b -> SubStructure t a
$c<$ :: forall t a b. a -> SubStructure t b -> SubStructure t a
fmap :: (a -> b) -> SubStructure t a -> SubStructure t b
$cfmap :: forall t a b. (a -> b) -> SubStructure t a -> SubStructure t b
Functor, Functor (SubStructure t)
Foldable (SubStructure t)
Functor (SubStructure t)
-> Foldable (SubStructure t)
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> SubStructure t a -> f (SubStructure t b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    SubStructure t (f a) -> f (SubStructure t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> SubStructure t a -> m (SubStructure t b))
-> (forall (m :: * -> *) a.
    Monad m =>
    SubStructure t (m a) -> m (SubStructure t a))
-> Traversable (SubStructure t)
(a -> f b) -> SubStructure t a -> f (SubStructure t b)
forall t. Functor (SubStructure t)
forall t. Foldable (SubStructure t)
forall t (m :: * -> *) a.
Monad m =>
SubStructure t (m a) -> m (SubStructure t a)
forall t (f :: * -> *) a.
Applicative f =>
SubStructure t (f a) -> f (SubStructure t a)
forall t (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SubStructure t a -> m (SubStructure t b)
forall t (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SubStructure t a -> f (SubStructure t b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
SubStructure t (m a) -> m (SubStructure t a)
forall (f :: * -> *) a.
Applicative f =>
SubStructure t (f a) -> f (SubStructure t a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SubStructure t a -> m (SubStructure t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SubStructure t a -> f (SubStructure t b)
sequence :: SubStructure t (m a) -> m (SubStructure t a)
$csequence :: forall t (m :: * -> *) a.
Monad m =>
SubStructure t (m a) -> m (SubStructure t a)
mapM :: (a -> m b) -> SubStructure t a -> m (SubStructure t b)
$cmapM :: forall t (m :: * -> *) a b.
Monad m =>
(a -> m b) -> SubStructure t a -> m (SubStructure t b)
sequenceA :: SubStructure t (f a) -> f (SubStructure t a)
$csequenceA :: forall t (f :: * -> *) a.
Applicative f =>
SubStructure t (f a) -> f (SubStructure t a)
traverse :: (a -> f b) -> SubStructure t a -> f (SubStructure t b)
$ctraverse :: forall t (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> SubStructure t a -> f (SubStructure t b)
$cp2Traversable :: forall t. Foldable (SubStructure t)
$cp1Traversable :: forall t. Functor (SubStructure t)
Traversable, SubStructure t a -> Bool
(a -> m) -> SubStructure t a -> m
(a -> b -> b) -> b -> SubStructure t a -> b
(forall m. Monoid m => SubStructure t m -> m)
-> (forall m a. Monoid m => (a -> m) -> SubStructure t a -> m)
-> (forall m a. Monoid m => (a -> m) -> SubStructure t a -> m)
-> (forall a b. (a -> b -> b) -> b -> SubStructure t a -> b)
-> (forall a b. (a -> b -> b) -> b -> SubStructure t a -> b)
-> (forall b a. (b -> a -> b) -> b -> SubStructure t a -> b)
-> (forall b a. (b -> a -> b) -> b -> SubStructure t a -> b)
-> (forall a. (a -> a -> a) -> SubStructure t a -> a)
-> (forall a. (a -> a -> a) -> SubStructure t a -> a)
-> (forall a. SubStructure t a -> [a])
-> (forall a. SubStructure t a -> Bool)
-> (forall a. SubStructure t a -> Int)
-> (forall a. Eq a => a -> SubStructure t a -> Bool)
-> (forall a. Ord a => SubStructure t a -> a)
-> (forall a. Ord a => SubStructure t a -> a)
-> (forall a. Num a => SubStructure t a -> a)
-> (forall a. Num a => SubStructure t a -> a)
-> Foldable (SubStructure t)
forall a. Eq a => a -> SubStructure t a -> Bool
forall a. Num a => SubStructure t a -> a
forall a. Ord a => SubStructure t a -> a
forall m. Monoid m => SubStructure t m -> m
forall a. SubStructure t a -> Bool
forall a. SubStructure t a -> Int
forall a. SubStructure t a -> [a]
forall a. (a -> a -> a) -> SubStructure t a -> a
forall t a. Eq a => a -> SubStructure t a -> Bool
forall t a. Num a => SubStructure t a -> a
forall t a. Ord a => SubStructure t a -> a
forall m a. Monoid m => (a -> m) -> SubStructure t a -> m
forall t m. Monoid m => SubStructure t m -> m
forall t a. SubStructure t a -> Bool
forall t a. SubStructure t a -> Int
forall t a. SubStructure t a -> [a]
forall b a. (b -> a -> b) -> b -> SubStructure t a -> b
forall a b. (a -> b -> b) -> b -> SubStructure t a -> b
forall t a. (a -> a -> a) -> SubStructure t a -> a
forall t m a. Monoid m => (a -> m) -> SubStructure t a -> m
forall t b a. (b -> a -> b) -> b -> SubStructure t a -> b
forall t a b. (a -> b -> b) -> b -> SubStructure t a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: SubStructure t a -> a
$cproduct :: forall t a. Num a => SubStructure t a -> a
sum :: SubStructure t a -> a
$csum :: forall t a. Num a => SubStructure t a -> a
minimum :: SubStructure t a -> a
$cminimum :: forall t a. Ord a => SubStructure t a -> a
maximum :: SubStructure t a -> a
$cmaximum :: forall t a. Ord a => SubStructure t a -> a
elem :: a -> SubStructure t a -> Bool
$celem :: forall t a. Eq a => a -> SubStructure t a -> Bool
length :: SubStructure t a -> Int
$clength :: forall t a. SubStructure t a -> Int
null :: SubStructure t a -> Bool
$cnull :: forall t a. SubStructure t a -> Bool
toList :: SubStructure t a -> [a]
$ctoList :: forall t a. SubStructure t a -> [a]
foldl1 :: (a -> a -> a) -> SubStructure t a -> a
$cfoldl1 :: forall t a. (a -> a -> a) -> SubStructure t a -> a
foldr1 :: (a -> a -> a) -> SubStructure t a -> a
$cfoldr1 :: forall t a. (a -> a -> a) -> SubStructure t a -> a
foldl' :: (b -> a -> b) -> b -> SubStructure t a -> b
$cfoldl' :: forall t b a. (b -> a -> b) -> b -> SubStructure t a -> b
foldl :: (b -> a -> b) -> b -> SubStructure t a -> b
$cfoldl :: forall t b a. (b -> a -> b) -> b -> SubStructure t a -> b
foldr' :: (a -> b -> b) -> b -> SubStructure t a -> b
$cfoldr' :: forall t a b. (a -> b -> b) -> b -> SubStructure t a -> b
foldr :: (a -> b -> b) -> b -> SubStructure t a -> b
$cfoldr :: forall t a b. (a -> b -> b) -> b -> SubStructure t a -> b
foldMap' :: (a -> m) -> SubStructure t a -> m
$cfoldMap' :: forall t m a. Monoid m => (a -> m) -> SubStructure t a -> m
foldMap :: (a -> m) -> SubStructure t a -> m
$cfoldMap :: forall t m a. Monoid m => (a -> m) -> SubStructure t a -> m
fold :: SubStructure t m -> m
$cfold :: forall t m. Monoid m => SubStructure t m -> m
Foldable, (forall x. SubStructure t a -> Rep (SubStructure t a) x)
-> (forall x. Rep (SubStructure t a) x -> SubStructure t a)
-> Generic (SubStructure t a)
forall x. Rep (SubStructure t a) x -> SubStructure t a
forall x. SubStructure t a -> Rep (SubStructure t a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall t a x. Rep (SubStructure t a) x -> SubStructure t a
forall t a x. SubStructure t a -> Rep (SubStructure t a) x
$cto :: forall t a x. Rep (SubStructure t a) x -> SubStructure t a
$cfrom :: forall t a x. SubStructure t a -> Rep (SubStructure t a) x
Generic, SubStructure t a -> SubStructure t a -> Bool
(SubStructure t a -> SubStructure t a -> Bool)
-> (SubStructure t a -> SubStructure t a -> Bool)
-> Eq (SubStructure t a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall t a. Eq a => SubStructure t a -> SubStructure t a -> Bool
/= :: SubStructure t a -> SubStructure t a -> Bool
$c/= :: forall t a. Eq a => SubStructure t a -> SubStructure t a -> Bool
== :: SubStructure t a -> SubStructure t a -> Bool
$c== :: forall t a. Eq a => SubStructure t a -> SubStructure t a -> Bool
Eq, Eq (SubStructure t a)
Eq (SubStructure t a)
-> (SubStructure t a -> SubStructure t a -> Ordering)
-> (SubStructure t a -> SubStructure t a -> Bool)
-> (SubStructure t a -> SubStructure t a -> Bool)
-> (SubStructure t a -> SubStructure t a -> Bool)
-> (SubStructure t a -> SubStructure t a -> Bool)
-> (SubStructure t a -> SubStructure t a -> SubStructure t a)
-> (SubStructure t a -> SubStructure t a -> SubStructure t a)
-> Ord (SubStructure t a)
SubStructure t a -> SubStructure t a -> Bool
SubStructure t a -> SubStructure t a -> Ordering
SubStructure t a -> SubStructure t a -> SubStructure t a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall t a. Ord a => Eq (SubStructure t a)
forall t a. Ord a => SubStructure t a -> SubStructure t a -> Bool
forall t a.
Ord a =>
SubStructure t a -> SubStructure t a -> Ordering
forall t a.
Ord a =>
SubStructure t a -> SubStructure t a -> SubStructure t a
min :: SubStructure t a -> SubStructure t a -> SubStructure t a
$cmin :: forall t a.
Ord a =>
SubStructure t a -> SubStructure t a -> SubStructure t a
max :: SubStructure t a -> SubStructure t a -> SubStructure t a
$cmax :: forall t a.
Ord a =>
SubStructure t a -> SubStructure t a -> SubStructure t a
>= :: SubStructure t a -> SubStructure t a -> Bool
$c>= :: forall t a. Ord a => SubStructure t a -> SubStructure t a -> Bool
> :: SubStructure t a -> SubStructure t a -> Bool
$c> :: forall t a. Ord a => SubStructure t a -> SubStructure t a -> Bool
<= :: SubStructure t a -> SubStructure t a -> Bool
$c<= :: forall t a. Ord a => SubStructure t a -> SubStructure t a -> Bool
< :: SubStructure t a -> SubStructure t a -> Bool
$c< :: forall t a. Ord a => SubStructure t a -> SubStructure t a -> Bool
compare :: SubStructure t a -> SubStructure t a -> Ordering
$ccompare :: forall t a.
Ord a =>
SubStructure t a -> SubStructure t a -> Ordering
$cp1Ord :: forall t a. Ord a => Eq (SubStructure t a)
Ord)
makeLenses ''SubStructure
makePrisms ''SubStructure

-- | A full structure is composed of a number of sub-structures. The empty
-- structure is a full structure.

newtype FullStructure (t :: *) a
  = FullStructure { FullStructure t a -> Vector (SubStructure t a)
_fullStructure :: Vector (SubStructure t a) }
  deriving (Int -> FullStructure t a -> ShowS
[FullStructure t a] -> ShowS
FullStructure t a -> String
(Int -> FullStructure t a -> ShowS)
-> (FullStructure t a -> String)
-> ([FullStructure t a] -> ShowS)
-> Show (FullStructure t a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall t a. Show a => Int -> FullStructure t a -> ShowS
forall t a. Show a => [FullStructure t a] -> ShowS
forall t a. Show a => FullStructure t a -> String
showList :: [FullStructure t a] -> ShowS
$cshowList :: forall t a. Show a => [FullStructure t a] -> ShowS
show :: FullStructure t a -> String
$cshow :: forall t a. Show a => FullStructure t a -> String
showsPrec :: Int -> FullStructure t a -> ShowS
$cshowsPrec :: forall t a. Show a => Int -> FullStructure t a -> ShowS
Show, ReadPrec [FullStructure t a]
ReadPrec (FullStructure t a)
Int -> ReadS (FullStructure t a)
ReadS [FullStructure t a]
(Int -> ReadS (FullStructure t a))
-> ReadS [FullStructure t a]
-> ReadPrec (FullStructure t a)
-> ReadPrec [FullStructure t a]
-> Read (FullStructure t a)
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
forall t a. Read a => ReadPrec [FullStructure t a]
forall t a. Read a => ReadPrec (FullStructure t a)
forall t a. Read a => Int -> ReadS (FullStructure t a)
forall t a. Read a => ReadS [FullStructure t a]
readListPrec :: ReadPrec [FullStructure t a]
$creadListPrec :: forall t a. Read a => ReadPrec [FullStructure t a]
readPrec :: ReadPrec (FullStructure t a)
$creadPrec :: forall t a. Read a => ReadPrec (FullStructure t a)
readList :: ReadS [FullStructure t a]
$creadList :: forall t a. Read a => ReadS [FullStructure t a]
readsPrec :: Int -> ReadS (FullStructure t a)
$creadsPrec :: forall t a. Read a => Int -> ReadS (FullStructure t a)
Read, a -> FullStructure t b -> FullStructure t a
(a -> b) -> FullStructure t a -> FullStructure t b
(forall a b. (a -> b) -> FullStructure t a -> FullStructure t b)
-> (forall a b. a -> FullStructure t b -> FullStructure t a)
-> Functor (FullStructure t)
forall a b. a -> FullStructure t b -> FullStructure t a
forall a b. (a -> b) -> FullStructure t a -> FullStructure t b
forall t a b. a -> FullStructure t b -> FullStructure t a
forall t a b. (a -> b) -> FullStructure t a -> FullStructure t b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> FullStructure t b -> FullStructure t a
$c<$ :: forall t a b. a -> FullStructure t b -> FullStructure t a
fmap :: (a -> b) -> FullStructure t a -> FullStructure t b
$cfmap :: forall t a b. (a -> b) -> FullStructure t a -> FullStructure t b
Functor, Functor (FullStructure t)
Foldable (FullStructure t)
Functor (FullStructure t)
-> Foldable (FullStructure t)
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> FullStructure t a -> f (FullStructure t b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    FullStructure t (f a) -> f (FullStructure t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> FullStructure t a -> m (FullStructure t b))
-> (forall (m :: * -> *) a.
    Monad m =>
    FullStructure t (m a) -> m (FullStructure t a))
-> Traversable (FullStructure t)
(a -> f b) -> FullStructure t a -> f (FullStructure t b)
forall t. Functor (FullStructure t)
forall t. Foldable (FullStructure t)
forall t (m :: * -> *) a.
Monad m =>
FullStructure t (m a) -> m (FullStructure t a)
forall t (f :: * -> *) a.
Applicative f =>
FullStructure t (f a) -> f (FullStructure t a)
forall t (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FullStructure t a -> m (FullStructure t b)
forall t (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FullStructure t a -> f (FullStructure t b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
FullStructure t (m a) -> m (FullStructure t a)
forall (f :: * -> *) a.
Applicative f =>
FullStructure t (f a) -> f (FullStructure t a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FullStructure t a -> m (FullStructure t b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FullStructure t a -> f (FullStructure t b)
sequence :: FullStructure t (m a) -> m (FullStructure t a)
$csequence :: forall t (m :: * -> *) a.
Monad m =>
FullStructure t (m a) -> m (FullStructure t a)
mapM :: (a -> m b) -> FullStructure t a -> m (FullStructure t b)
$cmapM :: forall t (m :: * -> *) a b.
Monad m =>
(a -> m b) -> FullStructure t a -> m (FullStructure t b)
sequenceA :: FullStructure t (f a) -> f (FullStructure t a)
$csequenceA :: forall t (f :: * -> *) a.
Applicative f =>
FullStructure t (f a) -> f (FullStructure t a)
traverse :: (a -> f b) -> FullStructure t a -> f (FullStructure t b)
$ctraverse :: forall t (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> FullStructure t a -> f (FullStructure t b)
$cp2Traversable :: forall t. Foldable (FullStructure t)
$cp1Traversable :: forall t. Functor (FullStructure t)
Traversable, FullStructure t a -> Bool
(a -> m) -> FullStructure t a -> m
(a -> b -> b) -> b -> FullStructure t a -> b
(forall m. Monoid m => FullStructure t m -> m)
-> (forall m a. Monoid m => (a -> m) -> FullStructure t a -> m)
-> (forall m a. Monoid m => (a -> m) -> FullStructure t a -> m)
-> (forall a b. (a -> b -> b) -> b -> FullStructure t a -> b)
-> (forall a b. (a -> b -> b) -> b -> FullStructure t a -> b)
-> (forall b a. (b -> a -> b) -> b -> FullStructure t a -> b)
-> (forall b a. (b -> a -> b) -> b -> FullStructure t a -> b)
-> (forall a. (a -> a -> a) -> FullStructure t a -> a)
-> (forall a. (a -> a -> a) -> FullStructure t a -> a)
-> (forall a. FullStructure t a -> [a])
-> (forall a. FullStructure t a -> Bool)
-> (forall a. FullStructure t a -> Int)
-> (forall a. Eq a => a -> FullStructure t a -> Bool)
-> (forall a. Ord a => FullStructure t a -> a)
-> (forall a. Ord a => FullStructure t a -> a)
-> (forall a. Num a => FullStructure t a -> a)
-> (forall a. Num a => FullStructure t a -> a)
-> Foldable (FullStructure t)
forall a. Eq a => a -> FullStructure t a -> Bool
forall a. Num a => FullStructure t a -> a
forall a. Ord a => FullStructure t a -> a
forall m. Monoid m => FullStructure t m -> m
forall a. FullStructure t a -> Bool
forall a. FullStructure t a -> Int
forall a. FullStructure t a -> [a]
forall a. (a -> a -> a) -> FullStructure t a -> a
forall t a. Eq a => a -> FullStructure t a -> Bool
forall t a. Num a => FullStructure t a -> a
forall t a. Ord a => FullStructure t a -> a
forall m a. Monoid m => (a -> m) -> FullStructure t a -> m
forall t m. Monoid m => FullStructure t m -> m
forall t a. FullStructure t a -> Bool
forall t a. FullStructure t a -> Int
forall t a. FullStructure t a -> [a]
forall b a. (b -> a -> b) -> b -> FullStructure t a -> b
forall a b. (a -> b -> b) -> b -> FullStructure t a -> b
forall t a. (a -> a -> a) -> FullStructure t a -> a
forall t m a. Monoid m => (a -> m) -> FullStructure t a -> m
forall t b a. (b -> a -> b) -> b -> FullStructure t a -> b
forall t a b. (a -> b -> b) -> b -> FullStructure t a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: FullStructure t a -> a
$cproduct :: forall t a. Num a => FullStructure t a -> a
sum :: FullStructure t a -> a
$csum :: forall t a. Num a => FullStructure t a -> a
minimum :: FullStructure t a -> a
$cminimum :: forall t a. Ord a => FullStructure t a -> a
maximum :: FullStructure t a -> a
$cmaximum :: forall t a. Ord a => FullStructure t a -> a
elem :: a -> FullStructure t a -> Bool
$celem :: forall t a. Eq a => a -> FullStructure t a -> Bool
length :: FullStructure t a -> Int
$clength :: forall t a. FullStructure t a -> Int
null :: FullStructure t a -> Bool
$cnull :: forall t a. FullStructure t a -> Bool
toList :: FullStructure t a -> [a]
$ctoList :: forall t a. FullStructure t a -> [a]
foldl1 :: (a -> a -> a) -> FullStructure t a -> a
$cfoldl1 :: forall t a. (a -> a -> a) -> FullStructure t a -> a
foldr1 :: (a -> a -> a) -> FullStructure t a -> a
$cfoldr1 :: forall t a. (a -> a -> a) -> FullStructure t a -> a
foldl' :: (b -> a -> b) -> b -> FullStructure t a -> b
$cfoldl' :: forall t b a. (b -> a -> b) -> b -> FullStructure t a -> b
foldl :: (b -> a -> b) -> b -> FullStructure t a -> b
$cfoldl :: forall t b a. (b -> a -> b) -> b -> FullStructure t a -> b
foldr' :: (a -> b -> b) -> b -> FullStructure t a -> b
$cfoldr' :: forall t a b. (a -> b -> b) -> b -> FullStructure t a -> b
foldr :: (a -> b -> b) -> b -> FullStructure t a -> b
$cfoldr :: forall t a b. (a -> b -> b) -> b -> FullStructure t a -> b
foldMap' :: (a -> m) -> FullStructure t a -> m
$cfoldMap' :: forall t m a. Monoid m => (a -> m) -> FullStructure t a -> m
foldMap :: (a -> m) -> FullStructure t a -> m
$cfoldMap :: forall t m a. Monoid m => (a -> m) -> FullStructure t a -> m
fold :: FullStructure t m -> m
$cfold :: forall t m. Monoid m => FullStructure t m -> m
Foldable, (forall x. FullStructure t a -> Rep (FullStructure t a) x)
-> (forall x. Rep (FullStructure t a) x -> FullStructure t a)
-> Generic (FullStructure t a)
forall x. Rep (FullStructure t a) x -> FullStructure t a
forall x. FullStructure t a -> Rep (FullStructure t a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall t a x. Rep (FullStructure t a) x -> FullStructure t a
forall t a x. FullStructure t a -> Rep (FullStructure t a) x
$cto :: forall t a x. Rep (FullStructure t a) x -> FullStructure t a
$cfrom :: forall t a x. FullStructure t a -> Rep (FullStructure t a) x
Generic, FullStructure t a -> FullStructure t a -> Bool
(FullStructure t a -> FullStructure t a -> Bool)
-> (FullStructure t a -> FullStructure t a -> Bool)
-> Eq (FullStructure t a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall t a. Eq a => FullStructure t a -> FullStructure t a -> Bool
/= :: FullStructure t a -> FullStructure t a -> Bool
$c/= :: forall t a. Eq a => FullStructure t a -> FullStructure t a -> Bool
== :: FullStructure t a -> FullStructure t a -> Bool
$c== :: forall t a. Eq a => FullStructure t a -> FullStructure t a -> Bool
Eq, Eq (FullStructure t a)
Eq (FullStructure t a)
-> (FullStructure t a -> FullStructure t a -> Ordering)
-> (FullStructure t a -> FullStructure t a -> Bool)
-> (FullStructure t a -> FullStructure t a -> Bool)
-> (FullStructure t a -> FullStructure t a -> Bool)
-> (FullStructure t a -> FullStructure t a -> Bool)
-> (FullStructure t a -> FullStructure t a -> FullStructure t a)
-> (FullStructure t a -> FullStructure t a -> FullStructure t a)
-> Ord (FullStructure t a)
FullStructure t a -> FullStructure t a -> Bool
FullStructure t a -> FullStructure t a -> Ordering
FullStructure t a -> FullStructure t a -> FullStructure t a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall t a. Ord a => Eq (FullStructure t a)
forall t a. Ord a => FullStructure t a -> FullStructure t a -> Bool
forall t a.
Ord a =>
FullStructure t a -> FullStructure t a -> Ordering
forall t a.
Ord a =>
FullStructure t a -> FullStructure t a -> FullStructure t a
min :: FullStructure t a -> FullStructure t a -> FullStructure t a
$cmin :: forall t a.
Ord a =>
FullStructure t a -> FullStructure t a -> FullStructure t a
max :: FullStructure t a -> FullStructure t a -> FullStructure t a
$cmax :: forall t a.
Ord a =>
FullStructure t a -> FullStructure t a -> FullStructure t a
>= :: FullStructure t a -> FullStructure t a -> Bool
$c>= :: forall t a. Ord a => FullStructure t a -> FullStructure t a -> Bool
> :: FullStructure t a -> FullStructure t a -> Bool
$c> :: forall t a. Ord a => FullStructure t a -> FullStructure t a -> Bool
<= :: FullStructure t a -> FullStructure t a -> Bool
$c<= :: forall t a. Ord a => FullStructure t a -> FullStructure t a -> Bool
< :: FullStructure t a -> FullStructure t a -> Bool
$c< :: forall t a. Ord a => FullStructure t a -> FullStructure t a -> Bool
compare :: FullStructure t a -> FullStructure t a -> Ordering
$ccompare :: forall t a.
Ord a =>
FullStructure t a -> FullStructure t a -> Ordering
$cp1Ord :: forall t a. Ord a => Eq (FullStructure t a)
Ord)
makeLenses ''FullStructure



-- ** Parses a ViennaRNA secondary structure string.

pUnpaired :: Parser (SubStructure () ())
pUnpaired :: Parser (SubStructure () ())
pUnpaired = () -> SubStructure () ()
forall t a. a -> SubStructure t a
Unpaired () SubStructure () ()
-> Parser ByteString Char -> Parser (SubStructure () ())
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser ByteString Char
char Char
'.'
{-# Inlinable pUnpaired #-}

pPaired :: Parser (SubStructure () ())
pPaired :: Parser (SubStructure () ())
pPaired = () -> Vector (SubStructure () ()) -> SubStructure () ()
forall t a. a -> Vector (SubStructure t a) -> SubStructure t a
Paired () (Vector (SubStructure () ()) -> SubStructure () ())
-> Parser ByteString Char
-> Parser
     ByteString (Vector (SubStructure () ()) -> SubStructure () ())
forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ Char -> Parser ByteString Char
char Char
'(' Parser
  ByteString (Vector (SubStructure () ()) -> SubStructure () ())
-> Parser ByteString (Vector (SubStructure () ()))
-> Parser (SubStructure () ())
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ([SubStructure () ()] -> Vector (SubStructure () ())
forall a. [a] -> Vector a
fromList ([SubStructure () ()] -> Vector (SubStructure () ()))
-> Parser ByteString [SubStructure () ()]
-> Parser ByteString (Vector (SubStructure () ()))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (SubStructure () ())
-> Parser ByteString [SubStructure () ()]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser (SubStructure () ())
pSubStructure) Parser (SubStructure () ())
-> Parser ByteString Char -> Parser (SubStructure () ())
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser ByteString Char
char Char
')'
{-# Inlinable pPaired #-}

pSubStructure :: Parser (SubStructure () ())
pSubStructure :: Parser (SubStructure () ())
pSubStructure = Parser (SubStructure () ())
pUnpaired Parser (SubStructure () ())
-> Parser (SubStructure () ()) -> Parser (SubStructure () ())
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Parser (SubStructure () ())
pPaired
{-# Inlinable pSubStructure #-}

pFullStructure :: Parser (FullStructure () ())
pFullStructure :: Parser (FullStructure () ())
pFullStructure = Vector (SubStructure () ()) -> FullStructure () ()
forall t a. Vector (SubStructure t a) -> FullStructure t a
FullStructure (Vector (SubStructure () ()) -> FullStructure () ())
-> ([SubStructure () ()] -> Vector (SubStructure () ()))
-> [SubStructure () ()]
-> FullStructure () ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [SubStructure () ()] -> Vector (SubStructure () ())
forall a. [a] -> Vector a
fromList ([SubStructure () ()] -> FullStructure () ())
-> Parser ByteString [SubStructure () ()]
-> Parser (FullStructure () ())
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser (SubStructure () ())
-> Parser ByteString [SubStructure () ()]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many Parser (SubStructure () ())
pSubStructure Parser (FullStructure () ())
-> Parser ByteString () -> Parser (FullStructure () ())
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Parser ByteString ()
forall t. Chunk t => Parser t ()
endOfInput
{-# Inlinable pFullStructure #-}

newtype StructureParseError = StructureParseError String
  deriving (Int -> StructureParseError -> ShowS
[StructureParseError] -> ShowS
StructureParseError -> String
(Int -> StructureParseError -> ShowS)
-> (StructureParseError -> String)
-> ([StructureParseError] -> ShowS)
-> Show StructureParseError
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [StructureParseError] -> ShowS
$cshowList :: [StructureParseError] -> ShowS
show :: StructureParseError -> String
$cshow :: StructureParseError -> String
showsPrec :: Int -> StructureParseError -> ShowS
$cshowsPrec :: Int -> StructureParseError -> ShowS
Show)

parseVienna :: MonadError StructureParseError m  ByteString -> m (FullStructure () ())
parseVienna :: ByteString -> m (FullStructure () ())
parseVienna = (String -> m (FullStructure () ()))
-> (FullStructure () () -> m (FullStructure () ()))
-> Either String (FullStructure () ())
-> m (FullStructure () ())
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (StructureParseError -> m (FullStructure () ())
forall e (m :: * -> *) a. MonadError e m => e -> m a
throwError (StructureParseError -> m (FullStructure () ()))
-> (String -> StructureParseError)
-> String
-> m (FullStructure () ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> StructureParseError
StructureParseError) FullStructure () () -> m (FullStructure () ())
forall (m :: * -> *) a. Monad m => a -> m a
return (Either String (FullStructure () ()) -> m (FullStructure () ()))
-> (ByteString -> Either String (FullStructure () ()))
-> ByteString
-> m (FullStructure () ())
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parser (FullStructure () ())
-> ByteString -> Either String (FullStructure () ())
forall a. Parser a -> ByteString -> Either String a
parseOnly Parser (FullStructure () ())
pFullStructure
{-# Inlinable parseVienna #-}



-- ** Transform into a @Tree@.

-- | Transform a 'FullStructure' into a 'Tree'.
--
-- Given a full structure generated like this:
-- @
-- s = either (error . show) id $ parseVienna $ pack ".()(())."
-- @
--
-- a tree of just the base paired can be created with
-- @
-- toTree (preview (_Paired._1)) () s
-- @

toTree
  :: (SubStructure t a -> Maybe b)
  -- ^ how to handle substructure elements? @Nothing@ means discard this
  -- substructure and all children.
  -> b
  -- ^ The root label
  -> FullStructure (t :: *) a
  -- ^ The @FullStructure@ to transform into a @Tree@.
  -> Tree b
toTree :: (SubStructure t a -> Maybe b) -> b -> FullStructure t a -> Tree b
toTree SubStructure t a -> Maybe b
f b
r (FullStructure Vector (SubStructure t a)
ts) = b -> Forest b -> Tree b
forall a. a -> Forest a -> Tree a
Node b
r (Forest b -> Tree b) -> Forest b -> Tree b
forall a b. (a -> b) -> a -> b
$ (SubStructure t a -> Maybe (Tree b))
-> Vector (SubStructure t a) -> Vector (Maybe (Tree b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SubStructure t a -> Maybe (Tree b)
go Vector (SubStructure t a)
ts Vector (Maybe (Tree b))
-> Getting (Endo (Forest b)) (Vector (Maybe (Tree b))) (Tree b)
-> Forest b
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. (Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
-> Vector (Maybe (Tree b))
-> Const (Endo (Forest b)) (Vector (Maybe (Tree b)))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
 -> Vector (Maybe (Tree b))
 -> Const (Endo (Forest b)) (Vector (Maybe (Tree b))))
-> ((Tree b -> Const (Endo (Forest b)) (Tree b))
    -> Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
-> Getting (Endo (Forest b)) (Vector (Maybe (Tree b))) (Tree b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree b -> Const (Endo (Forest b)) (Tree b))
-> Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b))
forall a b. Prism (Maybe a) (Maybe b) a b
_Just
  where
    go :: SubStructure t a -> Maybe (Tree b)
go u :: SubStructure t a
u@Unpaired{} = (b -> Forest b -> Tree b
forall a. a -> Forest a -> Tree a
`Node` []) (b -> Tree b) -> Maybe b -> Maybe (Tree b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SubStructure t a -> Maybe b
f SubStructure t a
u
    go p :: SubStructure t a
p@Paired{}   = case SubStructure t a -> Maybe b
f SubStructure t a
p of
      Maybe b
Nothing  -> Maybe (Tree b)
forall a. Maybe a
Nothing
      Just b
lbl -> Tree b -> Maybe (Tree b)
forall a. a -> Maybe a
Just (Tree b -> Maybe (Tree b)) -> Tree b -> Maybe (Tree b)
forall a b. (a -> b) -> a -> b
$ b -> Forest b -> Tree b
forall a. a -> Forest a -> Tree a
Node b
lbl (Forest b -> Tree b) -> Forest b -> Tree b
forall a b. (a -> b) -> a -> b
$ ((SubStructure t a -> Maybe (Tree b))
-> Vector (SubStructure t a) -> Vector (Maybe (Tree b))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SubStructure t a -> Maybe (Tree b)
go (Vector (SubStructure t a) -> Vector (Maybe (Tree b)))
-> Vector (SubStructure t a) -> Vector (Maybe (Tree b))
forall a b. (a -> b) -> a -> b
$ SubStructure t a
pSubStructure t a
-> Getting
     (Vector (SubStructure t a))
     (SubStructure t a)
     (Vector (SubStructure t a))
-> Vector (SubStructure t a)
forall s a. s -> Getting a s a -> a
^.Getting
  (Vector (SubStructure t a))
  (SubStructure t a)
  (Vector (SubStructure t a))
forall t a t.
Traversal
  (SubStructure t a)
  (SubStructure t a)
  (Vector (SubStructure t a))
  (Vector (SubStructure t a))
subStructures) Vector (Maybe (Tree b))
-> Getting (Endo (Forest b)) (Vector (Maybe (Tree b))) (Tree b)
-> Forest b
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. (Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
-> Vector (Maybe (Tree b))
-> Const (Endo (Forest b)) (Vector (Maybe (Tree b)))
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverse ((Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
 -> Vector (Maybe (Tree b))
 -> Const (Endo (Forest b)) (Vector (Maybe (Tree b))))
-> ((Tree b -> Const (Endo (Forest b)) (Tree b))
    -> Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b)))
-> Getting (Endo (Forest b)) (Vector (Maybe (Tree b))) (Tree b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree b -> Const (Endo (Forest b)) (Tree b))
-> Maybe (Tree b) -> Const (Endo (Forest b)) (Maybe (Tree b))
forall a b. Prism (Maybe a) (Maybe b) a b
_Just
{-# Inlinable toTree #-}