packages feed

flowsim-0.3: src/Duplicator.hs

{- Extremely simple program to introduce duplicates -}

module Duplicator where

import System.IO
import System.Environment (getArgs)

import Bio.Sequence
import Statistics

main :: IO ()
main = do
  args <- getArgs
  case args of [p] -> hReadFasta stdin >>= evalRandIO . dup (read p) . map castToNuc >>= hWriteFasta stdout
               _ -> error "Usage: duplicator pr\n   where pr is the probability of recursively duplicating a sequence"

dup :: RandomGen g => Double -> [Sequence Nuc] -> Rand g [Sequence Nuc]
dup p (x:xs) = do
  r <- getRandomR (0,1)
  if r < p 
    then dup p (x:x:xs)
    else do ys <- dup p xs
            return (x:ys)
dup _ [] = return []