@@ -0,0 +1,95 @@
7+alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG\
8+ \TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG\
9+ \CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC\
10+ \GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
12+iub : List (Char, Float)
13+iub = [('a',0.27),('c',0.12),('g',0.12),('t',0.27),('B',0.02)
14+ ,('D',0.02),('H',0.02),('K',0.02),('M',0.02),('N',0.02)
15+ ,('R',0.02),('S',0.02),('V',0.02),('W',0.02),('Y',0.02)]
17+homosapiens : List (Char, Float)
18+homosapiens = [('a',0.3029549426680),('c',0.1979883004921)
19+ ,('g',0.1975473066391),('t',0.3015094502008)]
22+takeRepeat : Nat -> String -> String
23+takeRepeat n s = if n > m
24+ then s ++ takeRepeat (n-m) s
25+ else pack $ take n $ unpack s
29+splitAt' : Nat -> String -> (String, String)
30+splitAt' n s = let s' = unpack s in (pack $ take n s', pack $ drop n s')
32+writeAlu : String -> String -> IO ()
33+writeAlu name s0 = putStrLn name $> go s0
36+ go s = let (h,t) = splitAt' 60 s in putStrLn h $> go t
38+replicate : Nat -> Char -> String
40+replicate (S n) c = singleton c <+> replicate n c
42+inits : List a -> List a -> List (List a)
44+inits xs (h::t) = let xs' = xs ++ [h] in xs :: inits xs' t
46+scanl : (f : acc -> a -> acc) -> acc -> (l : List a) -> List acc
47+scanl f acc l = map (foldl f acc) $ inits [] l
49+accum : (Char,Float) -> (Char,Float) -> (Char,Float)
50+accum (_,p) (c,q) = (c,p+q)
52+instance Cast Nat Float where
53+ cast = cast . cast . cast
55+instance Cast Float Nat where
56+ cast = fromInteger . cast . cast . floor
59+make : String -> Nat -> List (Char, Float) -> Nat -> IO Nat
60+make name n0 tbl seed0 = do
67+ fill : List (Char,Float) -> Nat -> List String
68+ fill ((c,p) :: cps) j =
69+ let k = min modulus (cast (cast modulus * p + 1))
70+ in replicate (k - j) c :: fill cps k
74+ lookupTable = Foldable.concat (fill (drop 1 $ scanl accum ('a',0) tbl) 0)
76+ make' : Nat -> Nat -> Nat -> String -> IO Nat
77+ make' Z col seed buf = when (col > 0) (putStrLn buf) $> return seed
78+ make' (S n) col seed buf = do
80+ let newseed = modNat (seed * 3877 + 39573) modulus
82+ let nextchar = strIndex lookupTable (cast newseed)
85+ then putStrLn buf $> make' n Z newseed (singleton nextchar)
86+ else make' n (S col) newseed (strCons nextchar buf)
91+ (_ :: n :: _) <- getArgs
92+ writeAlu ">ONE Homo sapiens alu" (takeRepeat (fromInteger (cast n)*2) alu)
93+ nseed <- make ">TWO IUB ambiguity codes" (fromInteger (cast n)*3) iub 42
94+ make ">THREE Homo sapiens frequency" (fromInteger (cast n)*5) homosapiens nseed