--
-- transform to and from dotbracket notation for RNA secondary structures.
--

{-# LANGUAGE RecordWildCards #-}

module Biobase.Structure.DotBracket where

import Data.Array.IArray
import Data.List (sort)

import Biobase.RNA
import Biobase.Structure



-- | Given the secondary structure notation, generate the dot-bracket string.

dotbracket :: Secondary -> String
dotbracket Secondary{..} = elems rbr where
  arr = listArray (0,len-1) $ replicate len '.' :: Array Int Char
  lbr = arr // map (\(l,_) -> (l,'(')) pairings
  rbr = lbr // map (\(_,r) -> (r,')')) pairings



-- | transforms a pseudoknot-free dotbracket string into a pairlist

dotbracketToPairlist :: String -> Secondary
dotbracketToPairlist str = Secondary (length str) (sort $ f 0 [] str) where
  f :: Int -> [Int] -> String -> [(Int,Int)]
  f _ st [] = []
  f k st ('.':xs) = f (k+1) st xs
  f k st ('(':xs) = f (k+1) (k:st) xs
  f k (s:st) (')':xs) = (s,k) : f (k+1) st xs
  f a b c = error $ show (a,b,c)