packages feed

flowsim-0.3.5: src/Duplicator.hs

{- Extremely simple program to introduce duplicates -}

module Duplicator where

import System.IO
import System.Environment (getArgs)
import Control.Monad (when)
import Bio.Sequence.Fasta

import Statistics

main :: IO ()
main = do
  args <- getArgs
  case args of 
       (p:rest) -> do
           let p' = read p 
               i = case rest of [] -> hReadFasta stdin 
                                [f] -> readFasta f
           when (p'<=0 || p'>=1) $ error "Probability should be between 0 and 1"
           i >>= evalRandIO . dup p' >>= hWriteFasta stdout
       _ -> error "Usage: duplicator pr\n   where pr is the (recursive) probability of duplicating a sequence"

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