module GenderFriends exposing (altBlumBlumShub, nextBlumBlumShub, BoringGender(..), PolyGender, getBoringGender, getPolygenderWithLength, renderBoringGender, renderPolygender) m1 = 3042724273 -- Product of two 16 bit primes equivalent to 3 (mod 4) m2 = 1922092321 -- A different product of two 16 bit primes equivalent to 3 (mod 4) nextBlumBlumShub prev = modBy m1 (prev * prev) altBlumBlumShub prev = modBy m2 (prev * prev) type BoringGender = Girl | Boy type alias PolyGender = List BoringGender getBoringGender : Int -> (BoringGender, Int) getBoringGender seed = let bitFromSeed = modBy 2 seed == 1 nextSeed = nextBlumBlumShub seed in (if bitFromSeed then Girl else Boy, nextSeed) getPolygenderWithLength : Int -> Int -> (PolyGender, Int) getPolygenderWithLength n seed = case n of 0 -> ([], seed) _ -> let (recursiveCase, newSeed) = getPolygenderWithLength (n - 1) seed (boringGender, finalSeed) = getBoringGender newSeed in (boringGender :: recursiveCase, finalSeed) renderBoringGender : BoringGender -> String renderBoringGender gender = case gender of Boy -> "boy" Girl -> "girl" renderPolygender : PolyGender -> String renderPolygender polygender = case polygender of [] -> "friends" head :: tail -> (renderBoringGender head) ++ (renderPolygender tail)