diff --git a/aufgaben/src/Pflichtuebung_01/Date.elm b/aufgaben/src/Date.elm similarity index 98% rename from aufgaben/src/Pflichtuebung_01/Date.elm rename to aufgaben/src/Date.elm index 5f11b8c..c8fdeeb 100644 --- a/aufgaben/src/Pflichtuebung_01/Date.elm +++ b/aufgaben/src/Date.elm @@ -1,4 +1,4 @@ -module Pflichtuebung_01.Date exposing (..) +module Date exposing (..) type alias Day = Int diff --git a/aufgaben/tests/Pflichtuebung_01/DateTests.elm b/aufgaben/tests/DateTests.elm similarity index 98% rename from aufgaben/tests/Pflichtuebung_01/DateTests.elm rename to aufgaben/tests/DateTests.elm index 79e060f..6a473bc 100644 --- a/aufgaben/tests/Pflichtuebung_01/DateTests.elm +++ b/aufgaben/tests/DateTests.elm @@ -1,10 +1,10 @@ -module Pflichtuebung_01.DateTests exposing (..) +module DateTests exposing (..) import Expect exposing (Expectation) import Fuzz exposing (Fuzzer, int, list, string) import Test exposing (..) -import Pflichtuebung_01.Date exposing (..) +import Date exposing (..) testYear : Test diff --git a/pu2/elm.json b/pu2/elm.json new file mode 100644 index 0000000..ce2a08d --- /dev/null +++ b/pu2/elm.json @@ -0,0 +1,24 @@ +{ + "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" + }, + "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/aufgaben/src/02/Date.elm b/pu2/src/Date.elm similarity index 100% rename from aufgaben/src/02/Date.elm rename to pu2/src/Date.elm diff --git a/pu2/src/Main.elm b/pu2/src/Main.elm new file mode 100644 index 0000000..3963cf1 --- /dev/null +++ b/pu2/src/Main.elm @@ -0,0 +1,210 @@ +module Main exposing (..) + +import Html exposing (..) +import Html.Attributes exposing (..) +import Browser +import Html.Events exposing (..) +import List + +import Date exposing (..) +import String + + +type alias Model = + { + arbeit : Arbeit + , beginndatum : Date + , besprechungsWochentag : Weekday + , anzahlWochenZwischenBesprechung : Int + } + + +type Msg + = SetStartDate String + | SetInterval String + | SetDegree String + | SetBesprechundsWochentag String + +type Arbeit + = Bachelor + | Master + +initModel : Model +initModel = + { + arbeit = Bachelor + , beginndatum = (21, 12, 2022) + , besprechungsWochentag = Mon + , anzahlWochenZwischenBesprechung = 1 + } + +getWeekday : Date -> Weekday +getWeekday date = + addWeekdays (Date.sub date (21, 12, 2022)) Wed + +addWeekdays : Int -> Weekday -> Weekday +addWeekdays count day = + if count < 0 + then + case count of + 0 -> day + _ -> addWeekdays (count + 1) (prevWeekDay day) + else + if count == 0 + then + case count of + 0 -> day + _ -> addWeekdays (count - 1) (nextWeekDay day) + else day + +nextWeekDay : Weekday -> Weekday +nextWeekDay day = + case day of + Mon -> Tue + Tue -> Wed + Wed -> Thu + Thu -> Fri + Fri -> Sat + Sat -> Sun + Sun -> Mon + +prevWeekDay : Weekday -> Weekday +prevWeekDay day = + case day of + Mon -> Tue + Tue -> Wed + Wed -> Thu + Thu -> Fri + Fri -> Sat + Sat -> Sun + Sun -> Mon + +getMonthLength : Date -> Int +getMonthLength date = + case Date.month date of + 1 -> 31 + 2 -> if Date.leapyear (Date.year date) then 28 else 29 + 3 -> 31 + 4 -> 30 + 5 -> 31 + 6 -> 30 + 7 -> 31 + 8 -> 31 + 9 -> 30 + 10 -> 31 + 11 -> 30 + 12 -> 31 + _ -> 30 + + +addMonths : Int -> Date -> Date +addMonths count date = + if count > 0 + then addMonths (count - 1) (addDays (getMonthLength date) date) + else date + +addDays : Int -> Date -> Date +addDays count date = + if count > 0 + then addDays (count - 1) (Date.next date) + else date + +addMonthsLiterally : Int -> Date -> Date +addMonthsLiterally count date = + let newMonth = (Date.month date) + count + newDate = (Date.day date, if newMonth > 12 then (modBy 12 newMonth) else newMonth, if newMonth > 12 then (Date.year date) + 1 else Date.year date) + newDateMonthLength = getMonthLength newDate + in if Date.day newDate > newDateMonthLength then (Date.day date, newDateMonthLength, Date.year date) else newDate + +calculateAbgabeEndDate : Arbeit -> Date -> Date +calculateAbgabeEndDate arbeit date = + case arbeit of + Bachelor -> Date.prev (addMonthsLiterally 3 date) + Master -> Date.prev (addMonthsLiterally 6 date) + +validiereModel : Model -> Result String String +validiereModel model = + case model.besprechungsWochentag of + Sat -> Err "Datum darf kein Samstag sein" + Sun -> Err "Datum darf kein Sonntag sein" + _ -> Ok "Alles klärchen" + +berechneDaten : Model -> List String +berechneDaten model = [] {- TODO -} + +update : Msg -> Model -> Model +update msg model = + case msg of + SetStartDate date -> + {model | beginndatum = ( + case (String.split " " date) of + ["asap"] -> (21, 12, 2022) {- TODO -} + ["ASAP"] -> (21, 12, 2022) {- TODO -} + [d, m, y] -> case [String.toInt d, String.toInt m, String.toInt y] of + [Just a, Just b, Just c] -> (a, b, c) + _ -> (21, 12, 2022) + _ ->(21, 12, 2022) + ) } + SetDegree arbeits -> + if arbeits == "Bachelor" then + {model | arbeit = Bachelor } + else + {model | arbeit = Master } + SetInterval str -> + {model | anzahlWochenZwischenBesprechung = String.toInt str |> Maybe.withDefault 0} + SetBesprechundsWochentag weekday -> + {model | besprechungsWochentag = case weekday of + "Montag" -> Mon + "Dienstag" -> Tue + "Mittwoch" -> Wed + "Donnerstag" -> Thu + "Freitag" -> Fri + _ -> Mon + } + + + +view : Model -> Html Msg +view model = + div [] + [ + select [onInput SetDegree] + [ + option [value "Bachelor"] [text "Bachelor"] + , option [value "Master"] [text "Master"] + ] + , input [onInput SetStartDate, placeholder "21 12 2022"] [] + , select [onInput SetBesprechundsWochentag] + [ + option [value "Montag"] [text "Montag"] + , option [value "Dienstag"] [text "Dienstag"] + , option [value "Mittwoch"] [text "Mittwoch"] + , option [value "Donnerstag"] [text "Donnerstag"] + , option [value "Freitag"] [text "Freitag"] + ] + , select [onInput SetInterval] + [ + option [value "1"] [text "1 Woche"] + , option [value "2"] [text "2 Wochen"] + , option [value "3"] [text "3 Wochen"] + , option [value "4"] [text "4 Wochen"] + + ] + , br [] [] + , ul [] + (model + |> berechneDaten + |> List.map (\datum -> li [] [text datum])) + , text (Debug.toString model.besprechungsWochentag), br[][] + , text (Debug.toString model.beginndatum), br[][] + , text (Debug.toString model.arbeit), br[][] + , text (Debug.toString model.anzahlWochenZwischenBesprechung), br[][] + , text (Debug.toString (getWeekday model.beginndatum)), br[][] + , text (Debug.toString (calculateAbgabeEndDate Bachelor model.beginndatum)), br[][] + , text (Debug.toString (calculateAbgabeEndDate Master model.beginndatum)), br[][] + , text (Debug.toString (getMonthLength model.beginndatum)), br[][] + , text (Debug.toString (Date.sub model.beginndatum (21, 12, 2022))), br[][] + ] + + +main = Browser.sandbox { init = initModel, update = update, view = view } diff --git a/pu2/src/Simple.elm b/pu2/src/Simple.elm new file mode 100644 index 0000000..0d461f9 --- /dev/null +++ b/pu2/src/Simple.elm @@ -0,0 +1,100 @@ +module Simple exposing (main) + +import Browser +import Html exposing (..) +import Html.Events exposing (onClick, onInput) + + +type Direction + = LessThan + | GreaterThan + + +type Msg + = Change String + | Inc + | Filter Direction + + +type alias Model = + { numbers : List Int + , limit : Maybe Int + , filter : Int -> Bool + } + + +initialmodel : Model +initialmodel = + { numbers = [] + , filter = \_ -> True + , limit = Nothing + } + + +view : Model -> Html Msg +view model = + div [] + [ h1 [] + [ text "Zahlen" ] + , p [] + [ text "Dies ist ein Beispiel." ] + , button [ onClick Inc ] + [ text "add" ] + , button [ onClick (Filter LessThan) ] + [ text "filter less than" ] + , input [ onInput Change ] + [] + , button [ onClick (Filter GreaterThan) ] + [ text "filter greater than" ] + , ul [] + (model.numbers + |> List.filter model.filter + |> List.map viewNumber + ) + ] + + +viewNumber : Int -> Html Msg +viewNumber i = + li [] [ text (String.fromInt i) ] + + +functionBuilder : Model -> Direction -> (Int -> Bool) +functionBuilder model dir = + \i -> + case model.limit of + Just n -> + if dir == LessThan then + i > n + + else + n > i + + Nothing -> + True + + +update : Msg -> Model -> Model +update msg model = + case msg of + Change limit -> + { model | limit = String.toInt limit } + + Filter dir -> + { model | filter = functionBuilder model dir } + + Inc -> + { model + | numbers = + case List.maximum model.numbers of + Just max -> + (max + 1) :: model.numbers + + Nothing -> + 0 :: model.numbers + } + + +main : Program () Model Msg +main = + Browser.sandbox { init = initialmodel, update = update, view = view }