├── .idea ├── .gitignore ├── codeStyles │ ├── Project.xml │ └── codeStyleConfig.xml ├── kotlinc.xml ├── libraries │ └── KotlinJavaRuntime.xml ├── misc.xml ├── modules.xml ├── uiDesigner.xml └── vcs.xml ├── DeclarativeProgramming.iml ├── README.md ├── out └── production │ └── DeclarativeProgramming │ ├── META-INF │ └── DeclarativeProgramming.kotlin_module │ ├── models │ ├── Availability.class │ ├── Customer.class │ ├── Freight.class │ ├── Invoice.class │ ├── MyOrder.class │ ├── Shipping.class │ └── ShippingDate.class │ ├── session1 │ ├── Hello.class │ └── Session1Kt.class │ ├── session2 │ └── Session2Kt.class │ ├── session3 │ ├── Order.class │ ├── Product.class │ ├── Session3Kt$getBeverageParameters$1.class │ ├── Session3Kt$getFoodParameters$1.class │ ├── Session3Kt$getRawMaterialParameters$1.class │ └── Session3Kt.class │ ├── session4 │ ├── Session4Kt$calcA$1.class │ ├── Session4Kt$calcB$1.class │ ├── Session4Kt$calcC$1.class │ ├── Session4Kt$isAQualified$1.class │ ├── Session4Kt$isBQualified$1.class │ ├── Session4Kt$isCQualified$1.class │ └── Session4Kt.class │ ├── session5 │ ├── Session5Kt$compose$1.class │ ├── Session5Kt$composeFunction$1.class │ ├── Session5Kt$lambdaAddOne$1.class │ ├── Session5Kt$lambdaSquare$1.class │ ├── Session5Kt$lambdaSubtractTen$1.class │ └── Session5Kt.class │ ├── session6 │ ├── AvailabilityChoice.class │ ├── AvailabilityPath$calcAvailability1$1.class │ ├── AvailabilityPath$calcAvailability2$1.class │ ├── AvailabilityPath$calcAvailability3$1.class │ ├── AvailabilityPath$calcAvailability4$1.class │ ├── AvailabilityPath$calcShippingDate1$1.class │ ├── AvailabilityPath$calcShippingDate2$1.class │ ├── AvailabilityPath$calcShippingDate3$1.class │ ├── AvailabilityPath$calcShippingDate4$1.class │ ├── AvailabilityPath$calcShippingDate5$1.class │ ├── AvailabilityPath.class │ ├── FreightChoice.class │ ├── InvoiceChoice.class │ ├── InvoicePath$calcFreightCost1$1.class │ ├── InvoicePath$calcFreightCost2$1.class │ ├── InvoicePath$calcFreightCost3$1.class │ ├── InvoicePath$calcFreightCost4$1.class │ ├── InvoicePath$calcFreightCost5$1.class │ ├── InvoicePath$calcFreightCost6$1.class │ ├── InvoicePath$calcInvoice1$1.class │ ├── InvoicePath$calcInvoice2$1.class │ ├── InvoicePath$calcInvoice3$1.class │ ├── InvoicePath$calcInvoice4$1.class │ ├── InvoicePath$calcInvoice5$1.class │ ├── InvoicePath$calcShipping1$1.class │ ├── InvoicePath$calcShipping2$1.class │ ├── InvoicePath$calcShipping3$1.class │ ├── InvoicePath.class │ ├── ProcessConfiguration.class │ ├── Session6Kt$calcAdjustedCostOfOrder$1.class │ ├── Session6Kt$compose$1.class │ ├── Session6Kt.class │ ├── ShippingChoice.class │ └── ShippingDateChoice.class │ ├── session7 │ ├── SessionKt$grossSalaryCalculator$1.class │ ├── SessionKt$test$1.class │ └── SessionKt.class │ └── session8 │ ├── Session8Kt$lambdaAddOne$1.class │ ├── Session8Kt$lambdaSquare$1.class │ ├── Session8Kt$lambdaSubtractTen$1.class │ └── Session8Kt.class └── src └── main └── kotlin ├── models ├── Availability.kt ├── Customer.kt ├── Freight.kt ├── Invoice.kt ├── MyOrder.kt ├── Shipping.kt └── ShippingDate.kt ├── session1 └── Session1.kt ├── session2 └── Session2.kt ├── session3 ├── Order.kt └── Session3.kt ├── session4 └── Session4.kt ├── session5 └── Session5.kt ├── session6 ├── AvailabilityPath.kt ├── InvoicePath.kt ├── ProcessConfiguration.kt └── Session6.kt └── session7 └── Session.kt /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 20 | 22 | 23 | 25 | 26 | -------------------------------------------------------------------------------- /.idea/codeStyles/codeStyleConfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | -------------------------------------------------------------------------------- /.idea/kotlinc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /.idea/libraries/KotlinJavaRuntime.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/uiDesigner.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DeclarativeProgramming.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/META-INF/DeclarativeProgramming.kotlin_module: -------------------------------------------------------------------------------- 1 |  2 |  3 | session1 4 | Session1Kt 5 |  6 | session2 7 | Session2Kt 8 |  9 | session3 10 | Session3Kt 11 |  12 | session4 13 | Session4Kt 14 |  15 | session5 16 | Session5Kt 17 |  18 | session6 19 | Session6Kt 20 |  21 | session7 SessionKt 22 |  23 | session8 24 | Session8Kt"* -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/Availability.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/Availability.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/Customer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/Customer.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/Freight.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/Freight.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/Invoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/Invoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/MyOrder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/MyOrder.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/Shipping.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/Shipping.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/models/ShippingDate.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/models/ShippingDate.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session1/Hello.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session1/Hello.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session1/Session1Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session1/Session1Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session2/Session2Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session2/Session2Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Order.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Order.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Product.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Product.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Session3Kt$getBeverageParameters$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Session3Kt$getBeverageParameters$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Session3Kt$getFoodParameters$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Session3Kt$getFoodParameters$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Session3Kt$getRawMaterialParameters$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Session3Kt$getRawMaterialParameters$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session3/Session3Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session3/Session3Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$calcA$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$calcA$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$calcB$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$calcB$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$calcC$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$calcC$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$isAQualified$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$isAQualified$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$isBQualified$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$isBQualified$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt$isCQualified$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt$isCQualified$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session4/Session4Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session4/Session4Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt$compose$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt$compose$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt$composeFunction$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt$composeFunction$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt$lambdaAddOne$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt$lambdaAddOne$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt$lambdaSquare$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt$lambdaSquare$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt$lambdaSubtractTen$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt$lambdaSubtractTen$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session5/Session5Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session5/Session5Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityChoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityChoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability1$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability1$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability2$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability2$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability3$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability3$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability4$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcAvailability4$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate1$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate1$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate2$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate2$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate3$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate3$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate4$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate4$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate5$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath$calcShippingDate5$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/AvailabilityPath.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/AvailabilityPath.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/FreightChoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/FreightChoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoiceChoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoiceChoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost1$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost1$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost2$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost2$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost3$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost3$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost4$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost4$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost5$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost5$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost6$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcFreightCost6$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice1$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice1$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice2$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice2$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice3$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice3$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice4$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice4$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice5$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcInvoice5$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping1$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping1$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping2$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping2$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping3$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath$calcShipping3$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/InvoicePath.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/InvoicePath.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/ProcessConfiguration.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/ProcessConfiguration.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/Session6Kt$calcAdjustedCostOfOrder$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/Session6Kt$calcAdjustedCostOfOrder$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/Session6Kt$compose$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/Session6Kt$compose$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/Session6Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/Session6Kt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/ShippingChoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/ShippingChoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session6/ShippingDateChoice.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session6/ShippingDateChoice.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session7/SessionKt$grossSalaryCalculator$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session7/SessionKt$grossSalaryCalculator$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session7/SessionKt$test$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session7/SessionKt$test$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session7/SessionKt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session7/SessionKt.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session8/Session8Kt$lambdaAddOne$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session8/Session8Kt$lambdaAddOne$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session8/Session8Kt$lambdaSquare$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session8/Session8Kt$lambdaSquare$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session8/Session8Kt$lambdaSubtractTen$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session8/Session8Kt$lambdaSubtractTen$1.class -------------------------------------------------------------------------------- /out/production/DeclarativeProgramming/session8/Session8Kt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/eslamalaaeddin/DeclarativeProgramming/223817871545b05d40f8503f1c0ae2d1eb3e4dbb/out/production/DeclarativeProgramming/session8/Session8Kt.class -------------------------------------------------------------------------------- /src/main/kotlin/models/Availability.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import java.time.LocalDate 4 | import java.util.* 5 | 6 | data class Availability(val date: LocalDate? = null) -------------------------------------------------------------------------------- /src/main/kotlin/models/Customer.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | class Customer { 4 | } -------------------------------------------------------------------------------- /src/main/kotlin/models/Freight.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | data class Freight(val cost: Double = 0.0) -------------------------------------------------------------------------------- /src/main/kotlin/models/Invoice.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | data class Invoice( 4 | val cost: Double = 0.0 5 | ) -------------------------------------------------------------------------------- /src/main/kotlin/models/MyOrder.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import java.time.LocalDate 4 | import java.util.* 5 | 6 | data class MyOrder(var customer: Customer? = null, var date: LocalDate? = null, var cost: Double = 0.0) -------------------------------------------------------------------------------- /src/main/kotlin/models/Shipping.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | data class Shipping(val cost: Double = 0.0, val shipperId: Int? = null) -------------------------------------------------------------------------------- /src/main/kotlin/models/ShippingDate.kt: -------------------------------------------------------------------------------- 1 | package models 2 | 3 | import java.time.LocalDate 4 | import java.util.* 5 | 6 | data class ShippingDate(val date: LocalDate? = null) -------------------------------------------------------------------------------- /src/main/kotlin/session1/Session1.kt: -------------------------------------------------------------------------------- 1 | package session1 2 | 3 | fun main() { 4 | val hello = Hello(0,0) 5 | 6 | hello.updateX(4) 7 | hello.updateY(2) 8 | 9 | println(hello.getZ()) 10 | } 11 | 12 | class Hello(x1: Int, y1: Int) { 13 | private var x = x1 14 | private var y = y1 15 | 16 | fun updateX(v: Int) { 17 | x = v * 2 18 | } 19 | 20 | fun updateY(v: Int) { 21 | y = v * 3 22 | } 23 | 24 | fun getZ() = if (x > 10) x * 2 + 3 * y else x * 3 + 2 * y 25 | } -------------------------------------------------------------------------------- /src/main/kotlin/session2/Session2.kt: -------------------------------------------------------------------------------- 1 | package session2 2 | 3 | fun main() { 4 | val numbers = listOf(7, 4, 5, 6, 3, 8, 10) 5 | 6 | //Imperative 7 | for (x in numbers) { println(subtractTen(square(addOne(x)))) } 8 | 9 | println("\n--------------------------") 10 | 11 | //Declarative 12 | numbers 13 | .map(::addOne) 14 | .map(::square) 15 | .filter { it < 70 } 16 | .sorted() 17 | .take(2) 18 | .map(::subtractTen) 19 | .forEach(::println) 20 | } 21 | 22 | fun square(n: Int) = n * n 23 | fun addOne(n: Int) = n + 1 24 | fun subtractTen(n: Int) = n - 10 25 | -------------------------------------------------------------------------------- /src/main/kotlin/session3/Order.kt: -------------------------------------------------------------------------------- 1 | package session3 2 | 3 | data class Order( 4 | val orderId: Int, 5 | val productIndex: Int, 6 | val quantity: Int, 7 | val unitPrice: Int, 8 | var disocunt: Double = 0.0 9 | ){ 10 | override fun toString(): String { 11 | return "Discount: $disocunt" 12 | } 13 | } -------------------------------------------------------------------------------- /src/main/kotlin/session3/Session3.kt: -------------------------------------------------------------------------------- 1 | package session3 2 | 3 | 4 | fun main() { 5 | //val doubleLambda = { number: Double -> number } 6 | 7 | // //Regular invocation 8 | // println(test2(test1(5.0))) 9 | // println(test1(test2(5.0))) 10 | // 11 | // //Using HOF 12 | // println(test3(test1(5.0), doubleLambda, 5.0)) 13 | // println(test3(test2(5.0), doubleLambda, 5.0)) 14 | 15 | val product = Product.RAW_MATERIAL 16 | val order = Order(10, 100, 20, 4) 17 | 18 | val parameters = 19 | if (product == Product.FOOD) getFoodParameters else (if (product == Product.BEVERAGE) getBeverageParameters else getRawMaterialParameters) 20 | 21 | println(calculateDiscount(parameters, order)) 22 | } 23 | 24 | enum class Product { FOOD, BEVERAGE, RAW_MATERIAL } 25 | 26 | fun test1(x: Double): Double = x / 2 27 | 28 | fun test2(x: Double): Double = x / 4 + 1 29 | 30 | fun test3(num1: Double, doubleLambda: (Double) -> Double, num2: Double): Double { 31 | return doubleLambda.invoke(num1) + num2 32 | } 33 | 34 | val getFoodParameters : (Int) -> Pair = 35 | { productIndex: Int -> Pair(productIndex / productIndex + 100.0, productIndex / productIndex + 300.0) } 36 | 37 | val getBeverageParameters : (Int) -> Pair = 38 | { productIndex: Int -> Pair(productIndex / productIndex + 300.0, productIndex / productIndex + 400.0) } 39 | 40 | val getRawMaterialParameters : (Int) -> Pair = 41 | { productIndex: Int -> Pair(productIndex / productIndex + 400.0, productIndex / productIndex + 700.0) } 42 | 43 | 44 | private fun calculateDiscount(lambdaCalcParameters: (Int) -> Pair, order: Order): Double { 45 | val parameters = lambdaCalcParameters(order.productIndex) 46 | return parameters.first * order.quantity + parameters.second * order.unitPrice 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/main/kotlin/session4/Session4.kt: -------------------------------------------------------------------------------- 1 | package session4 2 | 3 | import session3.Order 4 | 5 | val isAQualified: (Order) -> Boolean = { order: Order -> true } 6 | val calcA: (Order) -> Double = { order: Order -> 10.0 } 7 | 8 | val isBQualified: (Order) -> Boolean = { order: Order -> true } 9 | val calcB: (Order) -> Double = { order: Order -> 20.0 } 10 | 11 | val isCQualified: (Order) -> Boolean = { order: Order -> true } 12 | val calcC: (Order) -> Double = { order: Order -> 30.0 } 13 | 14 | //If we want to add a new rule and add a new pair containing them to rules list 15 | //val isDQualified: (session3.Order) -> Boolean = { order: session3.Order -> true } 16 | //val calcD: (session3.Order) -> Double = { order: session3.Order -> 3=40.0 } 17 | 18 | fun main() { 19 | 20 | val orders = listOf( 21 | Order(1, 100, 10, 10), 22 | Order(2, 200, 20, 20), 23 | Order(3, 300, 30, 30), 24 | Order(4, 400, 40, 40), 25 | Order(5, 500, 50, 50), 26 | Order(6, 600, 60, 60), 27 | Order(7, 700, 70, 70), 28 | Order(8, 800, 80, 80), 29 | Order(9, 900, 90, 90), 30 | ) 31 | 32 | val rules: List Boolean, (Order) -> Double>> = listOf( 33 | Pair(isAQualified, calcA), 34 | Pair(isBQualified, calcB), 35 | Pair(isCQualified, calcC) 36 | ) 37 | 38 | orders.forEach { order -> println(getOrderWithDiscount(order, rules)) } 39 | 40 | 41 | } 42 | 43 | fun getOrderWithDiscount(order: Order, rules: List Boolean, (Order) -> Double>>): Order { 44 | val discount: Double = rules 45 | .filter { pair -> pair.first.invoke(order) } 46 | .map { pair -> pair.second.invoke(order) } 47 | .sorted() 48 | .take(3) 49 | .average() 50 | 51 | //Will be replaced -- Immutability concept 52 | val newOrder: Order = order.copy() 53 | newOrder.disocunt = discount 54 | 55 | return newOrder 56 | } 57 | -------------------------------------------------------------------------------- /src/main/kotlin/session5/Session5.kt: -------------------------------------------------------------------------------- 1 | package session5 2 | 3 | val myData = listOf(3.0, 5.0, 7.0, 8.0) 4 | 5 | fun main() { 6 | // val myFunctionTest: (Double) -> Double = test() 7 | // println(myFunctionTest.invoke(1.0)) 8 | 9 | 10 | println(myData 11 | .map { n -> addOne(n) } 12 | .map { n -> square(n) } 13 | .map { n -> subtractTen(n) }) 14 | 15 | 16 | //Compact 17 | println(myData.map { n -> subtractTen(square(addOne(n))) }) 18 | 19 | 20 | //Composed 21 | println(myData.map { n -> myComposedFunction().invoke(n) }) 22 | 23 | 24 | //Using the beautiful composer :) 25 | println(myData.map { n -> addOneSquareSubtractTen().invoke(n) }) 26 | 27 | } 28 | 29 | //fun test(): (Double) -> Double = { x: Double -> x + 1 } 30 | 31 | fun addOne(num: Double) = num + 1 32 | fun square(num: Double) = num * num 33 | fun subtractTen(num: Double) = num - 10 34 | 35 | val lambdaAddOne: (Double) -> Double = { n -> n + 1 } 36 | val lambdaSquare: (Double) -> Double = { n -> n * n } 37 | val lambdaSubtractTen: (Double) -> Double = { n -> n - 10 } 38 | 39 | fun myComposedFunction(): (Double) -> Double = composeFunction(lambdaAddOne, lambdaSquare, lambdaSubtractTen) 40 | 41 | fun composeFunction( 42 | addOne: (Double) -> Double, 43 | square: (Double) -> Double, 44 | subtractTen: (Double) -> Double 45 | ): (Double) -> Double { 46 | return { number -> subtractTen.invoke(square.invoke(addOne.invoke(number))) } 47 | } 48 | 49 | fun addOneSquareSubtractTen(): (Double) -> Double{ 50 | return compose(compose(lambdaAddOne, lambdaSquare), lambdaSubtractTen) 51 | } 52 | 53 | fun compose(fun1: (T1) -> T2, fun2: (T2) -> T3): (T1) -> T3 { 54 | return { t -> fun2.invoke(fun1.invoke(t)) } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/kotlin/session6/AvailabilityPath.kt: -------------------------------------------------------------------------------- 1 | package session6 2 | 3 | import models.Availability 4 | import models.MyOrder 5 | import models.ShippingDate 6 | import java.time.LocalDate 7 | 8 | class AvailabilityPath { 9 | 10 | private val calcAvailability1: (MyOrder) -> Availability = { order -> Availability(date = LocalDate.now().plusDays(3))} 11 | private val calcAvailability2: (MyOrder) -> Availability = { order -> Availability(date = LocalDate.now().plusDays(2))} 12 | private val calcAvailability3: (MyOrder) -> Availability = { order -> Availability(date = LocalDate.now().plusDays(1))} 13 | private val calcAvailability4: (MyOrder) -> Availability = { order -> Availability(date = LocalDate.now().plusDays(4))} 14 | 15 | 16 | private val calcShippingDate1: (Availability) -> ShippingDate = {a -> ShippingDate(date = LocalDate.now().plusDays(1))} 17 | private val calcShippingDate2: (Availability) -> ShippingDate = {a -> ShippingDate(date = LocalDate.now().plusDays(2))} 18 | private val calcShippingDate3: (Availability) -> ShippingDate = {a -> ShippingDate(date = LocalDate.now().plusDays(1/2 ))} 19 | private val calcShippingDate4: (Availability) -> ShippingDate = {a -> ShippingDate(date = LocalDate.now().plusDays(4/5))} 20 | private val calcShippingDate5: (Availability) -> ShippingDate = {a -> ShippingDate(date = LocalDate.now().plusDays(2/5))} 21 | 22 | 23 | val availabilityLambdas: List Availability>> = listOf( 24 | Pair(AvailabilityChoice.AV1,calcAvailability1), 25 | Pair(AvailabilityChoice.AV2,calcAvailability2), 26 | Pair(AvailabilityChoice.AV3,calcAvailability3), 27 | Pair(AvailabilityChoice.AV4,calcAvailability4) 28 | ) 29 | 30 | val shippingDateLambdas: List ShippingDate>> = listOf( 31 | Pair(ShippingDateChoice.SD1,calcShippingDate1), 32 | Pair(ShippingDateChoice.SD2,calcShippingDate2), 33 | Pair(ShippingDateChoice.SD3,calcShippingDate3), 34 | Pair(ShippingDateChoice.SD4,calcShippingDate4), 35 | Pair(ShippingDateChoice.SD5,calcShippingDate5), 36 | ) 37 | 38 | 39 | 40 | 41 | } -------------------------------------------------------------------------------- /src/main/kotlin/session6/InvoicePath.kt: -------------------------------------------------------------------------------- 1 | package session6 2 | 3 | import models.* 4 | import session6.FreightChoice 5 | import session6.InvoiceChoice 6 | import session6.ShippingChoice 7 | 8 | class InvoicePath { 9 | 10 | private val calcInvoice1 : (MyOrder) -> Invoice = {order -> Invoice(order.cost * 1.1) } 11 | private val calcInvoice2 : (MyOrder) -> Invoice = {order -> Invoice(order.cost * 1.2) } 12 | private val calcInvoice3 : (MyOrder) -> Invoice = {order -> Invoice(order.cost * 1.3) } 13 | private val calcInvoice4 : (MyOrder) -> Invoice = {order -> Invoice(order.cost * 1.4) } 14 | private val calcInvoice5 : (MyOrder) -> Invoice = {order -> Invoice(order.cost * 1.5) } 15 | 16 | 17 | private val calcShipping1: (Invoice) -> Shipping = {invoice -> Shipping(cost = invoice.cost, shipperId = if (invoice.cost > 1000) 1 else 2) } 18 | private val calcShipping2: (Invoice) -> Shipping = {invoice -> Shipping(cost = invoice.cost, shipperId = if (invoice.cost > 1100) 1 else 2) } 19 | private val calcShipping3: (Invoice) -> Shipping = {invoice -> Shipping(cost = invoice.cost, shipperId = if (invoice.cost > 1200) 1 else 2) } 20 | 21 | 22 | private val calcFreightCost1: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .25 else s.cost * .5) } 23 | private val calcFreightCost2: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .28 else s.cost * .52) } 24 | private val calcFreightCost3: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .3 else s.cost * .6) } 25 | private val calcFreightCost4: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .35 else s.cost * .65) } 26 | private val calcFreightCost5: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .15 else s.cost * .2) } 27 | private val calcFreightCost6: (Shipping) -> Freight = {s -> Freight(cost = if (s.shipperId == 1) s.cost * .1 else s.cost * .15) } 28 | 29 | 30 | 31 | 32 | val invoiceLambdas: List Invoice>> = listOf( 33 | Pair(InvoiceChoice.Inv1,calcInvoice1), 34 | Pair(InvoiceChoice.Inv2,calcInvoice2), 35 | Pair(InvoiceChoice.Inv3,calcInvoice3), 36 | Pair(InvoiceChoice.Inv4,calcInvoice4), 37 | Pair(InvoiceChoice.Inv5,calcInvoice5) 38 | ) 39 | 40 | val shippingLambdas: List Shipping>> = listOf( 41 | Pair(ShippingChoice.Sh1,calcShipping1), 42 | Pair(ShippingChoice.Sh2,calcShipping2), 43 | Pair(ShippingChoice.Sh3,calcShipping3) 44 | ) 45 | 46 | val freightLambdas: List Freight>> = listOf( 47 | Pair(FreightChoice.FR1,calcFreightCost1), 48 | Pair(FreightChoice.FR2,calcFreightCost2), 49 | Pair(FreightChoice.FR3,calcFreightCost3), 50 | Pair(FreightChoice.FR4,calcFreightCost4), 51 | Pair(FreightChoice.FR5,calcFreightCost5), 52 | Pair(FreightChoice.FR6,calcFreightCost6) 53 | ) 54 | 55 | 56 | 57 | 58 | 59 | } -------------------------------------------------------------------------------- /src/main/kotlin/session6/ProcessConfiguration.kt: -------------------------------------------------------------------------------- 1 | package session6 2 | 3 | class ProcessConfiguration { 4 | 5 | lateinit var invoiceChoice: InvoiceChoice 6 | lateinit var shippingChoice: ShippingChoice 7 | lateinit var freightChoice: FreightChoice 8 | lateinit var availabilityChoice: AvailabilityChoice 9 | lateinit var shippingDateChoice: ShippingDateChoice 10 | } 11 | 12 | enum class InvoiceChoice { 13 | Inv1, 14 | Inv2, 15 | Inv3, 16 | Inv4, 17 | Inv5 18 | } 19 | 20 | enum class ShippingChoice { 21 | Sh1, 22 | Sh2, 23 | Sh3, 24 | } 25 | 26 | enum class FreightChoice { 27 | FR1, 28 | FR2, 29 | FR3, 30 | FR4, 31 | FR5, 32 | FR6 33 | } 34 | 35 | enum class AvailabilityChoice { 36 | AV1, 37 | AV2, 38 | AV3, 39 | AV4 40 | } 41 | 42 | enum class ShippingDateChoice { 43 | SD1, 44 | SD2, 45 | SD3, 46 | SD4, 47 | SD5 48 | } -------------------------------------------------------------------------------- /src/main/kotlin/session6/Session6.kt: -------------------------------------------------------------------------------- 1 | package session6 2 | 3 | import models.Customer 4 | import models.Freight 5 | import models.MyOrder 6 | import models.ShippingDate 7 | import java.time.LocalDate 8 | 9 | 10 | fun main() { 11 | val invoicePath = InvoicePath() 12 | val availabilityPath = AvailabilityPath() 13 | val configs: Pair = setConfiguration() 14 | 15 | val processConfiguration = ProcessConfiguration() 16 | processConfiguration.invoiceChoice = InvoiceChoice.Inv3 17 | processConfiguration.shippingChoice = ShippingChoice.Sh2 18 | processConfiguration.freightChoice = FreightChoice.FR3 19 | processConfiguration.availabilityChoice = AvailabilityChoice.AV2 20 | processConfiguration.shippingDateChoice = ShippingDateChoice.SD2 21 | 22 | val costOfOrder : (MyOrder) -> Double =calcAdjustedCostOfOrder(processConfiguration, invoicePath, availabilityPath) 23 | 24 | val order = MyOrder(Customer(), LocalDate.now(), 250.0) 25 | 26 | println(costOfOrder.invoke(order)) 27 | 28 | } 29 | 30 | fun setConfiguration(): Pair { 31 | val processConfiguration = ProcessConfiguration() 32 | val customer = Customer() 33 | val order = MyOrder() 34 | 35 | processConfiguration.invoiceChoice = InvoiceChoice.Inv3 36 | processConfiguration.shippingChoice = ShippingChoice.Sh2 37 | processConfiguration.freightChoice = FreightChoice.FR3 38 | processConfiguration.availabilityChoice = AvailabilityChoice.AV2 39 | processConfiguration.shippingDateChoice = ShippingDateChoice.SD2 40 | order.customer = customer 41 | order.date = LocalDate.now() 42 | order.cost = 2000.0 43 | 44 | return Pair(order, processConfiguration) 45 | } 46 | 47 | 48 | private fun calcAdjustedCostOfOrder( 49 | processConfig: ProcessConfiguration, 50 | invoicePath: InvoicePath, 51 | availabilityPath: AvailabilityPath 52 | ): (MyOrder) -> Double { 53 | return { order -> 54 | adjustCost( 55 | order, 56 | invoicePath(processConfig, invoicePath), 57 | availabilityPath(processConfig, availabilityPath) 58 | ) 59 | } 60 | } 61 | 62 | 63 | private fun adjustCost( 64 | order: MyOrder, 65 | calcFreight: (MyOrder) -> Freight, 66 | calcShippingDate: (MyOrder) -> ShippingDate 67 | ): Double { 68 | val freight = calcFreight(order) 69 | val shippingDate = calcShippingDate(order) 70 | 71 | val cost = if (shippingDate.date?.dayOfWeek.toString() == "Monday") freight.cost + 1000 else freight.cost + 500 72 | 73 | return cost 74 | } 75 | 76 | private fun invoicePath(processConfig: ProcessConfiguration, invoicePath: InvoicePath): (MyOrder) -> Freight { 77 | 78 | return compose( 79 | compose( 80 | invoicePath.invoiceLambdas.filter { it.first == processConfig.invoiceChoice }.map { it.second }.first(), 81 | invoicePath.shippingLambdas.filter { it.first == processConfig.shippingChoice }.map { it.second }.first() 82 | ), 83 | 84 | invoicePath.freightLambdas.filter { it.first == processConfig.freightChoice }.map { it.second }.first() 85 | ) 86 | 87 | } 88 | 89 | private fun availabilityPath( 90 | processConfig: ProcessConfiguration, 91 | availabilityPath: AvailabilityPath 92 | ): (MyOrder) -> ShippingDate { 93 | return compose( 94 | availabilityPath.availabilityLambdas.filter { it.first == processConfig.availabilityChoice }.map { it.second } 95 | .first(), 96 | availabilityPath.shippingDateLambdas.filter { it.first == processConfig.shippingDateChoice }.map { it.second } 97 | .first() 98 | ) 99 | } 100 | 101 | 102 | fun compose(fun1: (T1) -> T2, fun2: (T2) -> T3): (T1) -> T3 { 103 | return { t -> fun2.invoke(fun1.invoke(t)) } 104 | } -------------------------------------------------------------------------------- /src/main/kotlin/session7/Session.kt: -------------------------------------------------------------------------------- 1 | package session7 2 | 3 | fun main() { 4 | // val q10 = test(10.0) 5 | // println(q10.invoke(4.0)) 6 | 7 | val segmentSalaryPairs: List> = listOf( 8 | Pair("a", 1000.0), 9 | Pair("b", 2000.0), 10 | Pair("c", 3000.0) 11 | ) 12 | 13 | val grossSalaryCalculators: List Double>> = 14 | segmentSalaryPairs.map { Pair(it.first, grossSalaryCalculator(it.second)) } 15 | 16 | 17 | println(grossSalaryCalculators[0].second.invoke(80.0)) 18 | println(grossSalaryCalculators[1].second.invoke(90.0)) 19 | println(grossSalaryCalculators.first { it.first == "c" }.second.invoke(100.0)) 20 | 21 | } 22 | 23 | private fun test(number: Double): (Double) -> Double { 24 | val x1 = number + 10 25 | return { num -> num + x1 } 26 | } 27 | 28 | private fun grossSalaryCalculator(basicSalary: Double): (Double) -> Double { 29 | val tax = .2 * basicSalary 30 | return { bonus -> bonus + tax + basicSalary } 31 | } --------------------------------------------------------------------------------