From a0a38a91bd8684d009d7b890fca63d3454a5b89b Mon Sep 17 00:00:00 2001 From: Emi Simpson Date: Mon, 22 May 2023 13:35:52 -0400 Subject: [PATCH] Set up this silly little thing --- .gitignore | 1 + elm.json | 25 ++++++++++++++++++ src/GenderFriends.elm | 37 ++++++++++++++++++++++++++ src/Main.elm | 60 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 123 insertions(+) create mode 100644 .gitignore create mode 100644 elm.json create mode 100644 src/GenderFriends.elm create mode 100644 src/Main.elm diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4bc8535 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +elm-stuff diff --git a/elm.json b/elm.json new file mode 100644 index 0000000..d100bad --- /dev/null +++ b/elm.json @@ -0,0 +1,25 @@ +{ + "type": "application", + "source-directories": [ + "src" + ], + "elm-version": "0.19.1", + "dependencies": { + "direct": { + "elm/browser": "1.0.2", + "elm/core": "1.0.5", + "elm/html": "1.0.0", + "elm/random": "1.0.0" + }, + "indirect": { + "elm/json": "1.1.3", + "elm/time": "1.0.0", + "elm/url": "1.0.0", + "elm/virtual-dom": "1.0.3" + } + }, + "test-dependencies": { + "direct": {}, + "indirect": {} + } +} diff --git a/src/GenderFriends.elm b/src/GenderFriends.elm new file mode 100644 index 0000000..0f82474 --- /dev/null +++ b/src/GenderFriends.elm @@ -0,0 +1,37 @@ +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) \ No newline at end of file diff --git a/src/Main.elm b/src/Main.elm new file mode 100644 index 0000000..53bc3be --- /dev/null +++ b/src/Main.elm @@ -0,0 +1,60 @@ +module Main exposing (main) + +import Browser +import Random +import Html exposing (Html, button, div, p, text) +import Html.Events exposing (onClick) +import GenderFriends exposing (altBlumBlumShub, getPolygenderWithLength, renderPolygender) + +constant a b = a + +main = Browser.element + { init = init + , update = update + , subscriptions = constant Sub.none + , view = view + } + +type Model + = AwaitingSeed + | Ready Int {- seed -} Int {- regeneration count -} + +type Msg + = SetSeed Int + | Regenerate + +init : () -> (Model, Cmd Msg) +init _ = (AwaitingSeed, Random.generate SetSeed (Random.int 2147483648 4294967296)) + +update : Msg -> Model -> (Model, Cmd Msg) +update msg model = + let + newModel = + case msg of + SetSeed seed -> Ready seed 0 + Regenerate -> case model of + AwaitingSeed -> AwaitingSeed + Ready oldSeed regenCount -> Ready (altBlumBlumShub oldSeed) (regenCount + 1) + in + (newModel, Cmd.none) + +viewStr : Model -> String +viewStr model = case model of + AwaitingSeed -> "...loading..." + Ready seed regenCount -> + let + (gender, newSeed) = getPolygenderWithLength regenCount seed + genderStr = renderPolygender gender + in "do u think a wuppie and a kitties could be " ++ genderStr ++ ",,?" + +view : Model -> Html Msg +view model = + div [] + [ p [] [ text (viewStr model) ] + , button + ( case model of + AwaitingSeed -> [] + Ready _ _ -> [onClick Regenerate] + ) + [ text "make it gayer" ] + ] \ No newline at end of file