ouppy/src/GenderFriends.elm

37 lines
1.3 KiB
Elm

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)