From f9ddb475598ea5104c41f6cf9fd24cdc01ea5cd7 Mon Sep 17 00:00:00 2001 From: Raul Raja Date: Thu, 28 Dec 2017 04:40:55 +0100 Subject: [PATCH] modules refactor WIP --- ank-core/build.gradle | 1 + .../main/kotlin/io/kategory/ank/algebra.kt | 1 + arrow-core/build.gradle | 15 ++ arrow-core/gradle.properties | 4 + .../src/main/kotlin}/data/Disjunction.kt | 4 +- .../src/main/kotlin}/data/Either.kt | 9 +- .../src/main/kotlin}/data/EitherLike.kt | 2 +- .../src/main/kotlin}/data/Eval.kt | 151 +---------- .../src/main/kotlin/data}/FunctionK.kt | 6 - .../src/main/kotlin}/data/Id.kt | 12 +- .../src/main/kotlin}/data/LeftLike.kt | 2 +- .../src/main/kotlin}/data/LeftProjection.kt | 2 +- .../src/main/kotlin}/data/Option.kt | 26 +- .../src/main/kotlin/data}/PartialFunction.kt | 8 - .../src/main/kotlin}/data/RightLike.kt | 2 +- .../src/main/kotlin}/data/RightProjection.kt | 4 +- arrow-core/src/main/kotlin/data/TupleN.kt | 50 ++++ .../src/main/kotlin}/data/utils.kt | 0 .../src/main/kotlin}/predef.kt | 0 arrow-data/build.gradle | 3 + arrow-data/src/main/kotlin/arrow/Maps.kt | 3 - .../kotlin/arrow/{arrow => data}/Cokleisli.kt | 0 .../src/main/kotlin/arrow/data/Coproduct.kt | 12 - .../src/main/kotlin/arrow/data/EitherT.kt | 30 --- .../kotlin/arrow/{arrow => data}/Function0.kt | 8 +- .../kotlin/arrow/{arrow => data}/Function1.kt | 2 +- .../kotlin/arrow/{arrow => data}/Kleisli.kt | 0 .../src/main/kotlin/arrow/data/ListKW.kt | 13 +- .../src/main/kotlin/arrow/data/MapKW.kt | 6 +- .../main/kotlin/arrow/data/NonEmptyList.kt | 15 +- .../src/main/kotlin/arrow/data/OptionT.kt | 14 -- .../src/main/kotlin/arrow/data/Reader.kt | 22 +- .../src/main/kotlin/arrow/data/SequenceKW.kt | 12 +- .../src/main/kotlin/arrow/data/SetKW.kt | 1 - .../src/main/kotlin/arrow/data/SortedMapKW.kt | 2 +- .../src/main/kotlin/arrow/data/State.kt | 31 +-- .../src/main/kotlin/arrow/data/StateT.kt | 4 +- arrow-data/src/main/kotlin/arrow/data/Try.kt | 154 +----------- .../src/main/kotlin/arrow/data/Validated.kt | 8 - .../src/main/kotlin/arrow/data/WriterT.kt | 11 +- .../kotlin/arrow/instances/IdInstances.kt | 10 - .../arrow/instances/IterableInstances.kt | 8 - .../kotlin/arrow/instances/ListKWInstances.kt | 23 -- .../arrow/instances/NonEmptyListInstances.kt | 17 -- .../kotlin/arrow/instances/OptionInstances.kt | 46 ---- .../arrow/instances/SequenceKWInstances.kt | 25 -- .../kotlin/arrow/instances/SetKWInstances.kt | 26 -- .../kotlin/arrow/instances/TryInstances.kt | 29 --- .../test/kotlin/arrow/data/IterableTests.kt | 2 +- .../kotlin/arrow/data/NumberMonoidTest.kt | 4 + .../src/test/kotlin/arrow/data/StateTTests.kt | 1 + .../src/test/kotlin/arrow/data/UtilTest.kt | 1 + .../kotlin/arrow/free/FreeApplicativeTest.kt | 5 +- .../src/test/kotlin/arrow/free/FreeTest.kt | 5 +- .../kotlin/arrow/effects/data/DeferredKW.kt | 1 + .../src/main/kotlin/arrow/effects/data/IO.kt | 1 + arrow-free/build.gradle | 18 ++ arrow-free/gradle.properties | 4 + .../src/main/kotlin/arrow/free/Cofree.kt | 2 +- .../src/main/kotlin/arrow/free}/Const.kt | 0 .../src/main/kotlin/arrow/free/Coyoneda.kt | 0 .../src/main/kotlin/arrow/free/Free.kt | 4 +- .../main/kotlin/arrow/free/FreeApplicative.kt | 0 .../arrow/free/StackSafeMonadContinuations.kt | 55 ++++ .../src/main/kotlin/arrow/free}/Trampoline.kt | 2 +- .../src/main/kotlin/arrow/free/Yoneda.kt | 0 .../kotlin/arrow/free/instances/cofree.kt | 2 + .../main/kotlin/arrow/free/instances/const.kt | 11 +- .../kotlin/arrow/free/instances/coyoneda.kt | 6 +- .../main/kotlin/arrow/free/instances/free.kt | 4 +- .../arrow/free/instances/freeaplicative.kt | 4 +- .../kotlin/arrow/free/instances/yoneda.kt | 6 +- .../main/kotlin/arrow/instances/composed.kt | 88 +------ .../main/kotlin/arrow/instances/coproduct.kt | 12 + .../src/main/kotlin/arrow/instances/either.kt | 0 .../main/kotlin/arrow/instances/eithert.kt | 23 ++ .../src/main/kotlin/arrow/instances/eval.kt | 103 ++++++++ .../main/kotlin/arrow/instances/function0.kt | 103 ++++++++ .../main/kotlin/arrow/instances/function1.kt | 4 + .../src/main/kotlin/arrow/instances/id.kt | 148 +++++++++++ .../src/main/kotlin/arrow/instances/ior.kt | 2 + .../main/kotlin/arrow/instances/iterable.kt | 11 + .../main/kotlin/arrow/instances/kleisli.kt | 5 + .../src/main/kotlin/arrow/instances/listkw.kt | 236 ++++++++++++++++++ .../src/main/kotlin/arrow/instances/mapkw.kt | 2 + .../kotlin/arrow/instances/nonemptylist.kt | 173 +++++++++++++ .../src/main/kotlin/arrow/instances/number.kt | 12 +- .../kotlin/arrow/instances/number_java.kt | 2 +- .../src/main/kotlin/arrow/instances/option.kt | 229 +++++++++++++++++ .../main/kotlin/arrow/instances/optiont.kt | 2 + .../main/kotlin/arrow/instances/sequence.kt | 148 +++++++++++ .../src/main/kotlin/arrow/instances/set.kt | 71 ++++++ .../main/kotlin/arrow/instances/sortedmap.kt | 16 +- .../src/main/kotlin/arrow/instances/statet.kt | 20 ++ .../src/main/kotlin/arrow/instances/string.kt | 0 .../kotlin/arrow/instances/string_java.kt | 4 +- .../src/main/kotlin/arrow/instances/try.kt | 125 ++++++++++ .../src/main/kotlin/arrow/instances/tuple.kt | 2 + .../src/main/kotlin/arrow/instances/unit.kt | 6 +- .../main/kotlin/arrow/instances/validated.kt | 2 + .../main/kotlin/arrow/instances/writert.kt | 5 + arrow-mtl/build.gradle | 16 ++ arrow-mtl/gradle.properties | 4 + .../main/kotlin/arrow/mtl}/FunctorFilter.kt | 0 .../main/kotlin/arrow/mtl}/MonadCombine.kt | 0 .../src/main/kotlin/arrow/mtl}/MonadFilter.kt | 0 .../arrow/mtl}/MonadFilterContinuation.kt | 0 .../src/main/kotlin/arrow/mtl}/MonadReader.kt | 0 .../src/main/kotlin/arrow/mtl}/MonadState.kt | 0 .../src/main/kotlin/arrow/mtl}/MonadWriter.kt | 0 .../main/kotlin/arrow/mtl}/TraverseFilter.kt | 3 + .../kotlin/arrow/mtl/instances/composed.kt | 44 ++++ .../main/kotlin/arrow/mtl/syntax/optiont.kt | 9 + .../main/kotlin/arrow/mtl/syntax/reader.kt | 5 + .../main/kotlin/arrow/mtl/syntax/readert.kt | 2 + .../src/main/kotlin/arrow/optics/Fold.kt | 1 + .../src/main/kotlin/arrow/optics/Getter.kt | 2 + .../src/main/kotlin/arrow/optics/Iso.kt | 2 + .../src/main/kotlin/arrow/optics/Lens.kt | 1 + .../src/main/kotlin/arrow/optics/Optional.kt | 1 + .../src/main/kotlin/arrow/optics/Prism.kt | 2 + .../src/main/kotlin/arrow/optics/Traversal.kt | 1 + .../arrow/optics/instances/OptionInstances.kt | 1 + .../test/kotlin/arrow/optics/TestDomain.kt | 2 +- arrow-syntax/build.gradle | 1 + .../arrow/syntax/applicative/applicative.kt | 92 +------ .../applicativeerror/applicativeerror.kt | 22 ++ .../arrow/syntax/collections/iterable.kt | 2 +- .../kotlin/arrow/syntax/collections/list.kt | 4 +- .../kotlin/arrow/syntax/collections/map.kt | 2 +- .../kotlin/arrow/syntax/comonad/comonad.kt | 9 + .../main/kotlin/arrow/syntax/either/either.kt | 7 +- .../kotlin/arrow/syntax/eithert/eithert.kt | 12 + .../src/main/kotlin/arrow/syntax/eq/eq.kt | 22 ++ .../src/main/kotlin/arrow/syntax/eval/eval.kt | 148 +++++++++++ .../kotlin/arrow/syntax/foldable/foldable.kt | 30 +++ .../arrow/syntax/functionk/funktionk.kt | 10 + .../kotlin/arrow/syntax/functor/functor.kt | 7 + .../src/main/kotlin/arrow/syntax/id/id.kt | 5 + .../main/kotlin/arrow/syntax/inject/inject.kt | 5 + .../main/kotlin/arrow/syntax/monad/monad.kt | 13 + .../arrow/syntax/monaderror/monaderror.kt | 8 + .../main/kotlin/arrow/syntax/monoid/monoid.kt | 7 + .../main/kotlin/arrow/syntax/option/option.kt | 21 +- .../kotlin/arrow/syntax/optiont/optiont.kt | 12 + .../main/kotlin/arrow/syntax/order/order.kt | 67 +++++ .../syntax/partialfunction/partialfunction.kt | 12 + .../arrow/syntax/reducible/reducible.kt | 8 + .../arrow/syntax/semigroup/semigroup.kt | 5 + .../kotlin/arrow/syntax/traverse/traverse.kt | 13 + .../src/main/kotlin/arrow/syntax/try/try.kt | 152 ++++++++++- .../main/kotlin/arrow/syntax/tuples/tuples.kt | 21 ++ .../arrow/syntax/validated/validated.kt | 11 + .../src/main/kotlin/arrow/laws/FunctorLaws.kt | 2 + .../src/main/kotlin/arrow/laws/IsoLaws.kt | 2 + .../src/main/kotlin/arrow/laws/LensLaws.kt | 3 +- .../main/kotlin/arrow/laws/OptionalLaws.kt | 3 +- .../src/main/kotlin/arrow/laws/PrismLaws.kt | 2 + .../src/main/kotlin/arrow/laws/SetterLaws.kt | 2 + .../main/kotlin/arrow/laws/TraversalLaws.kt | 2 + arrow-typeclasses/build.gradle | 16 ++ arrow-typeclasses/gradle.properties | 4 + .../kotlin/arrow/typeclasses/Alternative.kt | 0 .../kotlin/arrow/typeclasses/Applicative.kt | 20 ++ .../arrow/typeclasses/ApplicativeError.kt | 19 -- .../kotlin/arrow/typeclasses/Bifoldable.kt | 0 .../main/kotlin/arrow/typeclasses/Bimonad.kt | 0 .../main/kotlin/arrow/typeclasses/Comonad.kt | 6 - .../main/kotlin/arrow/typeclasses/Composed.kt | 22 ++ .../arrow/typeclasses/ContinuationUtils.kt | 2 +- .../src/main/kotlin/arrow/typeclasses/Eq.kt | 18 -- .../main/kotlin/arrow/typeclasses/Foldable.kt | 41 +-- .../main/kotlin/arrow/typeclasses/Functor.kt | 10 +- .../main/kotlin/arrow/typeclasses/Inject.kt | 4 +- .../main/kotlin/arrow/typeclasses/Monad.kt | 25 -- .../arrow/typeclasses/MonadContinuations.kt | 37 +-- .../kotlin/arrow/typeclasses/MonadError.kt | 5 - .../typeclasses/MonadErrorContinuations.kt | 0 .../main/kotlin/arrow/typeclasses/Monoid.kt | 4 - .../main/kotlin/arrow/typeclasses/MonoidK.kt | 0 .../main/kotlin/arrow/typeclasses/Order.kt | 68 +---- .../kotlin/arrow/typeclasses/Reducible.kt | 10 - .../kotlin/arrow/typeclasses/Semigroup.kt | 2 - .../kotlin/arrow/typeclasses/SemigroupK.kt | 0 .../main/kotlin/arrow/typeclasses/Traverse.kt | 12 - detekt.yml | 5 + pom.xml | 175 ------------- settings.gradle | 5 + 188 files changed, 2506 insertions(+), 1370 deletions(-) create mode 100644 arrow-core/build.gradle create mode 100644 arrow-core/gradle.properties rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/Disjunction.kt (99%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/Either.kt (96%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/EitherLike.kt (97%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/Eval.kt (62%) rename {arrow-data/src/main/kotlin/arrow/arrow => arrow-core/src/main/kotlin/data}/FunctionK.kt (53%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/Id.kt (70%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/LeftLike.kt (92%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/LeftProjection.kt (98%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/Option.kt (88%) rename {arrow-data/src/main/kotlin/arrow/arrow => arrow-core/src/main/kotlin/data}/PartialFunction.kt (87%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/RightLike.kt (92%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/RightProjection.kt (97%) create mode 100644 arrow-core/src/main/kotlin/data/TupleN.kt rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/data/utils.kt (100%) rename {arrow-data/src/main/kotlin/arrow => arrow-core/src/main/kotlin}/predef.kt (100%) delete mode 100644 arrow-data/src/main/kotlin/arrow/Maps.kt rename arrow-data/src/main/kotlin/arrow/{arrow => data}/Cokleisli.kt (100%) rename arrow-data/src/main/kotlin/arrow/{arrow => data}/Function0.kt (80%) rename arrow-data/src/main/kotlin/arrow/{arrow => data}/Function1.kt (96%) rename arrow-data/src/main/kotlin/arrow/{arrow => data}/Kleisli.kt (100%) delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/IdInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/IterableInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/ListKWInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/NonEmptyListInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/OptionInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/SequenceKWInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/SetKWInstances.kt delete mode 100644 arrow-data/src/main/kotlin/arrow/instances/TryInstances.kt create mode 100644 arrow-free/build.gradle create mode 100644 arrow-free/gradle.properties rename {arrow-data => arrow-free}/src/main/kotlin/arrow/free/Cofree.kt (98%) rename {arrow-data/src/main/kotlin/arrow/data => arrow-free/src/main/kotlin/arrow/free}/Const.kt (100%) rename {arrow-data => arrow-free}/src/main/kotlin/arrow/free/Coyoneda.kt (100%) rename {arrow-data => arrow-free}/src/main/kotlin/arrow/free/Free.kt (97%) rename {arrow-data => arrow-free}/src/main/kotlin/arrow/free/FreeApplicative.kt (100%) create mode 100644 arrow-free/src/main/kotlin/arrow/free/StackSafeMonadContinuations.kt rename {arrow-data/src/main/kotlin/arrow/data => arrow-free/src/main/kotlin/arrow/free}/Trampoline.kt (95%) rename {arrow-data => arrow-free}/src/main/kotlin/arrow/free/Yoneda.kt (100%) rename arrow-data/src/main/kotlin/arrow/instances/CofreeInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/cofree.kt (97%) rename arrow-data/src/main/kotlin/arrow/instances/ConstInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/const.kt (85%) rename arrow-data/src/main/kotlin/arrow/instances/CoYonedaInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/coyoneda.kt (69%) rename arrow-data/src/main/kotlin/arrow/instances/FreeInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/free.kt (97%) rename arrow-data/src/main/kotlin/arrow/instances/FreeApplicativeInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/freeaplicative.kt (96%) rename arrow-data/src/main/kotlin/arrow/instances/YonedaInstances.kt => arrow-free/src/main/kotlin/arrow/free/instances/yoneda.kt (67%) rename arrow-data/src/main/kotlin/arrow/typeclasses/Composed.kt => arrow-instances/src/main/kotlin/arrow/instances/composed.kt (72%) rename arrow-data/src/main/kotlin/arrow/instances/CoproductInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/coproduct.kt (76%) rename arrow-data/src/main/kotlin/arrow/instances/EitherInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/either.kt (100%) rename arrow-data/src/main/kotlin/arrow/instances/EitherTInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/eithert.kt (78%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/eval.kt create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/function0.kt rename arrow-data/src/main/kotlin/arrow/instances/Function1Instances.kt => arrow-instances/src/main/kotlin/arrow/instances/function1.kt (96%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/id.kt rename arrow-data/src/main/kotlin/arrow/instances/IorInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/ior.kt (99%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/iterable.kt rename arrow-data/src/main/kotlin/arrow/instances/KleisliInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/kleisli.kt (96%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/listkw.kt rename arrow-data/src/main/kotlin/arrow/instances/MapKWInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/mapkw.kt (99%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/nonemptylist.kt rename arrow-data/src/main/kotlin/arrow/instances/NumberInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/number.kt (95%) rename arrow-data/src/main/kotlin/arrow/instances/NumberInstancesJava.kt => arrow-instances/src/main/kotlin/arrow/instances/number_java.kt (99%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/option.kt rename arrow-data/src/main/kotlin/arrow/instances/OptionTInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/optiont.kt (99%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/sequence.kt create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/set.kt rename arrow-data/src/main/kotlin/arrow/instances/SortedMapKWInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/sortedmap.kt (57%) rename arrow-data/src/main/kotlin/arrow/instances/StateTInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/statet.kt (83%) rename arrow-data/src/main/kotlin/arrow/instances/StringInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/string.kt (100%) rename arrow-data/src/main/kotlin/arrow/instances/StringInstancesJava.kt => arrow-instances/src/main/kotlin/arrow/instances/string_java.kt (90%) create mode 100644 arrow-instances/src/main/kotlin/arrow/instances/try.kt rename arrow-data/src/main/kotlin/arrow/instances/TupleInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/tuple.kt (99%) rename arrow-data/src/main/kotlin/arrow/instances/UnitInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/unit.kt (77%) rename arrow-data/src/main/kotlin/arrow/instances/ValidatedInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/validated.kt (99%) rename arrow-data/src/main/kotlin/arrow/instances/WriterTInstances.kt => arrow-instances/src/main/kotlin/arrow/instances/writert.kt (97%) create mode 100644 arrow-mtl/build.gradle create mode 100644 arrow-mtl/gradle.properties rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/FunctorFilter.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadCombine.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadFilter.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadFilterContinuation.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadReader.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadState.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/MonadWriter.kt (100%) rename {arrow-data/src/main/kotlin/arrow/typeclasses => arrow-mtl/src/main/kotlin/arrow/mtl}/TraverseFilter.kt (86%) create mode 100644 arrow-mtl/src/main/kotlin/arrow/mtl/instances/composed.kt create mode 100644 arrow-mtl/src/main/kotlin/arrow/mtl/syntax/optiont.kt create mode 100644 arrow-mtl/src/main/kotlin/arrow/mtl/syntax/reader.kt create mode 100644 arrow-mtl/src/main/kotlin/arrow/mtl/syntax/readert.kt rename arrow-data/src/main/kotlin/arrow/typeclasses/Applicative.kt => arrow-syntax/src/main/kotlin/arrow/syntax/applicative/applicative.kt (70%) create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/applicativeerror/applicativeerror.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/comonad/comonad.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/eithert/eithert.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/eq/eq.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/eval/eval.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/foldable/foldable.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/functionk/funktionk.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/functor/functor.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/id/id.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/inject/inject.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/monad/monad.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/monaderror/monaderror.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/monoid/monoid.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/optiont/optiont.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/order/order.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/partialfunction/partialfunction.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/reducible/reducible.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/semigroup/semigroup.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/traverse/traverse.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/tuples/tuples.kt create mode 100644 arrow-syntax/src/main/kotlin/arrow/syntax/validated/validated.kt create mode 100644 arrow-typeclasses/build.gradle create mode 100644 arrow-typeclasses/gradle.properties rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Alternative.kt (100%) create mode 100644 arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Applicative.kt rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt (50%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Bifoldable.kt (100%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Bimonad.kt (100%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Comonad.kt (85%) create mode 100644 arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Composed.kt rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt (94%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Eq.kt (76%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Foldable.kt (75%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Functor.kt (71%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Inject.kt (76%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Monad.kt (53%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt (73%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/MonadError.kt (86%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/MonadErrorContinuations.kt (100%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Monoid.kt (76%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/MonoidK.kt (100%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Order.kt (62%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Reducible.kt (91%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Semigroup.kt (79%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/SemigroupK.kt (100%) rename {arrow-data => arrow-typeclasses}/src/main/kotlin/arrow/typeclasses/Traverse.kt (65%) delete mode 100644 pom.xml diff --git a/ank-core/build.gradle b/ank-core/build.gradle index 9f69ccee322..3c085a97b55 100644 --- a/ank-core/build.gradle +++ b/ank-core/build.gradle @@ -31,6 +31,7 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$parent.ext.kotlinVersion" compile "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinxCoroutinesVersion" compile "org.jetbrains:markdown:0.1.25" + compile project(':arrow-free') compile project(':arrow-data') compile "org.jetbrains.kotlin:kotlin-compiler:$parent.ext.kotlinVersion" compile "org.jetbrains.kotlin:kotlin-script-util:$parent.ext.kotlinVersion" diff --git a/ank-core/src/main/kotlin/io/kategory/ank/algebra.kt b/ank-core/src/main/kotlin/io/kategory/ank/algebra.kt index 8a4f474fbc9..8a67cf2704d 100644 --- a/ank-core/src/main/kotlin/io/kategory/ank/algebra.kt +++ b/ank-core/src/main/kotlin/io/kategory/ank/algebra.kt @@ -1,6 +1,7 @@ package io.arrow.ank import arrow.* +import arrow.free.instances.FreeMonadInstance import org.intellij.markdown.ast.ASTNode import java.io.File diff --git a/arrow-core/build.gradle b/arrow-core/build.gradle new file mode 100644 index 00000000000..ccbc62c185d --- /dev/null +++ b/arrow-core/build.gradle @@ -0,0 +1,15 @@ +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" + compile project(':arrow-annotations') + kapt project(':arrow-annotations-processor') + kaptTest project(':arrow-annotations-processor') + compileOnly project(':arrow-annotations-processor') + testCompileOnly project(':arrow-annotations-processor') + testCompile "io.kotlintest:kotlintest:$kotlinTestVersion" + testCompile project(':arrow-syntax') + testCompile project(':arrow-test') +} + +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') +apply from: rootProject.file('gradle/generated-kotlin-sources.gradle') +apply plugin: 'kotlin-kapt' diff --git a/arrow-core/gradle.properties b/arrow-core/gradle.properties new file mode 100644 index 00000000000..23428966c56 --- /dev/null +++ b/arrow-core/gradle.properties @@ -0,0 +1,4 @@ +# Maven publishing configuration +POM_NAME=Arrow Core +POM_ARTIFACT_ID=arrow-core +POM_PACKAGING=jar diff --git a/arrow-data/src/main/kotlin/arrow/data/Disjunction.kt b/arrow-core/src/main/kotlin/data/Disjunction.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/data/Disjunction.kt rename to arrow-core/src/main/kotlin/data/Disjunction.kt index 9b470100afb..e9a954b0844 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Disjunction.kt +++ b/arrow-core/src/main/kotlin/data/Disjunction.kt @@ -1,6 +1,4 @@ -package arrow.data - -import arrow.* +package arrow @Deprecated("arrow.data.Either is already right biased. This data type will be removed in future releases") sealed class Disjunction : EitherLike { diff --git a/arrow-data/src/main/kotlin/arrow/data/Either.kt b/arrow-core/src/main/kotlin/data/Either.kt similarity index 96% rename from arrow-data/src/main/kotlin/arrow/data/Either.kt rename to arrow-core/src/main/kotlin/data/Either.kt index 37cae4b78f4..6f592b7a3e3 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Either.kt +++ b/arrow-core/src/main/kotlin/data/Either.kt @@ -1,9 +1,5 @@ package arrow -import arrow.data.Disjunction -import arrow.data.LeftProjection -import arrow.data.RightProjection - typealias Right = Either.Right typealias Left = Either.Left @@ -240,10 +236,7 @@ inline fun Either.filterOrElse(crossinline predicate: (B) -> Boolea */ fun Either.contains(elem: B): Boolean = fold({ false }, { it == elem }) -fun Either.ap(ff: EitherKind C>): Either = ff.flatMap { f -> map(f) }.ev() - -fun Either.traverse(f: (B) -> HK, GA: Applicative): HK> = - this.ev().fold({ GA.pure(Left(it)) }, { GA.map(f(it), { Right(it) }) }) +fun Either.ap(ff: EitherKind C>): Either = ff.ev().flatMap { f -> map(f) }.ev() fun Either.combineK(y: EitherKind): Either = when (this) { diff --git a/arrow-data/src/main/kotlin/arrow/data/EitherLike.kt b/arrow-core/src/main/kotlin/data/EitherLike.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/data/EitherLike.kt rename to arrow-core/src/main/kotlin/data/EitherLike.kt index e2174f7def2..418fbe8cc0a 100644 --- a/arrow-data/src/main/kotlin/arrow/data/EitherLike.kt +++ b/arrow-core/src/main/kotlin/data/EitherLike.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package arrow.data +package arrow interface EitherLike { fun isLeft(): Boolean diff --git a/arrow-data/src/main/kotlin/arrow/data/Eval.kt b/arrow-core/src/main/kotlin/data/Eval.kt similarity index 62% rename from arrow-data/src/main/kotlin/arrow/data/Eval.kt rename to arrow-core/src/main/kotlin/data/Eval.kt index fa52d229cc0..b6af8eb99a4 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Eval.kt +++ b/arrow-core/src/main/kotlin/data/Eval.kt @@ -28,12 +28,6 @@ package arrow * overflows. */ @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Comonad::class, - Bimonad::class) sealed class Eval : EvalKind { companion object { @@ -68,149 +62,6 @@ sealed class Eval : EvalKind { val One: Eval = Now(1) - fun merge( - op1: () -> A, - op2: () -> B): Eval> = - applicative().tupled( - later(op1), - later(op2) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5), - later(op6) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5), - later(op6), - later(op7) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5), - later(op6), - later(op7), - later(op8) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H, - op9: () -> I): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5), - later(op6), - later(op7), - later(op8), - later(op9) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H, - op9: () -> I, - op10: () -> J): Eval> = - applicative().tupled( - later(op1), - later(op2), - later(op3), - later(op4), - later(op5), - later(op6), - later(op7), - later(op8), - later(op9), - later(op10) - ).ev() } abstract fun value(): A @@ -219,7 +70,7 @@ sealed class Eval : EvalKind { fun map(f: (A) -> B): Eval = flatMap { a -> Now(f(a)) } - fun ap(ff: EvalKind<(A) -> B>): Eval = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: EvalKind<(A) -> B>): Eval = ff.ev().flatMap { f -> map(f) }.ev() fun flatMap(f: (A) -> EvalKind): Eval = when (this) { diff --git a/arrow-data/src/main/kotlin/arrow/arrow/FunctionK.kt b/arrow-core/src/main/kotlin/data/FunctionK.kt similarity index 53% rename from arrow-data/src/main/kotlin/arrow/arrow/FunctionK.kt rename to arrow-core/src/main/kotlin/data/FunctionK.kt index 0f90454a08d..38c245a000a 100644 --- a/arrow-data/src/main/kotlin/arrow/arrow/FunctionK.kt +++ b/arrow-core/src/main/kotlin/data/FunctionK.kt @@ -15,9 +15,3 @@ interface FunctionK { } -fun FunctionK.or(h: FunctionK): FunctionK, G> = - object : FunctionK, G> { - override fun invoke(fa: CoproductKind): HK { - return fa.ev().fold(this@or, h) - } - } diff --git a/arrow-data/src/main/kotlin/arrow/data/Id.kt b/arrow-core/src/main/kotlin/data/Id.kt similarity index 70% rename from arrow-data/src/main/kotlin/arrow/data/Id.kt rename to arrow-core/src/main/kotlin/data/Id.kt index c2e6c432e0b..bfc75e45f66 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Id.kt +++ b/arrow-core/src/main/kotlin/data/Id.kt @@ -3,14 +3,6 @@ package arrow fun IdKind.value(): A = this.ev().value @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Comonad::class, - Bimonad::class, - Foldable::class, - Traverse::class) data class Id(val value: A) : IdKind { inline fun map(f: (A) -> B): Id = Id(f(value)) @@ -21,13 +13,11 @@ data class Id(val value: A) : IdKind { fun foldRight(lb: Eval, f: (A, Eval) -> Eval): Eval = f(this.ev().value, lb) - fun traverse(f: (A) -> HK, GA: Applicative): HK> = GA.map(f(this.ev().value), { Id(it) }) - fun coflatMap(f: (IdKind) -> B): Id = this.ev().map({ f(this) }) fun extract(): A = this.ev().value - fun ap(ff: IdKind<(A) -> B>): Id = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: IdKind<(A) -> B>): Id = ff.ev().flatMap { f -> map(f) }.ev() companion object { diff --git a/arrow-data/src/main/kotlin/arrow/data/LeftLike.kt b/arrow-core/src/main/kotlin/data/LeftLike.kt similarity index 92% rename from arrow-data/src/main/kotlin/arrow/data/LeftLike.kt rename to arrow-core/src/main/kotlin/data/LeftLike.kt index 0599891dc4c..12b997bfa21 100644 --- a/arrow-data/src/main/kotlin/arrow/data/LeftLike.kt +++ b/arrow-core/src/main/kotlin/data/LeftLike.kt @@ -1,4 +1,4 @@ -package arrow.data +package arrow @Deprecated("arrow.data.Either is already right biased. This data type will be removed in future releases") interface LeftLike : EitherLike { diff --git a/arrow-data/src/main/kotlin/arrow/data/LeftProjection.kt b/arrow-core/src/main/kotlin/data/LeftProjection.kt similarity index 98% rename from arrow-data/src/main/kotlin/arrow/data/LeftProjection.kt rename to arrow-core/src/main/kotlin/data/LeftProjection.kt index a9a3ef78cce..ccdc7b159e6 100644 --- a/arrow-data/src/main/kotlin/arrow/data/LeftProjection.kt +++ b/arrow-core/src/main/kotlin/data/LeftProjection.kt @@ -1,4 +1,4 @@ -package arrow.data +package arrow import arrow.* diff --git a/arrow-data/src/main/kotlin/arrow/data/Option.kt b/arrow-core/src/main/kotlin/data/Option.kt similarity index 88% rename from arrow-data/src/main/kotlin/arrow/data/Option.kt rename to arrow-core/src/main/kotlin/data/Option.kt index 96baefdf1cb..ad574fee01a 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Option.kt +++ b/arrow-core/src/main/kotlin/data/Option.kt @@ -10,14 +10,6 @@ typealias None = Option.None * are either an instance of $some or the object $none. */ @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Foldable::class, - Traverse::class, - TraverseFilter::class, - MonadFilter::class) sealed class Option : OptionKind { companion object { @@ -159,22 +151,6 @@ sealed class Option : OptionKind { } } - fun traverse(f: (A) -> HK, GA: Applicative): HK> = - this.ev().let { option -> - when (option) { - is Some -> GA.map(f(option.t), { Some(it) }) - is None -> GA.pure(None) - } - } - - fun traverseFilter(f: (A) -> HK>, GA: Applicative): HK> = - this.ev().let { option -> - when (option) { - is Some -> f(option.t) - is None -> GA.pure(None) - } - } - fun toList(): List = fold(::emptyList, { listOf(it) }) infix fun and(value: Option): Option = if (isEmpty()) { @@ -216,7 +192,7 @@ fun Option.getOrElse(default: () -> T): T = fold({ default() }, { it }) */ fun OptionKind.orElse(alternative: () -> Option): Option = if (ev().isEmpty()) alternative() else ev() -infix fun OptionKind.or(value: Option): Option = if (isEmpty()) { +infix fun OptionKind.or(value: Option): Option = if (ev().isEmpty()) { value } else { ev() diff --git a/arrow-data/src/main/kotlin/arrow/arrow/PartialFunction.kt b/arrow-core/src/main/kotlin/data/PartialFunction.kt similarity index 87% rename from arrow-data/src/main/kotlin/arrow/arrow/PartialFunction.kt rename to arrow-core/src/main/kotlin/data/PartialFunction.kt index 63e6da84a38..abb7b0c654b 100644 --- a/arrow-data/src/main/kotlin/arrow/arrow/PartialFunction.kt +++ b/arrow-core/src/main/kotlin/data/PartialFunction.kt @@ -55,14 +55,6 @@ fun PartialFunction.andThen(f: (B) -> C): PartialFunction override fun invoke(a: A): C = f(this@andThen(a)) } -fun case(ff: Tuple2<(A) -> Boolean, (A) -> B>): PartialFunction = - object : PartialFunction() { - override fun isDefinedAt(a: A): Boolean = ff.a(a) - override fun invoke(a: A): B = ff.b(a) - } - -infix fun ((A) -> Boolean).then(f: (A) -> B): Tuple2<(A) -> Boolean, (A) -> B> = Tuple2(this, f) - private class Lifted(val pf: PartialFunction) : (A) -> Option { override fun invoke(x: A): Option = pf.andThen { Some(it) }.invokeOrElse(x, { None }) } diff --git a/arrow-data/src/main/kotlin/arrow/data/RightLike.kt b/arrow-core/src/main/kotlin/data/RightLike.kt similarity index 92% rename from arrow-data/src/main/kotlin/arrow/data/RightLike.kt rename to arrow-core/src/main/kotlin/data/RightLike.kt index d2054147f2f..5e7e9fed76a 100644 --- a/arrow-data/src/main/kotlin/arrow/data/RightLike.kt +++ b/arrow-core/src/main/kotlin/data/RightLike.kt @@ -1,4 +1,4 @@ -package arrow.data +package arrow @Deprecated("arrow.data.Either is already right biased. This data type will be removed in future releases") interface RightLike : EitherLike { diff --git a/arrow-data/src/main/kotlin/arrow/data/RightProjection.kt b/arrow-core/src/main/kotlin/data/RightProjection.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/data/RightProjection.kt rename to arrow-core/src/main/kotlin/data/RightProjection.kt index 431d4bc0e22..9e730a0eb85 100644 --- a/arrow-data/src/main/kotlin/arrow/data/RightProjection.kt +++ b/arrow-core/src/main/kotlin/data/RightProjection.kt @@ -1,6 +1,4 @@ -package arrow.data - -import arrow.* +package arrow @Deprecated("arrow.data.Either is right biased. This data type will be removed in future releases") class RightProjection(val e: Either) { diff --git a/arrow-core/src/main/kotlin/data/TupleN.kt b/arrow-core/src/main/kotlin/data/TupleN.kt new file mode 100644 index 00000000000..da75f7657d3 --- /dev/null +++ b/arrow-core/src/main/kotlin/data/TupleN.kt @@ -0,0 +1,50 @@ +package arrow + +data class Tuple2(val a: A, val b: B) { + fun reverse(): Tuple2 = Tuple2(b, a) + companion object +} + +data class Tuple3(val a: A, val b: B, val c: C) { + fun reverse(): Tuple3 = Tuple3(c, b, a) + companion object +} + +data class Tuple4(val a: A, val b: B, val c: C, val d: D) { + fun reverse(): Tuple4 = Tuple4(d, c, b, a) + companion object +} + +data class Tuple5(val a: A, val b: B, val c: C, val d: D, val e: E) { + fun reverse(): Tuple5 = Tuple5(e, d, c, b, a) + companion object +} + +data class Tuple6(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F) { + fun reverse(): Tuple6 = Tuple6(f, e, d, c, b, a) + companion object +} + +data class Tuple7(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G) { + fun reverse(): Tuple7 = Tuple7(g, f, e, d, c, b, a) + companion object +} + +data class Tuple8(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, val h: H) { + fun reverse(): Tuple8 = Tuple8(h, g, f, e, d, c, b, a) + companion object +} + +data class Tuple9(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, + val h: H, val i: I) { + fun reverse(): Tuple9 = Tuple9(i, h, g, f, e, d, c, b, a) + companion object +} + +data class Tuple10(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, + val h: H, val i: I, val j: J) { + fun reverse(): Tuple10 = Tuple10(j, i, h, g, f, e, d, c, b, a) + companion object +} + +infix fun A.toT(b: B): Tuple2 = Tuple2(this, b) \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/data/utils.kt b/arrow-core/src/main/kotlin/data/utils.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/data/utils.kt rename to arrow-core/src/main/kotlin/data/utils.kt diff --git a/arrow-data/src/main/kotlin/arrow/predef.kt b/arrow-core/src/main/kotlin/predef.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/predef.kt rename to arrow-core/src/main/kotlin/predef.kt diff --git a/arrow-data/build.gradle b/arrow-data/build.gradle index ccbc62c185d..8522a0ddc09 100644 --- a/arrow-data/build.gradle +++ b/arrow-data/build.gradle @@ -1,13 +1,16 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" compile project(':arrow-annotations') + compile project(':arrow-typeclasses') kapt project(':arrow-annotations-processor') kaptTest project(':arrow-annotations-processor') compileOnly project(':arrow-annotations-processor') testCompileOnly project(':arrow-annotations-processor') testCompile "io.kotlintest:kotlintest:$kotlinTestVersion" testCompile project(':arrow-syntax') + testCompile project(':arrow-instances') testCompile project(':arrow-test') + testCompile project(':arrow-free') } apply from: rootProject.file('gradle/gradle-mvn-push.gradle') diff --git a/arrow-data/src/main/kotlin/arrow/Maps.kt b/arrow-data/src/main/kotlin/arrow/Maps.kt deleted file mode 100644 index 3ebade500cf..00000000000 --- a/arrow-data/src/main/kotlin/arrow/Maps.kt +++ /dev/null @@ -1,3 +0,0 @@ -package arrow - -fun mapOf(vararg tuple: Tuple2): Map = if (tuple.isNotEmpty()) tuple.map { it.a to it.b }.toMap() else emptyMap() \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/arrow/Cokleisli.kt b/arrow-data/src/main/kotlin/arrow/data/Cokleisli.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/arrow/Cokleisli.kt rename to arrow-data/src/main/kotlin/arrow/data/Cokleisli.kt diff --git a/arrow-data/src/main/kotlin/arrow/data/Coproduct.kt b/arrow-data/src/main/kotlin/arrow/data/Coproduct.kt index b7574eae0ee..54ce99fffb9 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Coproduct.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Coproduct.kt @@ -28,18 +28,6 @@ package arrow companion object { inline operator fun invoke(run: Either, HK>): Coproduct = Coproduct(run) - - inline fun comonad(CF: Comonad = arrow.comonad(), CG: Comonad): CoproductComonadInstance = - CoproductComonadInstanceImplicits.instance(CF, CG) - - inline fun functor(FF: Functor = arrow.functor(), FG: Functor = arrow.functor()): CoproductFunctorInstance = - CoproductFunctorInstanceImplicits.instance(FF, FG) - - inline fun traverse(FF: Traverse = traverse(), FG: Traverse = traverse()): CoproductTraverseInstance = - CoproductTraverseInstanceImplicits.instance(FF, FG) - - inline fun foldable(FF: Foldable = foldable(), FG: Foldable = foldable()): CoproductFoldableInstance = - CoproductFoldableInstanceImplicits.instance(FF, FG) } } diff --git a/arrow-data/src/main/kotlin/arrow/data/EitherT.kt b/arrow-data/src/main/kotlin/arrow/data/EitherT.kt index 72a324e218d..dfae225369b 100644 --- a/arrow-data/src/main/kotlin/arrow/data/EitherT.kt +++ b/arrow-data/src/main/kotlin/arrow/data/EitherT.kt @@ -36,27 +36,6 @@ package arrow inline fun fromEither(value: Either, MF: Applicative = monad()): EitherT = EitherT(MF.pure(value)) - - inline fun functor(FF: Functor = functor()): Functor> = - EitherTFunctorInstanceImplicits.instance(FF) - - inline fun applicative(MF: Monad = monad()): Applicative> = - EitherTApplicativeInstanceImplicits.instance(MF) - - inline fun monad(MF: Monad = monad()): Monad> = - EitherTMonadInstanceImplicits.instance(MF) - - inline fun monadError(MF: Monad = monad()): MonadError, L> = - EitherTMonadErrorInstanceImplicits.instance(MF) - - inline fun traverse(FF: Traverse = traverse()): Traverse> = - EitherTTraverseInstanceImplicits.instance(FF) - - inline fun foldable(FF: Traverse = traverse()): Foldable> = - EitherTFoldableInstanceImplicits.instance(FF) - - inline fun semigroupK(MF: Monad = monad()): SemigroupK> = - EitherTSemigroupKInstanceImplicits.instance(MF) } inline fun fold(crossinline l: (A) -> C, crossinline r: (B) -> C, FF: Functor): HK = FF.map(value, { either -> either.fold(l, r) }) @@ -82,15 +61,6 @@ package arrow fun toOptionT(FF: Functor): OptionT = OptionT(FF.map(value, { it.toOption() })) - fun foldLeft(b: C, f: (C, B) -> C, FF: Foldable): C = FF.compose(Either.foldable()).foldLC(value, b, f) - - fun foldRight(lb: Eval, f: (B, Eval) -> Eval, FF: Foldable): Eval = FF.compose(Either.foldable()).foldRC(value, lb, f) - - fun traverse(f: (B) -> HK, GA: Applicative, FF: Traverse): HK> { - val fa: HK>, C>> = ComposedTraverse(FF, Either.traverse(), Either.monad()).traverseC(value, f, GA) - return GA.map(fa, { EitherT(FF.map(it.unnest(), { it.ev() })) }) - } - fun combineK(y: EitherTKind, MF: Monad): EitherT = EitherT(MF.flatMap(this.ev().value) { when (it) { diff --git a/arrow-data/src/main/kotlin/arrow/arrow/Function0.kt b/arrow-data/src/main/kotlin/arrow/data/Function0.kt similarity index 80% rename from arrow-data/src/main/kotlin/arrow/arrow/Function0.kt rename to arrow-data/src/main/kotlin/arrow/data/Function0.kt index 9d408114bde..449d07960a2 100644 --- a/arrow-data/src/main/kotlin/arrow/arrow/Function0.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Function0.kt @@ -5,12 +5,6 @@ fun (() -> A).k(): Function0 = Function0(this) operator fun Function0Kind.invoke(): A = this.ev().f() @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Comonad::class, - Bimonad::class) data class Function0(internal val f: () -> A) : Function0Kind { fun map(f: (A) -> B): Function0 = Function0.pure(f(this())) @@ -19,7 +13,7 @@ data class Function0(internal val f: () -> A) : Function0Kind { fun coflatMap(f: (Function0Kind) -> B): Function0 = { f(this) }.k() - fun ap(ff: Function0Kind<(A) -> B>): Function0 = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: Function0Kind<(A) -> B>): Function0 = ff.ev().flatMap { f -> map(f) }.ev() fun extract(): A = f() diff --git a/arrow-data/src/main/kotlin/arrow/arrow/Function1.kt b/arrow-data/src/main/kotlin/arrow/data/Function1.kt similarity index 96% rename from arrow-data/src/main/kotlin/arrow/arrow/Function1.kt rename to arrow-data/src/main/kotlin/arrow/data/Function1.kt index ffa5aa2dc84..bdb767d921e 100644 --- a/arrow-data/src/main/kotlin/arrow/arrow/Function1.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Function1.kt @@ -10,7 +10,7 @@ operator fun Function1Kind.invoke(i: I): O = this.ev().f(i) fun flatMap(f: (O) -> Function1Kind): Function1 = { p: I -> f(this.f(p))(p) }.k() - fun ap(ff: Function1Kind B>): Function1 = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: Function1Kind B>): Function1 = ff.ev().flatMap { f -> map(f) }.ev() fun local(f: (I) -> I): Function1 = f.andThen { this(it) }.k() diff --git a/arrow-data/src/main/kotlin/arrow/arrow/Kleisli.kt b/arrow-data/src/main/kotlin/arrow/data/Kleisli.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/arrow/Kleisli.kt rename to arrow-data/src/main/kotlin/arrow/data/Kleisli.kt diff --git a/arrow-data/src/main/kotlin/arrow/data/ListKW.kt b/arrow-data/src/main/kotlin/arrow/data/ListKW.kt index 12a5bd84d14..370882074cc 100644 --- a/arrow-data/src/main/kotlin/arrow/data/ListKW.kt +++ b/arrow-data/src/main/kotlin/arrow/data/ListKW.kt @@ -1,17 +1,6 @@ package arrow @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Foldable::class, - Traverse::class, - SemigroupK::class, - MonoidK::class, - MonadCombine::class, - FunctorFilter::class, - MonadFilter::class) data class ListKW constructor(val list: List) : ListKWKind, List by list { fun flatMap(f: (A) -> ListKWKind): ListKW = this.ev().list.flatMap { f(it).ev().list }.k() @@ -28,7 +17,7 @@ data class ListKW constructor(val list: List) : ListKWKind, List return Eval.defer { loop(this.ev()) } } - fun ap(ff: ListKWKind<(A) -> B>): ListKW = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: ListKWKind<(A) -> B>): ListKW = ff.ev().flatMap { f -> map(f) }.ev() fun traverse(f: (A) -> HK, GA: Applicative): HK> = foldRight(Eval.always { GA.pure(emptyList().k()) }) { a, eval -> diff --git a/arrow-data/src/main/kotlin/arrow/data/MapKW.kt b/arrow-data/src/main/kotlin/arrow/data/MapKW.kt index ee75d011cf6..5839e3e1871 100644 --- a/arrow-data/src/main/kotlin/arrow/data/MapKW.kt +++ b/arrow-data/src/main/kotlin/arrow/data/MapKW.kt @@ -13,7 +13,7 @@ data class MapKW(val map: Map) : MapKWKind, Map by m }.k() fun map2Eval(fb: Eval>, f: (A, B) -> Z): Eval> = - if (fb.isEmpty()) Eval.now(emptyMap().k()) + if (fb.value().isEmpty()) Eval.now(emptyMap().k()) else fb.map { b -> this.map2(b, f) } fun ap(ff: MapKW B>): MapKW = @@ -74,3 +74,7 @@ fun Map.foldLeft(b: Map, f: (Map, Map.Entry) - fun Map.foldRight(b: Map, f: (Map.Entry, Map) -> Map): Map = this.entries.reversed().k().map.foldLeft(b) { x, y -> f(y, x) } + +fun Iterator.iterateRight(lb: Eval): (f: (A, Eval) -> Eval) -> Eval = Foldable.iterateRight(this, lb) + +fun mapOf(vararg tuple: Tuple2): Map = if (tuple.isNotEmpty()) tuple.map { it.a to it.b }.toMap() else emptyMap() diff --git a/arrow-data/src/main/kotlin/arrow/data/NonEmptyList.kt b/arrow-data/src/main/kotlin/arrow/data/NonEmptyList.kt index 0d0c1d1cde1..734ad92fe28 100644 --- a/arrow-data/src/main/kotlin/arrow/data/NonEmptyList.kt +++ b/arrow-data/src/main/kotlin/arrow/data/NonEmptyList.kt @@ -6,15 +6,6 @@ typealias Nel = NonEmptyList * A List that can not be empty */ @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Comonad::class, - Bimonad::class, - Foldable::class, - Traverse::class, - SemigroupK::class) class NonEmptyList private constructor( val head: A, val tail: List, @@ -35,7 +26,7 @@ class NonEmptyList private constructor( fun flatMap(f: (A) -> NonEmptyListKind): NonEmptyList = f(head).ev() + tail.flatMap { f(it).ev().all } - fun ap(ff: NonEmptyListKind<(A) -> B>): NonEmptyList = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: NonEmptyListKind<(A) -> B>): NonEmptyList = ff.ev().flatMap { f -> map(f) }.ev() operator fun plus(l: NonEmptyList<@UnsafeVariance A>): NonEmptyList = NonEmptyList(all + l.all) @@ -45,11 +36,11 @@ class NonEmptyList private constructor( fun foldLeft(b: B, f: (B, A) -> B): B = this.ev().tail.fold(f(b, this.ev().head), f) - fun foldRight(lb: Eval, f: (A, Eval) -> Eval): Eval = ListKW.foldable().foldRight(this.ev().all.k(), lb, f) + fun foldRight(lb: Eval, f: (A, Eval) -> Eval): Eval = foldable().foldRight(this.ev().all.k(), lb, f) fun traverse(f: (A) -> HK, GA: Applicative): HK> = GA.map2Eval(f(this.ev().head), Eval.always { - ListKW.traverse().traverse(this.ev().tail.k(), f, GA) + traverse().traverse(this.ev().tail.k(), f, GA) }, { NonEmptyList(it.a, it.b.ev().list) }).value() diff --git a/arrow-data/src/main/kotlin/arrow/data/OptionT.kt b/arrow-data/src/main/kotlin/arrow/data/OptionT.kt index 186ac05925c..c405fb7a162 100644 --- a/arrow-data/src/main/kotlin/arrow/data/OptionT.kt +++ b/arrow-data/src/main/kotlin/arrow/data/OptionT.kt @@ -75,20 +75,6 @@ package arrow inline fun subflatMap(crossinline f: (A) -> Option, FF: Functor): OptionT = transform({ it.flatMap(f) }, FF) - fun foldLeft(b: B, f: (B, A) -> B, FF: Foldable): B = FF.compose(Option.foldable()).foldLC(value, b, f) - - fun foldRight(lb: Eval, f: (A, Eval) -> Eval, FF: Foldable): Eval = FF.compose(Option.foldable()).foldRC(value, lb, f) - - fun traverseFilter(f: (A) -> HK>, GA: Applicative, FF: Traverse): HK> { - val fa = ComposedTraverseFilter(FF, Option.traverseFilter(), Option.applicative()).traverseFilterC(value, f, GA) - return GA.map(fa, { OptionT(FF.map(it.unnest(), { it.ev() })) }) - } - - fun traverse(f: (A) -> HK, GA: Applicative, FF: Traverse): HK> { - val fa = ComposedTraverse(FF, Option.traverse(), Option.applicative()).traverseC(value, f, GA) - return GA.map(fa, { OptionT(FF.map(it.unnest(), { it.ev() })) }) - } - fun toLeft(default: () -> R, FF: Functor): EitherT = EitherT(cata({ Right(default()) }, { Left(it) }, FF)) diff --git a/arrow-data/src/main/kotlin/arrow/data/Reader.kt b/arrow-data/src/main/kotlin/arrow/data/Reader.kt index 4ed630d7662..ee9818e390d 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Reader.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Reader.kt @@ -63,35 +63,35 @@ fun Reader.runId(d: D): A = this.run(d).value() * * @param f the function to apply. */ -fun Reader.map(f: (A) -> B): Reader = map(f, Id.functor()) +fun Reader.map(f: (A) -> B): Reader = map(f, functor()) /** * FlatMap the result of the computation [A] to another [Reader] for the same dependency [D] and flatten the structure. * * @param f the function to apply. */ -fun Reader.flatMap(f: (A) -> Reader): Reader = flatMap(f, Id.monad()) +fun Reader.flatMap(f: (A) -> Reader): Reader = flatMap(f, monad()) /** * Apply a function `(A) -> B` that operates within the context of [Reader]. * * @param ff function that maps [A] to [B] within the [Reader] context. */ -fun Reader.ap(ff: ReaderKind B>): Reader = ap(ff, Id.applicative()) +fun Reader.ap(ff: ReaderKind B>): Reader = ap(ff, applicative()) /** * Zip with another [Reader]. * * @param o other [Reader] to zip with. */ -fun Reader.zip(o: Reader): Reader> = zip(o, Id.monad()) +fun Reader.zip(o: Reader): Reader> = zip(o, monad()) /** * Compose with another [Reader] that has a dependency on the output of the computation. * * @param o other [Reader] to compose with. */ -fun Reader.andThen(o: Reader): Reader = andThen(o, Id.monad()) +fun Reader.andThen(o: Reader): Reader = andThen(o, monad()) /** * Map the result of the computation [A] to [B] given a function [f]. @@ -115,22 +115,20 @@ object ReaderApi { /** * Alias for[ReaderT.Companion.applicative] */ - fun applicative(): Applicative> = ReaderT.applicative(Id.monad(), dummy = Unit) + fun applicative(): Applicative> = arrow.applicative() /** * Alias for [ReaderT.Companion.functor] */ - fun functor(): Functor> = ReaderT.functor(Id.functor(), dummy = Unit) + fun functor(): Functor> = arrow.functor() /** * Alias for [ReaderT.Companion.monad] */ - fun monad(): Monad> = ReaderT.monad(Id.monad(), dummy = Unit) + fun monad(): Monad> = arrow.monad() - fun monadReader(): MonadReader, D> = ReaderT.monadReader(Id.monad(), dummy = Unit) + fun pure(x: A): Reader = ReaderT.pure(x, arrow.monad()) - fun pure(x: A): Reader = ReaderT.pure(x, Id.monad()) - - fun ask(): Reader = ReaderT.ask(Id.monad()) + fun ask(): Reader = ReaderT.ask(arrow.monad()) } diff --git a/arrow-data/src/main/kotlin/arrow/data/SequenceKW.kt b/arrow-data/src/main/kotlin/arrow/data/SequenceKW.kt index 18ba9e372fb..0619e316aac 100644 --- a/arrow-data/src/main/kotlin/arrow/data/SequenceKW.kt +++ b/arrow-data/src/main/kotlin/arrow/data/SequenceKW.kt @@ -3,19 +3,11 @@ package arrow fun SequenceKWKind.toList(): List = this.ev().sequence.toList() @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Foldable::class, - Traverse::class, - SemigroupK::class, - MonoidK::class) data class SequenceKW constructor(val sequence: Sequence) : SequenceKWKind, Sequence by sequence { fun flatMap(f: (A) -> SequenceKWKind): SequenceKW = this.ev().sequence.flatMap { f(it).ev().sequence }.k() - fun ap(ff: SequenceKWKind<(A) -> B>): SequenceKW = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: SequenceKWKind<(A) -> B>): SequenceKW = ff.ev().flatMap { f -> map(f) }.ev() fun map(f: (A) -> B): SequenceKW = this.ev().sequence.map(f).k() @@ -52,7 +44,7 @@ data class SequenceKW constructor(val sequence: Sequence) : SequenceKW buf: MutableList, f: (A) -> HK>, v: SequenceKW>) { - if (!v.isEmpty()) { + if (!(v.toList().isEmpty())) { val head: Either = v.first() when (head) { is Right -> { diff --git a/arrow-data/src/main/kotlin/arrow/data/SetKW.kt b/arrow-data/src/main/kotlin/arrow/data/SetKW.kt index df3f42ea879..3194f628f0f 100644 --- a/arrow-data/src/main/kotlin/arrow/data/SetKW.kt +++ b/arrow-data/src/main/kotlin/arrow/data/SetKW.kt @@ -1,7 +1,6 @@ package arrow @higherkind -@deriving(Foldable::class, SemigroupK::class, MonoidK::class) data class SetKW(val set: Set) : SetKWKind, Set by set { fun foldLeft(b: B, f: (B, A) -> B): B = this.fold(b, f) diff --git a/arrow-data/src/main/kotlin/arrow/data/SortedMapKW.kt b/arrow-data/src/main/kotlin/arrow/data/SortedMapKW.kt index d51bccb35e9..4aac97076e4 100644 --- a/arrow-data/src/main/kotlin/arrow/data/SortedMapKW.kt +++ b/arrow-data/src/main/kotlin/arrow/data/SortedMapKW.kt @@ -15,7 +15,7 @@ data class SortedMapKW, B>(val map: SortedMap) : SortedMa }.k() fun map2Eval(fc: Eval>, f: (B, C) -> Z): Eval> = - if (fc.isEmpty()) Eval.now(sortedMapOf().k()) + if (fc.value().isEmpty()) Eval.now(sortedMapOf().k()) else fc.map { c -> this.map2(c, f) } fun ap(ff: SortedMapKW C>): SortedMapKW = diff --git a/arrow-data/src/main/kotlin/arrow/data/State.kt b/arrow-data/src/main/kotlin/arrow/data/State.kt index 1244655c9ce..b7181bcb674 100644 --- a/arrow-data/src/main/kotlin/arrow/data/State.kt +++ b/arrow-data/src/main/kotlin/arrow/data/State.kt @@ -53,16 +53,16 @@ fun StateFun.toState(): State = State(this) fun StateFunKind.toState(): State = State(this) fun State.map(sx: State, f: (T, P1) -> R): State = - flatMap { t -> sx.map { x -> f(t, x) } }.ev() + flatMap ({ t -> sx.map { x -> f(t, x) } }, arrow.monad()).ev() -fun State.map(f: (T) -> R): State = flatMap { t -> StateApi.pure(f(t)) }.ev() +fun State.map(f: (T) -> R): State = flatMap({ t -> StateApi.pure(f(t)) }, arrow.monad()).ev() /** * Alias for [StateT.run] `StateT` * * @param initial state to start stateful computation. */ -fun StateT.run(initial: S): Tuple2 = run(initial, Id.monad()).value() +fun StateT.run(initial: S): Tuple2 = run(initial, arrow.monad()).value() /** * Alias for [StateT.runA] `StateT` @@ -86,47 +86,32 @@ fun State() = StateApi object StateApi { - fun pure(t: T): State = StateT.pure(t, Id.monad()) + fun pure(t: T): State = StateT.pure(t, arrow.monad()) /** * Return input without modifying it. */ - fun get(): State = StateT.get(Id.applicative()) + fun get(): State = StateT.get(arrow.applicative()) /** * Inspect a value of the state [S] with [f] `(S) -> T` without modifying the state. * * @param f the function applied to inspect [T] from [S]. */ - fun inspect(f: (S) -> T): State = StateT.inspect(Id.applicative(), f) + fun inspect(f: (S) -> T): State = StateT.inspect(arrow.applicative(), f) /** * Modify the state with [f] `(S) -> S` and return [Unit]. * * @param f the modify function to apply. */ - fun modify(f: (S) -> S): State = StateT.modify(Id.applicative(), f) + fun modify(f: (S) -> S): State = StateT.modify(arrow.applicative(), f) /** * Set the state to [s] and return [Unit]. * * @param s value to set. */ - fun set(s: S): State = StateT.set(Id.applicative(), s) - - /** - * Alias for[StateT.Companion.applicative] - */ - fun applicative() = StateT.applicative(Id.monad(), dummy = Unit) - - /** - * Alias for [StateT.Companion.functor] - */ - fun functor() = StateT.functor(Id.functor(), dummy = Unit) - - /** - * Alias for [StateT.Companion.monad] - */ - fun monad() = StateT.monad(Id.monad(), dummy = Unit) + fun set(s: S): State = StateT.set(arrow.applicative(), s) } \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/data/StateT.kt b/arrow-data/src/main/kotlin/arrow/data/StateT.kt index 9de2fd8975c..93b0aadb5d2 100644 --- a/arrow-data/src/main/kotlin/arrow/data/StateT.kt +++ b/arrow-data/src/main/kotlin/arrow/data/StateT.kt @@ -99,7 +99,7 @@ class StateT( * @param AF [Applicative] for the context [F]. * @param f the modify function to apply. */ - fun modify(AF: Applicative, f: (S) -> S): StateT = StateT(AF.pure({ s -> AF.map(AF.pure(f(s))) { it toT Unit } })) + fun modify(AF: Applicative, f: (S) -> S): StateT = StateT(AF.pure({ s -> AF.map(AF.pure(f(s))) { Tuple2(it, Unit) } })) /** * Modify the state with an [Applicative] function [f] `(S) -> HK` and return [Unit]. @@ -107,7 +107,7 @@ class StateT( * @param AF [Applicative] for the context [F]. * @param f the modify function to apply. */ - fun modifyF(AF: Applicative, f: (S) -> HK): StateT = StateT(AF.pure({ s -> AF.map(f(s)) { it toT Unit } })) + fun modifyF(AF: Applicative, f: (S) -> HK): StateT = StateT(AF.pure({ s -> AF.map(f(s)) { Tuple2(it, Unit) } })) /** * Set the state to a value [s] and return [Unit]. diff --git a/arrow-data/src/main/kotlin/arrow/data/Try.kt b/arrow-data/src/main/kotlin/arrow/data/Try.kt index 804048bce9c..924da82608f 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Try.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Try.kt @@ -1,7 +1,6 @@ package arrow import arrow.Option.None -import arrow.data.Disjunction typealias Failure = Try.Failure typealias Success = Try.Success @@ -13,12 +12,6 @@ typealias Success = Try.Success * Port of https://github.com/scala/scala/blob/v2.12.1/src/library/scala/util/Try.scala */ @higherkind -@deriving( - Functor::class, - Applicative::class, - Monad::class, - Foldable::class, - Traverse::class) sealed class Try : TryKind { companion object { @@ -28,7 +21,7 @@ sealed class Try : TryKind { tailrec fun tailRecM(a: A, f: (A) -> TryKind>): Try { val ev: Try> = f(a).ev() return when (ev) { - is Failure -> Try.monadError().raiseError(ev.exception) + is Failure -> arrow.monadError().raiseError(ev.exception).ev() is Success -> { val b: Either = ev.value when (b) { @@ -49,149 +42,6 @@ sealed class Try : TryKind { fun raise(e: Throwable): Try = Failure(e) - fun merge( - op1: () -> A, - op2: () -> B): Try> = - applicative().tupled( - invoke(op1), - invoke(op2) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5), - invoke(op6) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5), - invoke(op6), - invoke(op7) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5), - invoke(op6), - invoke(op7), - invoke(op8) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H, - op9: () -> I): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5), - invoke(op6), - invoke(op7), - invoke(op8), - invoke(op9) - ).ev() - - fun merge( - op1: () -> A, - op2: () -> B, - op3: () -> C, - op4: () -> D, - op5: () -> E, - op6: () -> F, - op7: () -> G, - op8: () -> H, - op9: () -> I, - op10: () -> J): Try> = - applicative().tupled( - invoke(op1), - invoke(op2), - invoke(op3), - invoke(op4), - invoke(op5), - invoke(op6), - invoke(op7), - invoke(op8), - invoke(op9), - invoke(op10) - ).ev() } @Deprecated(DeprecatedUnsafeAccess, ReplaceWith("getOrElse { ifEmpty }")) @@ -200,7 +50,7 @@ sealed class Try : TryKind { fun traverse(f: (A) -> HK, GA: Applicative): HK> = this.ev().fold({ GA.pure(Try.raise(IllegalStateException())) }, { GA.map(f(it), { Try { it } }) }) - fun ap(ff: TryKind<(A) -> B>): Try = ff.flatMap { f -> map(f) }.ev() + fun ap(ff: TryKind<(A) -> B>): Try = ff.ev().flatMap { f -> map(f) }.ev() /** * Returns the given function applied to the value from this `Success` or returns this if this is a `Failure`. diff --git a/arrow-data/src/main/kotlin/arrow/data/Validated.kt b/arrow-data/src/main/kotlin/arrow/data/Validated.kt index 17a6ce16a23..f7fd4e6ad29 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Validated.kt +++ b/arrow-data/src/main/kotlin/arrow/data/Validated.kt @@ -208,11 +208,3 @@ fun Validated.combineK(y: ValidatedKind, SE: Semigroup): V } } } - -fun A.valid(): Validated = Valid(this) - -fun E.invalid(): Validated = Invalid(this) - -fun A.validNel(): ValidatedNel = Validated.validNel(this) - -fun E.invalidNel(): ValidatedNel = Validated.invalidNel(this) diff --git a/arrow-data/src/main/kotlin/arrow/data/WriterT.kt b/arrow-data/src/main/kotlin/arrow/data/WriterT.kt index 150704a7ec2..568baeef8fe 100644 --- a/arrow-data/src/main/kotlin/arrow/data/WriterT.kt +++ b/arrow-data/src/main/kotlin/arrow/data/WriterT.kt @@ -7,9 +7,9 @@ package arrow companion object { inline fun pure(a: A, MM: Monoid = monoid(), AF: Applicative = arrow.applicative()) = - WriterT(AF.pure(MM.empty() toT a)) + WriterT(AF.pure(Tuple2(MM.empty(),a))) - inline fun both(w: W, a: A, MF: Monad = arrow.monad()) = WriterT(MF.pure(w toT a)) + inline fun both(w: W, a: A, MF: Monad = arrow.monad()) = WriterT(MF.pure(Tuple2(w, a))) inline fun fromTuple(z: Tuple2, MF: Monad = arrow.monad()) = WriterT(MF.pure(z)) @@ -45,9 +45,10 @@ package arrow fun tailRecM(a: A, f: (A) -> HK, Either>, MF: Monad): WriterT = WriterT(MF.tailRecM(a, { MF.map(f(it).ev().value) { - when (it.b) { - is Left -> Left(it.b.a) - is Right -> Right(it.a toT it.b.b) + val value = it.b + when (value) { + is Either.Left -> Either.Left(value.a) + is Either.Right -> Either.Right(it.a toT value.b) } } })) diff --git a/arrow-data/src/main/kotlin/arrow/instances/IdInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/IdInstances.kt deleted file mode 100644 index d9530c3564c..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/IdInstances.kt +++ /dev/null @@ -1,10 +0,0 @@ -package arrow - -@instance(Id::class) -interface IdEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: Id, b: Id): Boolean = - EQ().eqv(a.value, b.value) -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/IterableInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/IterableInstances.kt deleted file mode 100644 index bcd7ab57de6..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/IterableInstances.kt +++ /dev/null @@ -1,8 +0,0 @@ -package arrow - -fun Iterable.collect(vararg cases: PartialFunction): List = - flatMap { value: A -> - val f: PartialFunction = cases.reduce({ a, b -> a.orElse(b) }) - if (f.isDefinedAt(value)) listOf(f(value)) - else emptyList() - } diff --git a/arrow-data/src/main/kotlin/arrow/instances/ListKWInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/ListKWInstances.kt deleted file mode 100644 index ebafbeb26da..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/ListKWInstances.kt +++ /dev/null @@ -1,23 +0,0 @@ -package arrow - -@instance(ListKW::class) -interface ListKWSemigroupInstance : Semigroup> { - override fun combine(a: ListKW, b: ListKW): ListKW = (a + b).k() -} - -@instance(ListKW::class) -interface ListKWMonoidInstance : ListKWSemigroupInstance, Monoid> { - override fun empty(): ListKW = emptyList().k() -} - -@instance(ListKW::class) -interface ListKWEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: ListKW, b: ListKW): Boolean = - a.zip(b) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> - acc && bool - } - -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/NonEmptyListInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/NonEmptyListInstances.kt deleted file mode 100644 index 795118e6b44..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/NonEmptyListInstances.kt +++ /dev/null @@ -1,17 +0,0 @@ -package arrow - -@instance(NonEmptyList::class) -interface NonEmptyListSemigroupInstance : Semigroup> { - override fun combine(a: NonEmptyList, b: NonEmptyList): NonEmptyList = a + b -} - -@instance(NonEmptyList::class) -interface NonEmptyListEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: NonEmptyList, b: NonEmptyList): Boolean = - a.all.zip(b.all) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> - acc && bool - } -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/OptionInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/OptionInstances.kt deleted file mode 100644 index 0f05f4ba016..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/OptionInstances.kt +++ /dev/null @@ -1,46 +0,0 @@ -package arrow - -@instance(Option::class) -interface OptionSemigroupInstance : Semigroup> { - - fun SG(): Semigroup - - override fun combine(a: Option, b: Option): Option = - when (a) { - is Some -> when (b) { - is Some -> Some(SG().combine(a.t, b.t)) - is None -> b - } - is None -> a - } -} - -@instance(Option::class) -interface OptionMonoidInstance : OptionSemigroupInstance, Monoid> { - override fun empty(): Option = None -} - -@instance(Option::class) -interface OptionMonadErrorInstance : OptionMonadInstance, MonadError { - override fun raiseError(e: Unit): Option = None - - override fun handleErrorWith(fa: OptionKind, f: (Unit) -> OptionKind): Option = fa.ev().orElse({ f(Unit).ev() }) -} - -@instance(Option::class) -interface OptionEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: Option, b: Option): Boolean = when (a) { - is Some -> when (b) { - is None -> false - is Some -> EQ().eqv(a.t, b.t) - } - is None -> when (b) { - is None -> true - is Some -> false - } - } - -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/SequenceKWInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/SequenceKWInstances.kt deleted file mode 100644 index 96090bcb1c5..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/SequenceKWInstances.kt +++ /dev/null @@ -1,25 +0,0 @@ -package arrow - -@instance(SequenceKW::class) -interface SequenceKWSemigroupInstance : Semigroup> { - override fun combine(a: SequenceKW, b: SequenceKW): SequenceKW = (a + b).k() -} - -@instance(SequenceKW::class) -interface SequenceKWMonoidInstance : Monoid> { - override fun combine(a: SequenceKW, b: SequenceKW): SequenceKW = (a + b).k() - - override fun empty(): SequenceKW = emptySequence().k() -} - -@instance(SequenceKW::class) -interface SequenceKWEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: SequenceKW, b: SequenceKW): Boolean = - a.zip(b) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> - acc && bool - } - -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/SetKWInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/SetKWInstances.kt deleted file mode 100644 index 7ca0ea2bc78..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/SetKWInstances.kt +++ /dev/null @@ -1,26 +0,0 @@ -package arrow - -@instance(SetKW::class) -interface SetKWSemigroupInstance : Semigroup> { - override fun combine(a: SetKW, b: SetKW): SetKW = (a + b).k() -} - -@instance(SetKW::class) -interface SetKWMonoidInstance : SetKWSemigroupInstance, Monoid> { - override fun empty(): SetKW = emptySet().k() -} - -@instance(SetKW::class) -interface SetKWEqInstance : Eq> { - - fun EQ(): Eq - - override fun eqv(a: SetKW, b: SetKW): Boolean = - if (a.size == b.size) a.set.map { aa -> - b.find { bb -> EQ().eqv(aa, bb) }.nonEmpty() - }.fold(true) { acc, bool -> - acc && bool - } - else false - -} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/TryInstances.kt b/arrow-data/src/main/kotlin/arrow/instances/TryInstances.kt deleted file mode 100644 index 78d7a22593f..00000000000 --- a/arrow-data/src/main/kotlin/arrow/instances/TryInstances.kt +++ /dev/null @@ -1,29 +0,0 @@ -package arrow - -@instance(Try::class) -interface TryMonadErrorInstance : TryMonadInstance, MonadError { - - override fun raiseError(e: Throwable): Try = Failure(e) - - override fun handleErrorWith(fa: TryKind, f: (Throwable) -> TryKind): Try = fa.ev().recoverWith { f(it).ev() } - -} - -@instance(Try::class) -interface TryEqInstance : Eq> { - - fun EQA(): Eq - - override fun eqv(a: Try, b: Try): Boolean = when (a) { - is Success -> when (b) { - is Failure -> false - is Success -> EQA().eqv(a.value, b.value) - } - is Failure -> when (b) { - //currently not supported by implicit resolution to have implicit that does not occur in type params - is Failure -> a.exception == b.exception - is Success -> false - } - } - -} \ No newline at end of file diff --git a/arrow-data/src/test/kotlin/arrow/data/IterableTests.kt b/arrow-data/src/test/kotlin/arrow/data/IterableTests.kt index 1f7e1c9a624..c12c83dc402 100644 --- a/arrow-data/src/test/kotlin/arrow/data/IterableTests.kt +++ b/arrow-data/src/test/kotlin/arrow/data/IterableTests.kt @@ -1,7 +1,7 @@ package arrow +import arrow.instances.collect import io.kotlintest.KTestJUnitRunner -import io.kotlintest.matchers.shouldBe import org.junit.runner.RunWith @RunWith(KTestJUnitRunner::class) diff --git a/arrow-data/src/test/kotlin/arrow/data/NumberMonoidTest.kt b/arrow-data/src/test/kotlin/arrow/data/NumberMonoidTest.kt index 0c2a1f7c802..3d77a9ff73e 100644 --- a/arrow-data/src/test/kotlin/arrow/data/NumberMonoidTest.kt +++ b/arrow-data/src/test/kotlin/arrow/data/NumberMonoidTest.kt @@ -1,5 +1,9 @@ package arrow +import arrow.instances.ByteMonoid +import arrow.instances.DoubleMonoid +import arrow.instances.FloatMonoid +import arrow.instances.ShortMonoid import io.kotlintest.KTestJUnitRunner import io.kotlintest.matchers.shouldNotBe import io.kotlintest.properties.forAll diff --git a/arrow-data/src/test/kotlin/arrow/data/StateTTests.kt b/arrow-data/src/test/kotlin/arrow/data/StateTTests.kt index 7b4323a824b..68095174b5f 100644 --- a/arrow-data/src/test/kotlin/arrow/data/StateTTests.kt +++ b/arrow-data/src/test/kotlin/arrow/data/StateTTests.kt @@ -1,5 +1,6 @@ package arrow +import arrow.instances.StateTMonadStateInstance import io.kotlintest.KTestJUnitRunner import io.kotlintest.matchers.shouldNotBe import org.junit.runner.RunWith diff --git a/arrow-data/src/test/kotlin/arrow/data/UtilTest.kt b/arrow-data/src/test/kotlin/arrow/data/UtilTest.kt index 962e8aee413..6439363e51b 100644 --- a/arrow-data/src/test/kotlin/arrow/data/UtilTest.kt +++ b/arrow-data/src/test/kotlin/arrow/data/UtilTest.kt @@ -1,6 +1,7 @@ package arrow.data import arrow.* +import identity import io.kotlintest.KTestJUnitRunner import io.kotlintest.matchers.shouldBe import org.junit.runner.RunWith diff --git a/arrow-data/src/test/kotlin/arrow/free/FreeApplicativeTest.kt b/arrow-data/src/test/kotlin/arrow/free/FreeApplicativeTest.kt index 58f91996149..f80eaccd3ef 100644 --- a/arrow-data/src/test/kotlin/arrow/free/FreeApplicativeTest.kt +++ b/arrow-data/src/test/kotlin/arrow/free/FreeApplicativeTest.kt @@ -1,7 +1,10 @@ package arrow +import arrow.free.instances.FreeApplicativeApplicativeInstance +import arrow.free.instances.FreeApplicativeEq +import arrow.instances.FreeApplicativeApplicativeInstance +import arrow.instances.FreeApplicativeEq import io.kotlintest.KTestJUnitRunner -import io.kotlintest.matchers.shouldBe import io.kotlintest.matchers.shouldNotBe import arrow.laws.EqLaws import org.junit.runner.RunWith diff --git a/arrow-data/src/test/kotlin/arrow/free/FreeTest.kt b/arrow-data/src/test/kotlin/arrow/free/FreeTest.kt index fa756299abd..7b67eeb3a13 100644 --- a/arrow-data/src/test/kotlin/arrow/free/FreeTest.kt +++ b/arrow-data/src/test/kotlin/arrow/free/FreeTest.kt @@ -1,5 +1,8 @@ package arrow +import arrow.free.instances.FreeEq +import arrow.free.instances.FreeMonadInstance +import arrow.instances.FreeEq import io.kotlintest.KTestJUnitRunner import io.kotlintest.matchers.shouldBe import io.kotlintest.matchers.shouldNotBe @@ -14,7 +17,7 @@ sealed class Ops : HK { data class Add(val a: Int, val y: Int) : Ops() data class Subtract(val a: Int, val y: Int) : Ops() - companion object : FreeMonadInstance { + companion object : FreeMonadInstance { fun value(n: Int): Free = Free.liftF(Ops.Value(n)) fun add(n: Int, y: Int): Free = Free.liftF(Ops.Add(n, y)) fun subtract(n: Int, y: Int): Free = Free.liftF(Ops.Subtract(n, y)) diff --git a/arrow-effects-kotlinx-coroutines/src/main/kotlin/arrow/effects/data/DeferredKW.kt b/arrow-effects-kotlinx-coroutines/src/main/kotlin/arrow/effects/data/DeferredKW.kt index 5bb672ecc82..111b7d5d0bc 100644 --- a/arrow-effects-kotlinx-coroutines/src/main/kotlin/arrow/effects/data/DeferredKW.kt +++ b/arrow-effects-kotlinx-coroutines/src/main/kotlin/arrow/effects/data/DeferredKW.kt @@ -1,5 +1,6 @@ package arrow.effects +import andThen import arrow.* import kotlinx.coroutines.experimental.* import kotlin.coroutines.experimental.CoroutineContext diff --git a/arrow-effects/src/main/kotlin/arrow/effects/data/IO.kt b/arrow-effects/src/main/kotlin/arrow/effects/data/IO.kt index 98d233014a2..d7aa0721265 100644 --- a/arrow-effects/src/main/kotlin/arrow/effects/data/IO.kt +++ b/arrow-effects/src/main/kotlin/arrow/effects/data/IO.kt @@ -1,5 +1,6 @@ package arrow.effects +import andThen import arrow.* import arrow.Either.Left import arrow.Either.Right diff --git a/arrow-free/build.gradle b/arrow-free/build.gradle new file mode 100644 index 00000000000..b2549950dde --- /dev/null +++ b/arrow-free/build.gradle @@ -0,0 +1,18 @@ +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" + compile project(':arrow-annotations') + compile project(':arrow-data') + compile project(':arrow-instances') + kapt project(':arrow-annotations-processor') + kaptTest project(':arrow-annotations-processor') + compileOnly project(':arrow-annotations-processor') + testCompileOnly project(':arrow-annotations-processor') + testCompile "io.kotlintest:kotlintest:$kotlinTestVersion" + testCompile project(':arrow-syntax') + testCompile project(':arrow-instances') + testCompile project(':arrow-test') +} + +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') +apply from: rootProject.file('gradle/generated-kotlin-sources.gradle') +apply plugin: 'kotlin-kapt' diff --git a/arrow-free/gradle.properties b/arrow-free/gradle.properties new file mode 100644 index 00000000000..d34b2085b0e --- /dev/null +++ b/arrow-free/gradle.properties @@ -0,0 +1,4 @@ +# Maven publishing configuration +POM_NAME=Arrow Free Data types +POM_ARTIFACT_ID=arrow-free +POM_PACKAGING=jar diff --git a/arrow-data/src/main/kotlin/arrow/free/Cofree.kt b/arrow-free/src/main/kotlin/arrow/free/Cofree.kt similarity index 98% rename from arrow-data/src/main/kotlin/arrow/free/Cofree.kt rename to arrow-free/src/main/kotlin/arrow/free/Cofree.kt index ec62a8a65bb..0f373145101 100644 --- a/arrow-data/src/main/kotlin/arrow/free/Cofree.kt +++ b/arrow-free/src/main/kotlin/arrow/free/Cofree.kt @@ -37,7 +37,7 @@ typealias CofreeEval = HK> } fun Cofree.cata(folder: (A, HK) -> Eval, TF: Traverse): Eval { - val ev: Eval> = TF.traverse(this.tailForced(), { it.cata(folder, TF) }, Eval.applicative()).ev() + val ev: Eval> = TF.traverse(this.tailForced(), { it.cata(folder, TF) }, arrow.applicative()).ev() return ev.flatMap { folder(extract(), it) } } diff --git a/arrow-data/src/main/kotlin/arrow/data/Const.kt b/arrow-free/src/main/kotlin/arrow/free/Const.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/data/Const.kt rename to arrow-free/src/main/kotlin/arrow/free/Const.kt diff --git a/arrow-data/src/main/kotlin/arrow/free/Coyoneda.kt b/arrow-free/src/main/kotlin/arrow/free/Coyoneda.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/free/Coyoneda.kt rename to arrow-free/src/main/kotlin/arrow/free/Coyoneda.kt diff --git a/arrow-data/src/main/kotlin/arrow/free/Free.kt b/arrow-free/src/main/kotlin/arrow/free/Free.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/free/Free.kt rename to arrow-free/src/main/kotlin/arrow/free/Free.kt index f765e6928f2..d715f61b99d 100644 --- a/arrow-data/src/main/kotlin/arrow/free/Free.kt +++ b/arrow-free/src/main/kotlin/arrow/free/Free.kt @@ -20,7 +20,7 @@ inline fun FreeKind.foldMapK(f: FunctionK, MM: Mon internal fun applicativeF(): Applicative> = object : Applicative> { - private val applicative: Applicative> = applicative() + private val applicative: Applicative> = arrow.applicative() override fun pure(a: A): Free = Free.pure(a) @@ -53,7 +53,7 @@ fun Free.map(f: (A) -> B): Free = flatMap { Free.Pure Free.flatMap(f: (A) -> Free): Free = Free.FlatMapped(this, f) -fun Free.ap(ff: FreeKind B>): Free = ff.flatMap { f -> map(f) }.ev() +fun Free.ap(ff: FreeKind B>): Free = ff.ev().flatMap { f -> map(f) }.ev() @Suppress("UNCHECKED_CAST") tailrec fun Free.step(): Free = diff --git a/arrow-data/src/main/kotlin/arrow/free/FreeApplicative.kt b/arrow-free/src/main/kotlin/arrow/free/FreeApplicative.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/free/FreeApplicative.kt rename to arrow-free/src/main/kotlin/arrow/free/FreeApplicative.kt diff --git a/arrow-free/src/main/kotlin/arrow/free/StackSafeMonadContinuations.kt b/arrow-free/src/main/kotlin/arrow/free/StackSafeMonadContinuations.kt new file mode 100644 index 00000000000..3a08fd2ad50 --- /dev/null +++ b/arrow-free/src/main/kotlin/arrow/free/StackSafeMonadContinuations.kt @@ -0,0 +1,55 @@ +package arrow + +import kotlin.coroutines.experimental.* +import kotlin.coroutines.experimental.intrinsics.COROUTINE_SUSPENDED +import kotlin.coroutines.experimental.intrinsics.suspendCoroutineOrReturn + +@RestrictsSuspension +open class StackSafeMonadContinuation(M: Monad, override val context: CoroutineContext = EmptyCoroutineContext) : + Continuation>, Monad by M { + + override fun resume(value: Free) { + returnedMonad = value + } + + override fun resumeWithException(exception: Throwable) { + throw exception + } + + protected lateinit var returnedMonad: Free + + internal fun returnedMonad(): Free = returnedMonad + + suspend fun HK.bind(): B = bind { Free.liftF(this) } + + suspend fun Free.bind(): B = bind { this } + + suspend fun bind(m: () -> Free): B = suspendCoroutineOrReturn { c -> + val labelHere = c.stackLabels // save the whole coroutine stack labels + returnedMonad = m().flatMap { z -> + c.stackLabels = labelHere + c.resume(z) + returnedMonad + } + COROUTINE_SUSPENDED + } + + infix fun yields(b: B): Free = yields { b } + + infix fun yields(b: () -> B): Free = Free.liftF(pure(b())) +} + +/** + * Entry point for monad bindings which enables for comprehension. The underlying impl is based on coroutines. + * A coroutine is initiated and inside [StackSafeMonadContinuation] suspended yielding to [flatMap]. Once all the flatMap binds are completed + * the underlying monad is returned from the act of executing the coroutine. + * + * This combinator ultimately returns computations lifting to [Free] to automatically for comprehend in a stack-safe way + * over any stack-unsafe monads. + */ +fun Monad.bindingStackSafe(c: suspend StackSafeMonadContinuation.() -> Free): + Free { + val continuation = StackSafeMonadContinuation(this) + c.startCoroutine(continuation, continuation) + return continuation.returnedMonad() +} \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/data/Trampoline.kt b/arrow-free/src/main/kotlin/arrow/free/Trampoline.kt similarity index 95% rename from arrow-data/src/main/kotlin/arrow/data/Trampoline.kt rename to arrow-free/src/main/kotlin/arrow/free/Trampoline.kt index 0928844399b..ecfc1f42dd3 100644 --- a/arrow-data/src/main/kotlin/arrow/data/Trampoline.kt +++ b/arrow-free/src/main/kotlin/arrow/free/Trampoline.kt @@ -20,4 +20,4 @@ interface TrampolineFunctions { fun delay(a: () -> A): TrampolineF = defer { done(a()) } } -fun TrampolineF.runT(): A = this.foldMap(FunctionK.id(), Function0.monad()).ev().invoke() \ No newline at end of file +fun TrampolineF.runT(): A = this.foldMap(FunctionK.id(), arrow.monad()).ev().invoke() \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/free/Yoneda.kt b/arrow-free/src/main/kotlin/arrow/free/Yoneda.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/free/Yoneda.kt rename to arrow-free/src/main/kotlin/arrow/free/Yoneda.kt diff --git a/arrow-data/src/main/kotlin/arrow/instances/CofreeInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/cofree.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/instances/CofreeInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/cofree.kt index 41bd32b49f3..eaeef04e997 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/CofreeInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/cofree.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + @instance(Cofree::class) interface CofreeFunctorInstance : Functor>, Typeclass { override fun map(fa: CofreeKind, f: (A) -> B): Cofree = fa.ev().map(f) diff --git a/arrow-data/src/main/kotlin/arrow/instances/ConstInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/const.kt similarity index 85% rename from arrow-data/src/main/kotlin/arrow/instances/ConstInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/const.kt index 6d6dcdcc058..0afdfc9be47 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/ConstInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/const.kt @@ -1,4 +1,6 @@ -package arrow +package arrow.free.instances + +import arrow.* @instance(Const::class) interface ConstFunctorInstance : Functor> { @@ -55,13 +57,6 @@ interface ConstMonoidInstance : ConstSemigroupInstance, Monoid : ConstTraverseInstance, TraverseFilter> { - - override fun traverseFilter(fa: ConstKind, f: (A) -> HK>, GA: Applicative): HK> = - fa.ev().traverseFilter(f, GA) -} - @instance(Const::class) interface ConstEqInstance : Eq> { diff --git a/arrow-data/src/main/kotlin/arrow/instances/CoYonedaInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/coyoneda.kt similarity index 69% rename from arrow-data/src/main/kotlin/arrow/instances/CoYonedaInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/coyoneda.kt index fad77e5aed3..7dde14d9ab8 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/CoYonedaInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/coyoneda.kt @@ -1,4 +1,8 @@ -package arrow +package arrow.free.instances + +import arrow.Coyoneda +import arrow.Functor +import arrow.instance @instance(Coyoneda::class) interface CoyonedaFunctorInstance : Functor> { diff --git a/arrow-data/src/main/kotlin/arrow/instances/FreeInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/free.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/instances/FreeInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/free.kt index c23111ea4b5..4bad1e17d80 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/FreeInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/free.kt @@ -1,4 +1,6 @@ -package arrow +package arrow.free.instances + +import arrow.* @instance(Free::class) interface FreeFunctorInstance : Functor> { diff --git a/arrow-data/src/main/kotlin/arrow/instances/FreeApplicativeInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/freeaplicative.kt similarity index 96% rename from arrow-data/src/main/kotlin/arrow/instances/FreeApplicativeInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/freeaplicative.kt index 2dcef4d1bc3..a4c1acea7f6 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/FreeApplicativeInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/freeaplicative.kt @@ -1,4 +1,6 @@ -package arrow +package arrow.free.instances + +import arrow.* @instance(FreeApplicative::class) interface FreeApplicativeFunctorInstance : Functor> { diff --git a/arrow-data/src/main/kotlin/arrow/instances/YonedaInstances.kt b/arrow-free/src/main/kotlin/arrow/free/instances/yoneda.kt similarity index 67% rename from arrow-data/src/main/kotlin/arrow/instances/YonedaInstances.kt rename to arrow-free/src/main/kotlin/arrow/free/instances/yoneda.kt index f60cbbff0d5..91ad7bbb248 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/YonedaInstances.kt +++ b/arrow-free/src/main/kotlin/arrow/free/instances/yoneda.kt @@ -1,4 +1,8 @@ -package arrow +package arrow.free.instances + +import arrow.Functor +import arrow.Yoneda +import arrow.instance @instance(Yoneda::class) interface YonedaFunctorInstance : Functor> { diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Composed.kt b/arrow-instances/src/main/kotlin/arrow/instances/composed.kt similarity index 72% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Composed.kt rename to arrow-instances/src/main/kotlin/arrow/instances/composed.kt index 566955dc7c8..19fc21dc563 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Composed.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/composed.kt @@ -1,26 +1,5 @@ package arrow -/** - * https://www.youtube.com/watch?v=wvSP5qYiz4Y - */ -interface Nested - -typealias NestedType = HK, A> - -typealias UnnestedType = HK> - -@Suppress("UNCHECKED_CAST") -fun UnnestedType.nest(): NestedType = this as HK, A> - -@Suppress("UNCHECKED_CAST") -fun NestedType.unnest(): HK> = this as HK> - -@Suppress("UNCHECKED_CAST") -fun HK2, HK2>.binest(): HK2, A, B> = this as HK2, A, B> - -@Suppress("UNCHECKED_CAST") -fun HK2, A, B>.biunnest(): HK2, HK2> = this as HK2, HK2> - interface ComposedFoldable : Foldable> { @@ -55,46 +34,6 @@ inline fun Foldable.compose(GT: Foldable = foldable()): override fun GF(): Foldable = GT } -interface ComposedTraverseFilter : - TraverseFilter>, - ComposedTraverse { - - override fun FT(): Traverse - - override fun GT(): TraverseFilter - - override fun GA(): Applicative - - override fun traverseFilter(fa: HK, A>, f: (A) -> HK>, HA: Applicative): HK, B>> = - HA.map(FT().traverse(fa.unnest(), { ga -> GT().traverseFilter(ga, f, HA) }, HA), { it.nest() }) - - fun traverseFilterC(fa: HK>, f: (A) -> HK>, HA: Applicative): HK, B>> = - traverseFilter(fa.nest(), f, HA) - - companion object { - operator fun invoke( - FF: Traverse, - GF: TraverseFilter, - GA: Applicative): ComposedTraverseFilter = - object : ComposedTraverseFilter { - override fun FT(): Traverse = FF - - override fun GT(): TraverseFilter = GF - - override fun GA(): Applicative = GA - } - } -} - -inline fun TraverseFilter.compose(GT: TraverseFilter = traverseFilter(), GA: Applicative = applicative()): - TraverseFilter> = object : ComposedTraverseFilter { - override fun FT(): Traverse = this@compose - - override fun GT(): TraverseFilter = GT - - override fun GA(): Applicative = GA -} - interface ComposedTraverse : Traverse>, ComposedFoldable { @@ -243,31 +182,6 @@ interface ComposedAlternative : Alternative>, ComposedApplica inline fun Alternative.compose(GA: Applicative = applicative()): Alternative> = ComposedAlternative(this, GA) -interface ComposedFunctorFilter : FunctorFilter>, ComposedFunctor { - - override fun F(): Functor - - override fun G(): FunctorFilter - - override fun mapFilter(fga: HK, A>, f: (A) -> Option): HK, B> = - F().map(fga.unnest(), { G().mapFilter(it, f) }).nest() - - fun mapFilterC(fga: HK>, f: (A) -> Option): HK> = - mapFilter(fga.nest(), f).unnest() - - companion object { - operator fun invoke(FF: Functor, FFG: FunctorFilter): ComposedFunctorFilter = - object : ComposedFunctorFilter { - override fun F(): Functor = FF - - override fun G(): FunctorFilter = FFG - } - } -} - -inline fun Functor.composeFilter(FFG: FunctorFilter = functorFilter()): - FunctorFilter> = ComposedFunctorFilter(this, FFG) - interface ComposedBifoldable : Bifoldable> { fun F(): Bifoldable @@ -299,4 +213,4 @@ interface ComposedBifoldable : Bifoldable> { } } -inline fun Bifoldable.compose(BG: Bifoldable = bifoldable()): Bifoldable> = ComposedBifoldable(this, BG) +inline fun Bifoldable.compose(BG: Bifoldable = bifoldable()): Bifoldable> = ComposedBifoldable(this, BG) \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/instances/CoproductInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/coproduct.kt similarity index 76% rename from arrow-data/src/main/kotlin/arrow/instances/CoproductInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/coproduct.kt index 3fe8ab1aab3..72b1a199655 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/CoproductInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/coproduct.kt @@ -81,3 +81,15 @@ object CoproductTraverseInstanceImplicits { override fun TG(): Traverse = TG } } + +inline fun Coproduct.Companion.comonad(CF: Comonad = arrow.comonad(), CG: Comonad): CoproductComonadInstance = + CoproductComonadInstanceImplicits.instance(CF, CG) + +inline fun Coproduct.Companion.functor(FF: Functor = arrow.functor(), FG: Functor = arrow.functor()): CoproductFunctorInstance = + CoproductFunctorInstanceImplicits.instance(FF, FG) + +inline fun Coproduct.Companion.traverse(FF: Traverse = traverse(), FG: Traverse = traverse()): CoproductTraverseInstance = + CoproductTraverseInstanceImplicits.instance(FF, FG) + +inline fun Coproduct.Companion.foldable(FF: Foldable = foldable(), FG: Foldable = foldable()): CoproductFoldableInstance = + CoproductFoldableInstanceImplicits.instance(FF, FG) diff --git a/arrow-data/src/main/kotlin/arrow/instances/EitherInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/either.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/instances/EitherInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/either.kt diff --git a/arrow-data/src/main/kotlin/arrow/instances/EitherTInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/eithert.kt similarity index 78% rename from arrow-data/src/main/kotlin/arrow/instances/EitherTInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/eithert.kt index a5aac7d91f0..d6a2ea3b47a 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/EitherTInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/eithert.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + interface EitherTFunctorInstance : Functor> { fun FF(): Functor @@ -126,3 +128,24 @@ object EitherTSemigroupKInstanceImplicits { override fun MF(): Monad = MF } } + +inline fun EitherT.Companion.functor(FF: Functor = functor()): Functor> = + EitherTFunctorInstanceImplicits.instance(FF) + +inline fun EitherT.Companion.applicative(MF: Monad = monad()): Applicative> = + EitherTApplicativeInstanceImplicits.instance(MF) + +inline fun EitherT.Companion.monad(MF: Monad = monad()): Monad> = + EitherTMonadInstanceImplicits.instance(MF) + +inline fun EitherT.Companion.monadError(MF: Monad = monad()): MonadError, L> = + EitherTMonadErrorInstanceImplicits.instance(MF) + +inline fun EitherT.Companion.traverse(FF: Traverse = traverse()): Traverse> = + EitherTTraverseInstanceImplicits.instance(FF) + +inline fun EitherT.Companion.foldable(FF: Traverse = traverse()): Foldable> = + EitherTFoldableInstanceImplicits.instance(FF) + +inline fun EitherT.Companion.semigroupK(MF: Monad = monad()): SemigroupK> = + EitherTSemigroupKInstanceImplicits.instance(MF) diff --git a/arrow-instances/src/main/kotlin/arrow/instances/eval.kt b/arrow-instances/src/main/kotlin/arrow/instances/eval.kt new file mode 100644 index 00000000000..7dd4eb4422f --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/eval.kt @@ -0,0 +1,103 @@ +package arrow + +interface EvalFunctorInstance : arrow.Functor { + override fun map(fa: arrow.EvalKind, f: kotlin.Function1): arrow.Eval = + fa.ev().map(f) +} + +object EvalFunctorInstanceImplicits { + fun instance(): EvalFunctorInstance = arrow.Eval.Companion.functor() +} + +fun arrow.Eval.Companion.functor(): EvalFunctorInstance = + object : EvalFunctorInstance, arrow.Functor {} + +interface EvalApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.EvalKind, ff: arrow.EvalKind>): arrow.Eval = + fa.ev().ap(ff) + + override fun map(fa: arrow.EvalKind, f: kotlin.Function1): arrow.Eval = + fa.ev().map(f) + + override fun pure(a: A): arrow.Eval = + arrow.Eval.pure(a) +} + +object EvalApplicativeInstanceImplicits { + fun instance(): EvalApplicativeInstance = arrow.Eval.Companion.applicative() +} + +fun arrow.Eval.Companion.applicative(): EvalApplicativeInstance = + object : EvalApplicativeInstance, arrow.Applicative {} + +interface EvalMonadInstance : arrow.Monad { + override fun ap(fa: arrow.EvalKind, ff: arrow.EvalKind>): arrow.Eval = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.EvalKind, f: kotlin.Function1>): arrow.Eval = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Eval = + arrow.Eval.tailRecM(a, f) + + override fun map(fa: arrow.EvalKind, f: kotlin.Function1): arrow.Eval = + fa.ev().map(f) + + override fun pure(a: A): arrow.Eval = + arrow.Eval.pure(a) +} + +object EvalMonadInstanceImplicits { + fun instance(): EvalMonadInstance = arrow.Eval.Companion.monad() +} + +fun arrow.Eval.Companion.monad(): EvalMonadInstance = + object : EvalMonadInstance, arrow.Monad {} + +interface EvalComonadInstance : arrow.Comonad { + override fun coflatMap(fa: arrow.EvalKind, f: kotlin.Function1, B>): arrow.Eval = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.EvalKind): A = + fa.ev().extract() + + override fun map(fa: arrow.EvalKind, f: kotlin.Function1): arrow.Eval = + fa.ev().map(f) +} + +object EvalComonadInstanceImplicits { + fun instance(): EvalComonadInstance = arrow.Eval.Companion.comonad() +} + +fun arrow.Eval.Companion.comonad(): EvalComonadInstance = + object : EvalComonadInstance, arrow.Comonad {} + +interface EvalBimonadInstance : arrow.Bimonad { + override fun ap(fa: arrow.EvalKind, ff: arrow.EvalKind>): arrow.Eval = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.EvalKind, f: kotlin.Function1>): arrow.Eval = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Eval = + arrow.Eval.tailRecM(a, f) + + override fun map(fa: arrow.EvalKind, f: kotlin.Function1): arrow.Eval = + fa.ev().map(f) + + override fun pure(a: A): arrow.Eval = + arrow.Eval.pure(a) + + override fun coflatMap(fa: arrow.EvalKind, f: kotlin.Function1, B>): arrow.Eval = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.EvalKind): A = + fa.ev().extract() +} + +object EvalBimonadInstanceImplicits { + fun instance(): EvalBimonadInstance = arrow.Eval.Companion.bimonad() +} + +fun arrow.Eval.Companion.bimonad(): EvalBimonadInstance = + object : EvalBimonadInstance, arrow.Bimonad {} diff --git a/arrow-instances/src/main/kotlin/arrow/instances/function0.kt b/arrow-instances/src/main/kotlin/arrow/instances/function0.kt new file mode 100644 index 00000000000..e7e2ec76115 --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/function0.kt @@ -0,0 +1,103 @@ +package arrow + +interface Function0FunctorInstance : arrow.Functor { + override fun map(fa: arrow.Function0Kind, f: kotlin.Function1): arrow.Function0 = + fa.ev().map(f) +} + +object Function0FunctorInstanceImplicits { + fun instance(): Function0FunctorInstance = arrow.Function0.Companion.functor() +} + +fun arrow.Function0.Companion.functor(): Function0FunctorInstance = + object : Function0FunctorInstance, arrow.Functor {} + +interface Function0ApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.Function0Kind, ff: arrow.Function0Kind>): arrow.Function0 = + fa.ev().ap(ff) + + override fun map(fa: arrow.Function0Kind, f: kotlin.Function1): arrow.Function0 = + fa.ev().map(f) + + override fun pure(a: A): arrow.Function0 = + arrow.Function0.pure(a) +} + +object Function0ApplicativeInstanceImplicits { + fun instance(): Function0ApplicativeInstance = arrow.Function0.Companion.applicative() +} + +fun arrow.Function0.Companion.applicative(): Function0ApplicativeInstance = + object : Function0ApplicativeInstance, arrow.Applicative {} + +interface Function0MonadInstance : arrow.Monad { + override fun ap(fa: arrow.Function0Kind, ff: arrow.Function0Kind>): arrow.Function0 = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.Function0Kind, f: kotlin.Function1>): arrow.Function0 = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Function0 = + arrow.Function0.tailRecM(a, f) + + override fun map(fa: arrow.Function0Kind, f: kotlin.Function1): arrow.Function0 = + fa.ev().map(f) + + override fun pure(a: A): arrow.Function0 = + arrow.Function0.pure(a) +} + +object Function0MonadInstanceImplicits { + fun instance(): Function0MonadInstance = arrow.Function0.Companion.monad() +} + +fun arrow.Function0.Companion.monad(): Function0MonadInstance = + object : Function0MonadInstance, arrow.Monad {} + +interface Function0ComonadInstance : arrow.Comonad { + override fun coflatMap(fa: arrow.Function0Kind, f: kotlin.Function1, B>): arrow.Function0 = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.Function0Kind): A = + fa.ev().extract() + + override fun map(fa: arrow.Function0Kind, f: kotlin.Function1): arrow.Function0 = + fa.ev().map(f) +} + +object Function0ComonadInstanceImplicits { + fun instance(): Function0ComonadInstance = arrow.Function0.Companion.comonad() +} + +fun arrow.Function0.Companion.comonad(): Function0ComonadInstance = + object : Function0ComonadInstance, arrow.Comonad {} + +interface Function0BimonadInstance : arrow.Bimonad { + override fun ap(fa: arrow.Function0Kind, ff: arrow.Function0Kind>): arrow.Function0 = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.Function0Kind, f: kotlin.Function1>): arrow.Function0 = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Function0 = + arrow.Function0.tailRecM(a, f) + + override fun map(fa: arrow.Function0Kind, f: kotlin.Function1): arrow.Function0 = + fa.ev().map(f) + + override fun pure(a: A): arrow.Function0 = + arrow.Function0.pure(a) + + override fun coflatMap(fa: arrow.Function0Kind, f: kotlin.Function1, B>): arrow.Function0 = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.Function0Kind): A = + fa.ev().extract() +} + +object Function0BimonadInstanceImplicits { + fun instance(): Function0BimonadInstance = arrow.Function0.Companion.bimonad() +} + +fun arrow.Function0.Companion.bimonad(): Function0BimonadInstance = + object : Function0BimonadInstance, arrow.Bimonad {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/Function1Instances.kt b/arrow-instances/src/main/kotlin/arrow/instances/function1.kt similarity index 96% rename from arrow-data/src/main/kotlin/arrow/instances/Function1Instances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/function1.kt index 2acc30e7614..d20972a823e 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/Function1Instances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/function1.kt @@ -1,5 +1,9 @@ package arrow +import arrow.Either +import arrow.Function1 +import arrow.instance + @instance(Function1::class) interface Function1FunctorInstance : Functor> { override fun map(fa: Function1Kind, f: (A) -> B): Function1 = diff --git a/arrow-instances/src/main/kotlin/arrow/instances/id.kt b/arrow-instances/src/main/kotlin/arrow/instances/id.kt new file mode 100644 index 00000000000..738fc12139c --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/id.kt @@ -0,0 +1,148 @@ +package arrow + +@instance(Id::class) +interface IdEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: Id, b: Id): Boolean = + EQ().eqv(a.value, b.value) +} + +interface IdFunctorInstance : arrow.Functor { + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) +} + +object IdFunctorInstanceImplicits { + fun instance(): IdFunctorInstance = arrow.Id.Companion.functor() +} + +fun arrow.Id.Companion.functor(): IdFunctorInstance = + object : IdFunctorInstance, arrow.Functor {} + +interface IdApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.IdKind, ff: arrow.IdKind>): arrow.Id = + fa.ev().ap(ff) + + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) + + override fun pure(a: A): arrow.Id = + arrow.Id.pure(a) +} + +object IdApplicativeInstanceImplicits { + fun instance(): IdApplicativeInstance = arrow.Id.Companion.applicative() +} + +fun arrow.Id.Companion.applicative(): IdApplicativeInstance = + object : IdApplicativeInstance, arrow.Applicative {} + +interface IdMonadInstance : arrow.Monad { + override fun ap(fa: arrow.IdKind, ff: arrow.IdKind>): arrow.Id = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.IdKind, f: kotlin.Function1>): arrow.Id = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Id = + arrow.Id.tailRecM(a, f) + + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) + + override fun pure(a: A): arrow.Id = + arrow.Id.pure(a) +} + +object IdMonadInstanceImplicits { + fun instance(): IdMonadInstance = arrow.Id.Companion.monad() +} + +fun arrow.Id.Companion.monad(): IdMonadInstance = + object : IdMonadInstance, arrow.Monad {} + +interface IdComonadInstance : arrow.Comonad { + override fun coflatMap(fa: arrow.IdKind, f: kotlin.Function1, B>): arrow.Id = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.IdKind): A = + fa.ev().extract() + + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) +} + +object IdComonadInstanceImplicits { + fun instance(): IdComonadInstance = arrow.Id.Companion.comonad() +} + +fun arrow.Id.Companion.comonad(): IdComonadInstance = + object : IdComonadInstance, arrow.Comonad {} + +interface IdBimonadInstance : arrow.Bimonad { + override fun ap(fa: arrow.IdKind, ff: arrow.IdKind>): arrow.Id = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.IdKind, f: kotlin.Function1>): arrow.Id = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Id = + arrow.Id.tailRecM(a, f) + + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) + + override fun pure(a: A): arrow.Id = + arrow.Id.pure(a) + + override fun coflatMap(fa: arrow.IdKind, f: kotlin.Function1, B>): arrow.Id = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.IdKind): A = + fa.ev().extract() +} + +object IdBimonadInstanceImplicits { + fun instance(): IdBimonadInstance = arrow.Id.Companion.bimonad() +} + +fun arrow.Id.Companion.bimonad(): IdBimonadInstance = + object : IdBimonadInstance, arrow.Bimonad {} + +interface IdFoldableInstance : arrow.Foldable { + override fun foldLeft(fa: arrow.IdKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.IdKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object IdFoldableInstanceImplicits { + fun instance(): IdFoldableInstance = arrow.Id.Companion.foldable() +} + +fun arrow.Id.Companion.foldable(): IdFoldableInstance = + object : IdFoldableInstance, arrow.Foldable {} + +interface IdTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.IdKind, f: kotlin.Function1): arrow.Id = + fa.ev().map(f) + + override fun traverse(fa: arrow.IdKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun foldLeft(fa: arrow.IdKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.IdKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object IdTraverseInstanceImplicits { + fun instance(): IdTraverseInstance = arrow.Id.Companion.traverse() +} + +fun arrow.Id.Companion.traverse(): IdTraverseInstance = + object : IdTraverseInstance, arrow.Traverse {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/IorInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/ior.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/IorInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/ior.kt index 034c5157eeb..78aa62a2d6c 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/IorInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/ior.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + @instance(Ior::class) interface IorFunctorInstance : Functor> { override fun map(fa: IorKind, f: (A) -> B): Ior = fa.ev().map(f) diff --git a/arrow-instances/src/main/kotlin/arrow/instances/iterable.kt b/arrow-instances/src/main/kotlin/arrow/instances/iterable.kt new file mode 100644 index 00000000000..a3ac1bd9290 --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/iterable.kt @@ -0,0 +1,11 @@ +package arrow + +import arrow.PartialFunction +import arrow.orElse + +fun Iterable.collect(vararg cases: PartialFunction): List = + flatMap { value: A -> + val f: PartialFunction = cases.reduce({ a, b -> a.orElse(b) }) + if (f.isDefinedAt(value)) listOf(f(value)) + else emptyList() + } diff --git a/arrow-data/src/main/kotlin/arrow/instances/KleisliInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/kleisli.kt similarity index 96% rename from arrow-data/src/main/kotlin/arrow/instances/KleisliInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/kleisli.kt index 68142ad0b87..f89d795cb16 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/KleisliInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/kleisli.kt @@ -1,5 +1,10 @@ package arrow +import arrow.Either +import arrow.Kleisli +import andThen +import arrow.instance + @instance(Kleisli::class) interface KleisliFunctorInstance : Functor> { diff --git a/arrow-instances/src/main/kotlin/arrow/instances/listkw.kt b/arrow-instances/src/main/kotlin/arrow/instances/listkw.kt new file mode 100644 index 00000000000..a4218740f24 --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/listkw.kt @@ -0,0 +1,236 @@ +package arrow + +@instance(ListKW::class) +interface ListKWSemigroupInstance : Semigroup> { + override fun combine(a: ListKW, b: ListKW): ListKW = (a + b).k() +} + +@instance(ListKW::class) +interface ListKWMonoidInstance : ListKWSemigroupInstance, Monoid> { + override fun empty(): ListKW = emptyList().k() +} + +@instance(ListKW::class) +interface ListKWEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: ListKW, b: ListKW): Boolean = + a.zip(b) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> + acc && bool + } + +} + +interface ListKWFunctorInstance : arrow.Functor { + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) +} + +object ListKWFunctorInstanceImplicits { + fun instance(): ListKWFunctorInstance = arrow.ListKW.Companion.functor() +} + +fun arrow.ListKW.Companion.functor(): ListKWFunctorInstance = + object : ListKWFunctorInstance, arrow.Functor {} + +interface ListKWApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.ListKWKind, ff: arrow.ListKWKind>): arrow.ListKW = + fa.ev().ap(ff) + + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) + + override fun map2(fa: arrow.ListKWKind, fb: arrow.ListKWKind, f: kotlin.Function1, Z>): arrow.ListKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.ListKW = + arrow.ListKW.pure(a) +} + +object ListKWApplicativeInstanceImplicits { + fun instance(): ListKWApplicativeInstance = arrow.ListKW.Companion.applicative() +} + +fun arrow.ListKW.Companion.applicative(): ListKWApplicativeInstance = + object : ListKWApplicativeInstance, arrow.Applicative {} + +interface ListKWMonadInstance : arrow.Monad { + override fun ap(fa: arrow.ListKWKind, ff: arrow.ListKWKind>): arrow.ListKW = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.ListKW = + arrow.ListKW.tailRecM(a, f) + + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) + + override fun map2(fa: arrow.ListKWKind, fb: arrow.ListKWKind, f: kotlin.Function1, Z>): arrow.ListKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.ListKW = + arrow.ListKW.pure(a) +} + +object ListKWMonadInstanceImplicits { + fun instance(): ListKWMonadInstance = arrow.ListKW.Companion.monad() +} + +fun arrow.ListKW.Companion.monad(): ListKWMonadInstance = + object : ListKWMonadInstance, arrow.Monad {} + +interface ListKWFoldableInstance : arrow.Foldable { + override fun foldLeft(fa: arrow.ListKWKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.ListKWKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun isEmpty(fa: arrow.ListKWKind): kotlin.Boolean = + fa.ev().isEmpty() +} + +object ListKWFoldableInstanceImplicits { + fun instance(): ListKWFoldableInstance = arrow.ListKW.Companion.foldable() +} + +fun arrow.ListKW.Companion.foldable(): ListKWFoldableInstance = + object : ListKWFoldableInstance, arrow.Foldable {} + +interface ListKWTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) + + override fun traverse(fa: arrow.ListKWKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun foldLeft(fa: arrow.ListKWKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.ListKWKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun isEmpty(fa: arrow.ListKWKind): kotlin.Boolean = + fa.ev().isEmpty() +} + +object ListKWTraverseInstanceImplicits { + fun instance(): ListKWTraverseInstance = arrow.ListKW.Companion.traverse() +} + +fun arrow.ListKW.Companion.traverse(): ListKWTraverseInstance = + object : ListKWTraverseInstance, arrow.Traverse {} + +interface ListKWSemigroupKInstance : arrow.SemigroupK { + override fun combineK(x: arrow.ListKWKind, y: arrow.ListKWKind): arrow.ListKW = + x.ev().combineK(y) +} + +object ListKWSemigroupKInstanceImplicits { + fun instance(): ListKWSemigroupKInstance = arrow.ListKW.Companion.semigroupK() +} + +fun arrow.ListKW.Companion.semigroupK(): ListKWSemigroupKInstance = + object : ListKWSemigroupKInstance, arrow.SemigroupK {} + +interface ListKWMonoidKInstance : arrow.MonoidK { + override fun empty(): arrow.ListKW = + arrow.ListKW.empty() + + override fun combineK(x: arrow.ListKWKind, y: arrow.ListKWKind): arrow.ListKW = + x.ev().combineK(y) +} + +object ListKWMonoidKInstanceImplicits { + fun instance(): ListKWMonoidKInstance = arrow.ListKW.Companion.monoidK() +} + +fun arrow.ListKW.Companion.monoidK(): ListKWMonoidKInstance = + object : ListKWMonoidKInstance, arrow.MonoidK {} + +interface ListKWMonadCombineInstance : arrow.MonadCombine { + override fun empty(): arrow.ListKW = + arrow.ListKW.empty() + + override fun mapFilter(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().mapFilter(f) + + override fun ap(fa: arrow.ListKWKind, ff: arrow.ListKWKind>): arrow.ListKW = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.ListKW = + arrow.ListKW.tailRecM(a, f) + + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) + + override fun map2(fa: arrow.ListKWKind, fb: arrow.ListKWKind, f: kotlin.Function1, Z>): arrow.ListKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.ListKW = + arrow.ListKW.pure(a) + + override fun combineK(x: arrow.ListKWKind, y: arrow.ListKWKind): arrow.ListKW = + x.ev().combineK(y) +} + +object ListKWMonadCombineInstanceImplicits { + fun instance(): ListKWMonadCombineInstance = arrow.ListKW.Companion.monadCombine() +} + +fun arrow.ListKW.Companion.monadCombine(): ListKWMonadCombineInstance = + object : ListKWMonadCombineInstance, arrow.MonadCombine {} + +interface ListKWFunctorFilterInstance : arrow.FunctorFilter { + override fun mapFilter(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().mapFilter(f) + + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) +} + +object ListKWFunctorFilterInstanceImplicits { + fun instance(): ListKWFunctorFilterInstance = arrow.ListKW.Companion.functorFilter() +} + +fun arrow.ListKW.Companion.functorFilter(): ListKWFunctorFilterInstance = + object : ListKWFunctorFilterInstance, arrow.FunctorFilter {} + +interface ListKWMonadFilterInstance : arrow.MonadFilter { + override fun empty(): arrow.ListKW = + arrow.ListKW.empty() + + override fun mapFilter(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().mapFilter(f) + + override fun ap(fa: arrow.ListKWKind, ff: arrow.ListKWKind>): arrow.ListKW = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.ListKWKind, f: kotlin.Function1>): arrow.ListKW = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.ListKW = + arrow.ListKW.tailRecM(a, f) + + override fun map(fa: arrow.ListKWKind, f: kotlin.Function1): arrow.ListKW = + fa.ev().map(f) + + override fun map2(fa: arrow.ListKWKind, fb: arrow.ListKWKind, f: kotlin.Function1, Z>): arrow.ListKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.ListKW = + arrow.ListKW.pure(a) +} + +object ListKWMonadFilterInstanceImplicits { + fun instance(): ListKWMonadFilterInstance = arrow.ListKW.Companion.monadFilter() +} + +fun arrow.ListKW.Companion.monadFilter(): ListKWMonadFilterInstance = + object : ListKWMonadFilterInstance, arrow.MonadFilter {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/MapKWInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/mapkw.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/MapKWInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/mapkw.kt index 0bc45b17990..efc06ecfa03 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/MapKWInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/mapkw.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + @instance(MapKW::class) interface MapKWFunctorInstance : Functor> { override fun map(fa: HK, A>, f: (A) -> B): MapKW = fa.ev().map(f) diff --git a/arrow-instances/src/main/kotlin/arrow/instances/nonemptylist.kt b/arrow-instances/src/main/kotlin/arrow/instances/nonemptylist.kt new file mode 100644 index 00000000000..1da85fc7759 --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/nonemptylist.kt @@ -0,0 +1,173 @@ +package arrow + +@instance(NonEmptyList::class) +interface NonEmptyListSemigroupInstance : Semigroup> { + override fun combine(a: NonEmptyList, b: NonEmptyList): NonEmptyList = a + b +} + +@instance(NonEmptyList::class) +interface NonEmptyListEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: NonEmptyList, b: NonEmptyList): Boolean = + a.all.zip(b.all) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> + acc && bool + } +} + +interface NonEmptyListFunctorInstance : arrow.Functor { + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) +} + +object NonEmptyListFunctorInstanceImplicits { + fun instance(): NonEmptyListFunctorInstance = arrow.NonEmptyList.Companion.functor() +} + +fun arrow.NonEmptyList.Companion.functor(): NonEmptyListFunctorInstance = + object : NonEmptyListFunctorInstance, arrow.Functor {} + +interface NonEmptyListApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.NonEmptyListKind, ff: arrow.NonEmptyListKind>): arrow.NonEmptyList = + fa.ev().ap(ff) + + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) + + override fun pure(a: A): arrow.NonEmptyList = + arrow.NonEmptyList.pure(a) +} + +object NonEmptyListApplicativeInstanceImplicits { + fun instance(): NonEmptyListApplicativeInstance = arrow.NonEmptyList.Companion.applicative() +} + +fun arrow.NonEmptyList.Companion.applicative(): NonEmptyListApplicativeInstance = + object : NonEmptyListApplicativeInstance, arrow.Applicative {} + +interface NonEmptyListMonadInstance : arrow.Monad { + override fun ap(fa: arrow.NonEmptyListKind, ff: arrow.NonEmptyListKind>): arrow.NonEmptyList = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.NonEmptyListKind, f: kotlin.Function1>): arrow.NonEmptyList = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.NonEmptyList = + arrow.NonEmptyList.tailRecM(a, f) + + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) + + override fun pure(a: A): arrow.NonEmptyList = + arrow.NonEmptyList.pure(a) +} + +object NonEmptyListMonadInstanceImplicits { + fun instance(): NonEmptyListMonadInstance = arrow.NonEmptyList.Companion.monad() +} + +fun arrow.NonEmptyList.Companion.monad(): NonEmptyListMonadInstance = + object : NonEmptyListMonadInstance, arrow.Monad {} + +interface NonEmptyListComonadInstance : arrow.Comonad { + override fun coflatMap(fa: arrow.NonEmptyListKind, f: kotlin.Function1, B>): arrow.NonEmptyList = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.NonEmptyListKind): A = + fa.ev().extract() + + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) +} + +object NonEmptyListComonadInstanceImplicits { + fun instance(): NonEmptyListComonadInstance = arrow.NonEmptyList.Companion.comonad() +} + +fun arrow.NonEmptyList.Companion.comonad(): NonEmptyListComonadInstance = + object : NonEmptyListComonadInstance, arrow.Comonad {} + +interface NonEmptyListBimonadInstance : arrow.Bimonad { + override fun ap(fa: arrow.NonEmptyListKind, ff: arrow.NonEmptyListKind>): arrow.NonEmptyList = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.NonEmptyListKind, f: kotlin.Function1>): arrow.NonEmptyList = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.NonEmptyList = + arrow.NonEmptyList.tailRecM(a, f) + + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) + + override fun pure(a: A): arrow.NonEmptyList = + arrow.NonEmptyList.pure(a) + + override fun coflatMap(fa: arrow.NonEmptyListKind, f: kotlin.Function1, B>): arrow.NonEmptyList = + fa.ev().coflatMap(f) + + override fun extract(fa: arrow.NonEmptyListKind): A = + fa.ev().extract() +} + +object NonEmptyListBimonadInstanceImplicits { + fun instance(): NonEmptyListBimonadInstance = arrow.NonEmptyList.Companion.bimonad() +} + +fun arrow.NonEmptyList.Companion.bimonad(): NonEmptyListBimonadInstance = + object : NonEmptyListBimonadInstance, arrow.Bimonad {} + +interface NonEmptyListFoldableInstance : arrow.Foldable { + override fun foldLeft(fa: arrow.NonEmptyListKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.NonEmptyListKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun isEmpty(fa: arrow.NonEmptyListKind): kotlin.Boolean = + fa.ev().isEmpty() +} + +object NonEmptyListFoldableInstanceImplicits { + fun instance(): NonEmptyListFoldableInstance = arrow.NonEmptyList.Companion.foldable() +} + +fun arrow.NonEmptyList.Companion.foldable(): NonEmptyListFoldableInstance = + object : NonEmptyListFoldableInstance, arrow.Foldable {} + +interface NonEmptyListTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.NonEmptyListKind, f: kotlin.Function1): arrow.NonEmptyList = + fa.ev().map(f) + + override fun traverse(fa: arrow.NonEmptyListKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun foldLeft(fa: arrow.NonEmptyListKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.NonEmptyListKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun isEmpty(fa: arrow.NonEmptyListKind): kotlin.Boolean = + fa.ev().isEmpty() +} + +object NonEmptyListTraverseInstanceImplicits { + fun instance(): NonEmptyListTraverseInstance = arrow.NonEmptyList.Companion.traverse() +} + +fun arrow.NonEmptyList.Companion.traverse(): NonEmptyListTraverseInstance = + object : NonEmptyListTraverseInstance, arrow.Traverse {} + +interface NonEmptyListSemigroupKInstance : arrow.SemigroupK { + override fun combineK(x: arrow.NonEmptyListKind, y: arrow.NonEmptyListKind): arrow.NonEmptyList = + x.ev().combineK(y) +} + +object NonEmptyListSemigroupKInstanceImplicits { + fun instance(): NonEmptyListSemigroupKInstance = arrow.NonEmptyList.Companion.semigroupK() +} + +fun arrow.NonEmptyList.Companion.semigroupK(): NonEmptyListSemigroupKInstance = + object : NonEmptyListSemigroupKInstance, arrow.SemigroupK {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/NumberInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/number.kt similarity index 95% rename from arrow-data/src/main/kotlin/arrow/instances/NumberInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/number.kt index a49c7920538..733f470d72c 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/NumberInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/number.kt @@ -26,7 +26,7 @@ object ByteOrderInstanceImplicits { fun instance(): Order = ByteOrderInstance } -object ByteEqInstance: Eq { +object ByteEqInstance : Eq { override fun eqv(a: Byte, b: Byte): Boolean = a == b } @@ -56,7 +56,7 @@ object DoubleOrderInstanceImplicits { fun instance(): Order = DoubleOrderInstance } -object DoubleEqInstance: Eq { +object DoubleEqInstance : Eq { override fun eqv(a: Double, b: Double): Boolean = a == b } @@ -78,7 +78,7 @@ object IntSemigroupInstanceImplicits { fun instance(): Semigroup = SGInt } -object IntEqInstance: Eq { +object IntEqInstance : Eq { override fun eqv(a: Int, b: Int): Boolean = a == b } @@ -116,7 +116,7 @@ object LongOrderInstanceImplicits { fun instance(): Order = LongOrderInstance } -object LongEqInstance: Eq { +object LongEqInstance : Eq { override fun eqv(a: Long, b: Long): Boolean = a == b } @@ -146,7 +146,7 @@ object ShortOrderInstanceImplicits { fun instance(): Order = ShortOrderInstance } -object ShortEqInstance: Eq { +object ShortEqInstance : Eq { override fun eqv(a: Short, b: Short): Boolean = a == b } @@ -176,7 +176,7 @@ object FloatOrderInstanceImplicits { fun instance(): Order = FloatOrderInstance } -object FloatEqInstance: Eq { +object FloatEqInstance : Eq { override fun eqv(a: Float, b: Float): Boolean = a == b } diff --git a/arrow-data/src/main/kotlin/arrow/instances/NumberInstancesJava.kt b/arrow-instances/src/main/kotlin/arrow/instances/number_java.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/NumberInstancesJava.kt rename to arrow-instances/src/main/kotlin/arrow/instances/number_java.kt index 62799e8a834..6f7a9d66592 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/NumberInstancesJava.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/number_java.kt @@ -1,4 +1,4 @@ -package java_lang +package arrow import arrow.* diff --git a/arrow-instances/src/main/kotlin/arrow/instances/option.kt b/arrow-instances/src/main/kotlin/arrow/instances/option.kt new file mode 100644 index 00000000000..2e5c4a852ae --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/option.kt @@ -0,0 +1,229 @@ +package arrow + +@instance(Option::class) +interface OptionSemigroupInstance : Semigroup> { + + fun SG(): Semigroup + + override fun combine(a: Option, b: Option): Option = + when (a) { + is Some -> when (b) { + is Some -> Some(SG().combine(a.t, b.t)) + is None -> b + } + is None -> a + } +} + +@instance(Option::class) +interface OptionMonoidInstance : OptionSemigroupInstance, Monoid> { + override fun empty(): Option = None +} + +@instance(Option::class) +interface OptionMonadErrorInstance : OptionMonadInstance, MonadError { + override fun raiseError(e: Unit): Option = None + + override fun handleErrorWith(fa: OptionKind, f: (Unit) -> OptionKind): Option = fa.ev().orElse({ f(Unit).ev() }) +} + +@instance(Option::class) +interface OptionEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: Option, b: Option): Boolean = when (a) { + is Some -> when (b) { + is None -> false + is Some -> EQ().eqv(a.t, b.t) + } + is None -> when (b) { + is None -> true + is Some -> false + } + } + +} + +interface OptionFunctorInstance : arrow.Functor { + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) +} + +object OptionFunctorInstanceImplicits { + fun instance(): OptionFunctorInstance = arrow.Option.Companion.functor() +} + +fun arrow.Option.Companion.functor(): OptionFunctorInstance = + object : OptionFunctorInstance, arrow.Functor {} + +interface OptionApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.OptionKind, ff: arrow.OptionKind>): arrow.Option = + fa.ev().ap(ff) + + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) + + override fun pure(a: A): arrow.Option = + arrow.Option.pure(a) +} + +object OptionApplicativeInstanceImplicits { + fun instance(): OptionApplicativeInstance = arrow.Option.Companion.applicative() +} + +fun arrow.Option.Companion.applicative(): OptionApplicativeInstance = + object : OptionApplicativeInstance, arrow.Applicative {} + +interface OptionMonadInstance : arrow.Monad { + override fun ap(fa: arrow.OptionKind, ff: arrow.OptionKind>): arrow.Option = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.OptionKind, f: kotlin.Function1>): arrow.Option = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Option = + arrow.Option.tailRecM(a, f) + + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) + + override fun pure(a: A): arrow.Option = + arrow.Option.pure(a) +} + +object OptionMonadInstanceImplicits { + fun instance(): OptionMonadInstance = arrow.Option.Companion.monad() +} + +fun arrow.Option.Companion.monad(): OptionMonadInstance = + object : OptionMonadInstance, arrow.Monad {} + +interface OptionFoldableInstance : arrow.Foldable { + override fun exists(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().exists(p) + + override fun foldLeft(fa: arrow.OptionKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.OptionKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun forall(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().forall(p) + + override fun isEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().isEmpty() + + override fun nonEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().nonEmpty() +} + +object OptionFoldableInstanceImplicits { + fun instance(): OptionFoldableInstance = arrow.Option.Companion.foldable() +} + +fun arrow.Option.Companion.foldable(): OptionFoldableInstance = + object : OptionFoldableInstance, arrow.Foldable {} + +interface OptionTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) + + override fun traverse(fa: arrow.OptionKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun exists(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().exists(p) + + override fun foldLeft(fa: arrow.OptionKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.OptionKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun forall(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().forall(p) + + override fun isEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().isEmpty() + + override fun nonEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().nonEmpty() +} + +object OptionTraverseInstanceImplicits { + fun instance(): OptionTraverseInstance = arrow.Option.Companion.traverse() +} + +fun arrow.Option.Companion.traverse(): OptionTraverseInstance = + object : OptionTraverseInstance, arrow.Traverse {} + +interface OptionTraverseFilterInstance : arrow.TraverseFilter { + override fun filter(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().filter(f) + + override fun traverseFilter(fa: arrow.OptionKind, f: kotlin.Function1>>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverseFilter(f, GA) + + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) + + override fun traverse(fa: arrow.OptionKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun exists(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().exists(p) + + override fun foldLeft(fa: arrow.OptionKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.OptionKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun forall(fa: arrow.OptionKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().forall(p) + + override fun isEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().isEmpty() + + override fun nonEmpty(fa: arrow.OptionKind): kotlin.Boolean = + fa.ev().nonEmpty() +} + +object OptionTraverseFilterInstanceImplicits { + fun instance(): OptionTraverseFilterInstance = arrow.Option.Companion.traverseFilter() +} + +fun arrow.Option.Companion.traverseFilter(): OptionTraverseFilterInstance = + object : OptionTraverseFilterInstance, arrow.TraverseFilter {} + +interface OptionMonadFilterInstance : arrow.MonadFilter { + override fun empty(): arrow.Option = + arrow.Option.empty() + + override fun ap(fa: arrow.OptionKind, ff: arrow.OptionKind>): arrow.Option = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.OptionKind, f: kotlin.Function1>): arrow.Option = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Option = + arrow.Option.tailRecM(a, f) + + override fun map(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().map(f) + + override fun pure(a: A): arrow.Option = + arrow.Option.pure(a) + + override fun filter(fa: arrow.OptionKind, f: kotlin.Function1): arrow.Option = + fa.ev().filter(f) +} + +object OptionMonadFilterInstanceImplicits { + fun instance(): OptionMonadFilterInstance = arrow.Option.Companion.monadFilter() +} + +fun arrow.Option.Companion.monadFilter(): OptionMonadFilterInstance = + object : OptionMonadFilterInstance, arrow.MonadFilter {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/OptionTInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/optiont.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/OptionTInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/optiont.kt index bc4e8dea442..1b633077843 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/OptionTInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/optiont.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + @instance(OptionT::class) interface OptionTFunctorInstance : Functor> { diff --git a/arrow-instances/src/main/kotlin/arrow/instances/sequence.kt b/arrow-instances/src/main/kotlin/arrow/instances/sequence.kt new file mode 100644 index 00000000000..1821cb7faef --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/sequence.kt @@ -0,0 +1,148 @@ +package arrow + +@instance(SequenceKW::class) +interface SequenceKWSemigroupInstance : Semigroup> { + override fun combine(a: SequenceKW, b: SequenceKW): SequenceKW = (a + b).k() +} + +@instance(SequenceKW::class) +interface SequenceKWMonoidInstance : Monoid> { + override fun combine(a: SequenceKW, b: SequenceKW): SequenceKW = (a + b).k() + + override fun empty(): SequenceKW = emptySequence().k() +} + +@instance(SequenceKW::class) +interface SequenceKWEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: SequenceKW, b: SequenceKW): Boolean = + a.zip(b) { aa, bb -> EQ().eqv(aa, bb) }.fold(true) { acc, bool -> + acc && bool + } + +} + +interface SequenceKWFunctorInstance : arrow.Functor { + override fun map(fa: arrow.SequenceKWKind, f: kotlin.Function1): arrow.SequenceKW = + fa.ev().map(f) +} + +object SequenceKWFunctorInstanceImplicits { + fun instance(): SequenceKWFunctorInstance = arrow.SequenceKW.Companion.functor() +} + +fun arrow.SequenceKW.Companion.functor(): SequenceKWFunctorInstance = + object : SequenceKWFunctorInstance, arrow.Functor {} + +interface SequenceKWApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.SequenceKWKind, ff: arrow.SequenceKWKind>): arrow.SequenceKW = + fa.ev().ap(ff) + + override fun map(fa: arrow.SequenceKWKind, f: kotlin.Function1): arrow.SequenceKW = + fa.ev().map(f) + + override fun map2(fa: arrow.SequenceKWKind, fb: arrow.SequenceKWKind, f: kotlin.Function1, Z>): arrow.SequenceKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.SequenceKW = + arrow.SequenceKW.pure(a) +} + +object SequenceKWApplicativeInstanceImplicits { + fun instance(): SequenceKWApplicativeInstance = arrow.SequenceKW.Companion.applicative() +} + +fun arrow.SequenceKW.Companion.applicative(): SequenceKWApplicativeInstance = + object : SequenceKWApplicativeInstance, arrow.Applicative {} + +interface SequenceKWMonadInstance : arrow.Monad { + override fun ap(fa: arrow.SequenceKWKind, ff: arrow.SequenceKWKind>): arrow.SequenceKW = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.SequenceKWKind, f: kotlin.Function1>): arrow.SequenceKW = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.SequenceKW = + arrow.SequenceKW.tailRecM(a, f) + + override fun map(fa: arrow.SequenceKWKind, f: kotlin.Function1): arrow.SequenceKW = + fa.ev().map(f) + + override fun map2(fa: arrow.SequenceKWKind, fb: arrow.SequenceKWKind, f: kotlin.Function1, Z>): arrow.SequenceKW = + fa.ev().map2(fb, f) + + override fun pure(a: A): arrow.SequenceKW = + arrow.SequenceKW.pure(a) +} + +object SequenceKWMonadInstanceImplicits { + fun instance(): SequenceKWMonadInstance = arrow.SequenceKW.Companion.monad() +} + +fun arrow.SequenceKW.Companion.monad(): SequenceKWMonadInstance = + object : SequenceKWMonadInstance, arrow.Monad {} + +interface SequenceKWFoldableInstance : arrow.Foldable { + override fun foldLeft(fa: arrow.SequenceKWKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.SequenceKWKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object SequenceKWFoldableInstanceImplicits { + fun instance(): SequenceKWFoldableInstance = arrow.SequenceKW.Companion.foldable() +} + +fun arrow.SequenceKW.Companion.foldable(): SequenceKWFoldableInstance = + object : SequenceKWFoldableInstance, arrow.Foldable {} + +interface SequenceKWTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.SequenceKWKind, f: kotlin.Function1): arrow.SequenceKW = + fa.ev().map(f) + + override fun traverse(fa: arrow.SequenceKWKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun foldLeft(fa: arrow.SequenceKWKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.SequenceKWKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object SequenceKWTraverseInstanceImplicits { + fun instance(): SequenceKWTraverseInstance = arrow.SequenceKW.Companion.traverse() +} + +fun arrow.SequenceKW.Companion.traverse(): SequenceKWTraverseInstance = + object : SequenceKWTraverseInstance, arrow.Traverse {} + +interface SequenceKWSemigroupKInstance : arrow.SemigroupK { + override fun combineK(x: arrow.SequenceKWKind, y: arrow.SequenceKWKind): arrow.SequenceKW = + x.ev().combineK(y) +} + +object SequenceKWSemigroupKInstanceImplicits { + fun instance(): SequenceKWSemigroupKInstance = arrow.SequenceKW.Companion.semigroupK() +} + +fun arrow.SequenceKW.Companion.semigroupK(): SequenceKWSemigroupKInstance = + object : SequenceKWSemigroupKInstance, arrow.SemigroupK {} + +interface SequenceKWMonoidKInstance : arrow.MonoidK { + override fun empty(): arrow.SequenceKW = + arrow.SequenceKW.empty() + + override fun combineK(x: arrow.SequenceKWKind, y: arrow.SequenceKWKind): arrow.SequenceKW = + x.ev().combineK(y) +} + +object SequenceKWMonoidKInstanceImplicits { + fun instance(): SequenceKWMonoidKInstance = arrow.SequenceKW.Companion.monoidK() +} + +fun arrow.SequenceKW.Companion.monoidK(): SequenceKWMonoidKInstance = + object : SequenceKWMonoidKInstance, arrow.MonoidK {} diff --git a/arrow-instances/src/main/kotlin/arrow/instances/set.kt b/arrow-instances/src/main/kotlin/arrow/instances/set.kt new file mode 100644 index 00000000000..243a5314aba --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/set.kt @@ -0,0 +1,71 @@ +package arrow + +@instance(SetKW::class) +interface SetKWSemigroupInstance : Semigroup> { + override fun combine(a: SetKW, b: SetKW): SetKW = (a + b).k() +} + +@instance(SetKW::class) +interface SetKWMonoidInstance : SetKWSemigroupInstance, Monoid> { + override fun empty(): SetKW = emptySet().k() +} + +@instance(SetKW::class) +interface SetKWEqInstance : Eq> { + + fun EQ(): Eq + + override fun eqv(a: SetKW, b: SetKW): Boolean = + if (a.size == b.size) a.set.map { aa -> + b.find { bb -> EQ().eqv(aa, bb) }.nonEmpty() + }.fold(true) { acc, bool -> + acc && bool + } + else false + +} + +interface SetKWFoldableInstance : arrow.Foldable { + override fun foldLeft(fa: arrow.SetKWKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.SetKWKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) + + override fun isEmpty(fa: arrow.SetKWKind): kotlin.Boolean = + fa.ev().isEmpty() +} + +object SetKWFoldableInstanceImplicits { + fun instance(): SetKWFoldableInstance = arrow.SetKW.Companion.foldable() +} + +fun arrow.SetKW.Companion.foldable(): SetKWFoldableInstance = + object : SetKWFoldableInstance, arrow.Foldable {} + +interface SetKWSemigroupKInstance : arrow.SemigroupK { + override fun combineK(x: arrow.SetKWKind, y: arrow.SetKWKind): arrow.SetKW = + x.ev().combineK(y) +} + +object SetKWSemigroupKInstanceImplicits { + fun instance(): SetKWSemigroupKInstance = arrow.SetKW.Companion.semigroupK() +} + +fun arrow.SetKW.Companion.semigroupK(): SetKWSemigroupKInstance = + object : SetKWSemigroupKInstance, arrow.SemigroupK {} + +interface SetKWMonoidKInstance : arrow.MonoidK { + override fun empty(): arrow.SetKW = + arrow.SetKW.empty() + + override fun combineK(x: arrow.SetKWKind, y: arrow.SetKWKind): arrow.SetKW = + x.ev().combineK(y) +} + +object SetKWMonoidKInstanceImplicits { + fun instance(): SetKWMonoidKInstance = arrow.SetKW.Companion.monoidK() +} + +fun arrow.SetKW.Companion.monoidK(): SetKWMonoidKInstance = + object : SetKWMonoidKInstance, arrow.MonoidK {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/SortedMapKWInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/sortedmap.kt similarity index 57% rename from arrow-data/src/main/kotlin/arrow/instances/SortedMapKWInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/sortedmap.kt index 4d271a96b0f..dbf8bd1d6c6 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/SortedMapKWInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/sortedmap.kt @@ -1,13 +1,15 @@ package arrow +import arrow.* + @instance(SortedMapKW::class) -interface SortedMapKWFunctorInstance> : Functor> { +interface SortedMapKWFunctorInstance> : Functor> { override fun map(fb: HK, B>, f: (B) -> C): SortedMapKW = fb.ev().map(f) } @instance(SortedMapKW::class) -interface SortedMapKWFoldableInstance> : Foldable> { +interface SortedMapKWFoldableInstance> : Foldable> { override fun foldLeft(fb: HK, B>, c: C, f: (C, B) -> C): C = fb.ev().foldLeft(c, f) @@ -16,23 +18,23 @@ interface SortedMapKWFoldableInstance> : Foldable> : SortedMapKWFoldableInstance, Traverse> { +interface SortedMapKWTraverseInstance> : SortedMapKWFoldableInstance, Traverse> { override fun traverse(fb: HK, B>, f: (B) -> HK, GA: Applicative): HK, C>> = fb.ev().traverse(f, GA) } @instance(SortedMapKW::class) -interface SortedMapKWSemigroupInstance, B> : Semigroup> { +interface SortedMapKWSemigroupInstance, B> : Semigroup> { fun SG(): Semigroup override fun combine(a: SortedMapKWKind, b: SortedMapKWKind): SortedMapKWKind = - if (a.ev().size < b.ev().size) a.ev().foldLeft (b.ev(), { my, (k, b) -> + if (a.ev().size < b.ev().size) a.ev().foldLeft(b.ev(), { my, (k, b) -> my.updated(k, SG().maybeCombine(b, my[k])) }) - else b.ev().foldLeft (a.ev(), { my: SortedMapKW, (k, a) -> my.updated(k, SG().maybeCombine(a, my[k])) }) + else b.ev().foldLeft(a.ev(), { my: SortedMapKW, (k, a) -> my.updated(k, SG().maybeCombine(a, my[k])) }) } @instance(SortedMapKW::class) -interface SortedMapKWMonoidInstance, B> : SortedMapKWSemigroupInstance, Monoid> { +interface SortedMapKWMonoidInstance, B> : SortedMapKWSemigroupInstance, Monoid> { override fun empty(): SortedMapKW = sortedMapOf().k() } diff --git a/arrow-data/src/main/kotlin/arrow/instances/StateTInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/statet.kt similarity index 83% rename from arrow-data/src/main/kotlin/arrow/instances/StateTInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/statet.kt index cbc547d5aa5..17022c67ad2 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/StateTInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/statet.kt @@ -1,5 +1,10 @@ package arrow +import arrow.Either +import arrow.HK +import arrow.StateT +import arrow.instance + @instance(StateT::class) interface StateTFunctorInstance : Functor> { @@ -85,3 +90,18 @@ interface StateTMonadErrorInstance : StateTMonadInstance, MonadEr StateT(FF().pure({ s -> FF().handleErrorWith(fa.runM(FF(), s), { e -> f(e).runM(FF(), s) }) })) } +/** + * Alias for[StateT.Companion.applicative] + */ +fun StateApi.applicative(): Applicative> = StateT.applicative(arrow.monad(), dummy = Unit) + +/** + * Alias for [StateT.Companion.functor] + */ +fun StateApi.functor(): Functor> = StateT.functor(arrow.functor(), dummy = Unit) + +/** + * Alias for [StateT.Companion.monad] + */ +fun StateApi.monad(): Monad> = StateT.monad(arrow.monad(), dummy = Unit) + diff --git a/arrow-data/src/main/kotlin/arrow/instances/StringInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/string.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/instances/StringInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/string.kt diff --git a/arrow-data/src/main/kotlin/arrow/instances/StringInstancesJava.kt b/arrow-instances/src/main/kotlin/arrow/instances/string_java.kt similarity index 90% rename from arrow-data/src/main/kotlin/arrow/instances/StringInstancesJava.kt rename to arrow-instances/src/main/kotlin/arrow/instances/string_java.kt index 1f1438ebfc2..4f620db1844 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/StringInstancesJava.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/string_java.kt @@ -1,6 +1,4 @@ -package java_lang - -import arrow.* +package arrow object StringMonoidInstanceImplicits { fun instance(): StringMonoidInstance = StringMonoidInstance diff --git a/arrow-instances/src/main/kotlin/arrow/instances/try.kt b/arrow-instances/src/main/kotlin/arrow/instances/try.kt new file mode 100644 index 00000000000..8e6be36f8d2 --- /dev/null +++ b/arrow-instances/src/main/kotlin/arrow/instances/try.kt @@ -0,0 +1,125 @@ +package arrow + +@instance(Try::class) +interface TryMonadErrorInstance : TryMonadInstance, MonadError { + + override fun raiseError(e: Throwable): Try = Failure(e) + + override fun handleErrorWith(fa: TryKind, f: (Throwable) -> TryKind): Try = fa.ev().recoverWith { f(it).ev() } + +} + +@instance(Try::class) +interface TryEqInstance : Eq> { + + fun EQA(): Eq + + override fun eqv(a: Try, b: Try): Boolean = when (a) { + is Success -> when (b) { + is Failure -> false + is Success -> EQA().eqv(a.value, b.value) + } + is Failure -> when (b) { + //currently not supported by implicit resolution to have implicit that does not occur in type params + is Failure -> a.exception == b.exception + is Success -> false + } + } + +} + +interface TryFunctorInstance : arrow.Functor { + override fun map(fa: arrow.TryKind, f: kotlin.Function1): arrow.Try = + fa.ev().map(f) +} + +object TryFunctorInstanceImplicits { + fun instance(): TryFunctorInstance = arrow.Try.Companion.functor() +} + +fun arrow.Try.Companion.functor(): TryFunctorInstance = + object : TryFunctorInstance, arrow.Functor {} + +interface TryApplicativeInstance : arrow.Applicative { + override fun ap(fa: arrow.TryKind, ff: arrow.TryKind>): arrow.Try = + fa.ev().ap(ff) + + override fun map(fa: arrow.TryKind, f: kotlin.Function1): arrow.Try = + fa.ev().map(f) + + override fun pure(a: A): arrow.Try = + arrow.Try.pure(a) +} + +object TryApplicativeInstanceImplicits { + fun instance(): TryApplicativeInstance = arrow.Try.Companion.applicative() +} + +fun arrow.Try.Companion.applicative(): TryApplicativeInstance = + object : TryApplicativeInstance, arrow.Applicative {} + +interface TryMonadInstance : arrow.Monad { + override fun ap(fa: arrow.TryKind, ff: arrow.TryKind>): arrow.Try = + fa.ev().ap(ff) + + override fun flatMap(fa: arrow.TryKind, f: kotlin.Function1>): arrow.Try = + fa.ev().flatMap(f) + + override fun tailRecM(a: A, f: kotlin.Function1>>): arrow.Try = + arrow.Try.tailRecM(a, f) + + override fun map(fa: arrow.TryKind, f: kotlin.Function1): arrow.Try = + fa.ev().map(f) + + override fun pure(a: A): arrow.Try = + arrow.Try.pure(a) +} + +object TryMonadInstanceImplicits { + fun instance(): TryMonadInstance = arrow.Try.Companion.monad() +} + +fun arrow.Try.Companion.monad(): TryMonadInstance = + object : TryMonadInstance, arrow.Monad {} + +interface TryFoldableInstance : arrow.Foldable { + override fun exists(fa: arrow.TryKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().exists(p) + + override fun foldLeft(fa: arrow.TryKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.TryKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object TryFoldableInstanceImplicits { + fun instance(): TryFoldableInstance = arrow.Try.Companion.foldable() +} + +fun arrow.Try.Companion.foldable(): TryFoldableInstance = + object : TryFoldableInstance, arrow.Foldable {} + +interface TryTraverseInstance : arrow.Traverse { + override fun map(fa: arrow.TryKind, f: kotlin.Function1): arrow.Try = + fa.ev().map(f) + + override fun traverse(fa: arrow.TryKind, f: kotlin.Function1>, GA: arrow.Applicative): arrow.HK> = + fa.ev().traverse(f, GA) + + override fun exists(fa: arrow.TryKind, p: kotlin.Function1): kotlin.Boolean = + fa.ev().exists(p) + + override fun foldLeft(fa: arrow.TryKind, b: B, f: kotlin.Function2): B = + fa.ev().foldLeft(b, f) + + override fun foldRight(fa: arrow.TryKind, lb: arrow.Eval, f: kotlin.Function2, arrow.Eval>): arrow.Eval = + fa.ev().foldRight(lb, f) +} + +object TryTraverseInstanceImplicits { + fun instance(): TryTraverseInstance = arrow.Try.Companion.traverse() +} + +fun arrow.Try.Companion.traverse(): TryTraverseInstance = + object : TryTraverseInstance, arrow.Traverse {} diff --git a/arrow-data/src/main/kotlin/arrow/instances/TupleInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/tuple.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/TupleInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/tuple.kt index 91eac9c9fb9..e0c17995ed2 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/TupleInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/tuple.kt @@ -1,5 +1,7 @@ package arrow +import arrow.instance + @instance(Tuple2::class) interface Tuple2MonoidInstance : Monoid> { diff --git a/arrow-data/src/main/kotlin/arrow/instances/UnitInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/unit.kt similarity index 77% rename from arrow-data/src/main/kotlin/arrow/instances/UnitInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/unit.kt index 107dce83b05..4022c8175b5 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/UnitInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/unit.kt @@ -1,10 +1,10 @@ -package kotlin_ +package arrow import arrow.Eq import arrow.Monoid import arrow.Semigroup -object UnitSemigroupInstance: Semigroup { +object UnitSemigroupInstance : Semigroup { override fun combine(a: Unit, b: Unit) = Unit } @@ -12,7 +12,7 @@ object UnitSemigroupInstanceImplicits { fun instance(): Semigroup = UnitSemigroupInstance } -object UnitMonoidInstance: Monoid, Semigroup by UnitSemigroupInstance { +object UnitMonoidInstance : Monoid, Semigroup by UnitSemigroupInstance { override fun empty() = Unit } diff --git a/arrow-data/src/main/kotlin/arrow/instances/ValidatedInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/validated.kt similarity index 99% rename from arrow-data/src/main/kotlin/arrow/instances/ValidatedInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/validated.kt index 9b6e5307489..330f52575cd 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/ValidatedInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/validated.kt @@ -1,5 +1,7 @@ package arrow +import arrow.* + @instance(Validated::class) interface ValidatedFunctorInstance : Functor> { override fun map(fa: ValidatedKind, f: (A) -> B): Validated = fa.ev().map(f) diff --git a/arrow-data/src/main/kotlin/arrow/instances/WriterTInstances.kt b/arrow-instances/src/main/kotlin/arrow/instances/writert.kt similarity index 97% rename from arrow-data/src/main/kotlin/arrow/instances/WriterTInstances.kt rename to arrow-instances/src/main/kotlin/arrow/instances/writert.kt index aed91a555cd..3e5c00c013b 100644 --- a/arrow-data/src/main/kotlin/arrow/instances/WriterTInstances.kt +++ b/arrow-instances/src/main/kotlin/arrow/instances/writert.kt @@ -1,5 +1,10 @@ package arrow +import arrow.Either +import arrow.HK +import arrow.WriterT +import arrow.instance + @instance(WriterT::class) interface WriterTFunctorInstance : Functor> { fun FF(): Functor diff --git a/arrow-mtl/build.gradle b/arrow-mtl/build.gradle new file mode 100644 index 00000000000..1e966a3be94 --- /dev/null +++ b/arrow-mtl/build.gradle @@ -0,0 +1,16 @@ +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" + compile project(':arrow-annotations') + compile project(':arrow-instances') + kapt project(':arrow-annotations-processor') + kaptTest project(':arrow-annotations-processor') + compileOnly project(':arrow-annotations-processor') + testCompileOnly project(':arrow-annotations-processor') + testCompile "io.kotlintest:kotlintest:$kotlinTestVersion" + testCompile project(':arrow-syntax') + testCompile project(':arrow-test') +} + +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') +apply from: rootProject.file('gradle/generated-kotlin-sources.gradle') +apply plugin: 'kotlin-kapt' diff --git a/arrow-mtl/gradle.properties b/arrow-mtl/gradle.properties new file mode 100644 index 00000000000..d336f4108ce --- /dev/null +++ b/arrow-mtl/gradle.properties @@ -0,0 +1,4 @@ +# Maven publishing configuration +POM_NAME=Arrow MTL Type Classes +POM_ARTIFACT_ID=arrow-mtl +POM_PACKAGING=jar diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/FunctorFilter.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/FunctorFilter.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/FunctorFilter.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/FunctorFilter.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadCombine.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadCombine.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadCombine.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadCombine.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadFilter.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadFilter.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadFilter.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadFilter.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadFilterContinuation.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadFilterContinuation.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadFilterContinuation.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadFilterContinuation.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadReader.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadReader.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadReader.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadReader.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadState.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadState.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadState.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadState.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadWriter.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/MonadWriter.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadWriter.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/MonadWriter.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/TraverseFilter.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/TraverseFilter.kt similarity index 86% rename from arrow-data/src/main/kotlin/arrow/typeclasses/TraverseFilter.kt rename to arrow-mtl/src/main/kotlin/arrow/mtl/TraverseFilter.kt index 15602d962bd..cb96145c503 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/TraverseFilter.kt +++ b/arrow-mtl/src/main/kotlin/arrow/mtl/TraverseFilter.kt @@ -16,6 +16,9 @@ interface TraverseFilter : Traverse, FunctorFilter, Typeclass { override fun filter(fa: HK, f: (A) -> Boolean): HK = filterA(fa, { Id(f(it)) }, Id.applicative()).value() + override fun map(fa: HK, f: (A) -> B): HK { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } } inline fun HK.traverseFilter( diff --git a/arrow-mtl/src/main/kotlin/arrow/mtl/instances/composed.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/instances/composed.kt new file mode 100644 index 00000000000..060d86615c3 --- /dev/null +++ b/arrow-mtl/src/main/kotlin/arrow/mtl/instances/composed.kt @@ -0,0 +1,44 @@ +package arrow.mtl.instances + +import arrow.* +import arrow.instances.* + +interface ComposedTraverseFilter : + TraverseFilter>, + ComposedTraverse { + + override fun FT(): Traverse + + override fun GT(): TraverseFilter + + override fun GA(): Applicative + + override fun traverseFilter(fa: HK, A>, f: (A) -> HK>, HA: Applicative): HK, B>> = + HA.map(FT().traverse(fa.unnest(), { ga -> GT().traverseFilter(ga, f, HA) }, HA), { it.nest() }) + + fun traverseFilterC(fa: HK>, f: (A) -> HK>, HA: Applicative): HK, B>> = + traverseFilter(fa.nest(), f, HA) + + companion object { + operator fun invoke( + FF: Traverse, + GF: TraverseFilter, + GA: Applicative): ComposedTraverseFilter = + object : ComposedTraverseFilter { + override fun FT(): Traverse = FF + + override fun GT(): TraverseFilter = GF + + override fun GA(): Applicative = GA + } + } +} + +inline fun TraverseFilter.compose(GT: TraverseFilter = traverseFilter(), GA: Applicative = applicative()): + TraverseFilter> = object : ComposedTraverseFilter { + override fun FT(): Traverse = this@compose + + override fun GT(): TraverseFilter = GT + + override fun GA(): Applicative = GA +} \ No newline at end of file diff --git a/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/optiont.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/optiont.kt new file mode 100644 index 00000000000..e4d16733e1e --- /dev/null +++ b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/optiont.kt @@ -0,0 +1,9 @@ +package arrow.mtl.syntax + +import arrow.* +import arrow.mtl.instances.ComposedTraverseFilter + +fun OptionT.traverseFilter(f: (A) -> HK>, GA: Applicative, FF: Traverse): HK> { + val fa = ComposedTraverseFilter(FF, Option.traverseFilter(), Option.applicative()).traverseFilterC(value, f, GA) + return GA.map(fa, { OptionT(FF.map(it.unnest(), { it.ev() })) }) +} \ No newline at end of file diff --git a/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/reader.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/reader.kt new file mode 100644 index 00000000000..279d54d2503 --- /dev/null +++ b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/reader.kt @@ -0,0 +1,5 @@ +package arrow.mtl.syntax + +import arrow.* + +inline fun ReaderApi.monadReader(): MonadReader, D> = arrow.monadReader() \ No newline at end of file diff --git a/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/readert.kt b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/readert.kt new file mode 100644 index 00000000000..566c67afdd1 --- /dev/null +++ b/arrow-mtl/src/main/kotlin/arrow/mtl/syntax/readert.kt @@ -0,0 +1,2 @@ +package arrow.mtl.syntax + diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Fold.kt b/arrow-optics/src/main/kotlin/arrow/optics/Fold.kt index 50e2fb212d0..d91493653cd 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Fold.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Fold.kt @@ -1,6 +1,7 @@ package arrow.optics import arrow.* +import identity /** * A [Fold] is an optic that allows to focus into structure and get multiple results. diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Getter.kt b/arrow-optics/src/main/kotlin/arrow/optics/Getter.kt index 530ec8b8004..2387c2b8a60 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Getter.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Getter.kt @@ -1,6 +1,8 @@ package arrow.optics import arrow.* +import compose +import identity /** * A [Getter] is an optic that allows to see into a structure and getting a focus. diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Iso.kt b/arrow-optics/src/main/kotlin/arrow/optics/Iso.kt index b315852f82a..4f6b69706ea 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Iso.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Iso.kt @@ -1,6 +1,8 @@ package arrow.optics import arrow.* +import compose +import identity /** * [Iso] is a type alias for [PIso] which fixes the type arguments diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Lens.kt b/arrow-optics/src/main/kotlin/arrow/optics/Lens.kt index d6a133e7f54..66b997ce83d 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Lens.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Lens.kt @@ -1,6 +1,7 @@ package arrow.optics import arrow.* +import identity /** * [Lens] is a type alias for [PLens] which fixes the type arguments diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Optional.kt b/arrow-optics/src/main/kotlin/arrow/optics/Optional.kt index d03c7a853f6..17b7e12f705 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Optional.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Optional.kt @@ -1,6 +1,7 @@ package arrow.optics import arrow.* +import identity /** * [Optional] is a type alias for [POptional] which fixes the type arguments diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Prism.kt b/arrow-optics/src/main/kotlin/arrow/optics/Prism.kt index 72b513e83cd..4684dd54b6e 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Prism.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Prism.kt @@ -1,6 +1,8 @@ package arrow.optics import arrow.* +import compose +import identity /** * [Prism] is a type alias for [PPrism] which fixes the type arguments diff --git a/arrow-optics/src/main/kotlin/arrow/optics/Traversal.kt b/arrow-optics/src/main/kotlin/arrow/optics/Traversal.kt index 152febcc144..930f191ed05 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/Traversal.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/Traversal.kt @@ -1,6 +1,7 @@ package arrow.optics import arrow.* +import identity /** * [Traversal] is a type alias for [PTraversal] which fixes the type arguments diff --git a/arrow-optics/src/main/kotlin/arrow/optics/instances/OptionInstances.kt b/arrow-optics/src/main/kotlin/arrow/optics/instances/OptionInstances.kt index ec8236b23a7..1ae1205f1cb 100644 --- a/arrow-optics/src/main/kotlin/arrow/optics/instances/OptionInstances.kt +++ b/arrow-optics/src/main/kotlin/arrow/optics/instances/OptionInstances.kt @@ -1,6 +1,7 @@ package arrow.optics import arrow.* +import identity /** * [PIso] that defines the equality in the kotlin nullable structure and [arrow.Option] diff --git a/arrow-optics/src/test/kotlin/arrow/optics/TestDomain.kt b/arrow-optics/src/test/kotlin/arrow/optics/TestDomain.kt index c8f89ccc06a..099ed279436 100644 --- a/arrow-optics/src/test/kotlin/arrow/optics/TestDomain.kt +++ b/arrow-optics/src/test/kotlin/arrow/optics/TestDomain.kt @@ -1,7 +1,7 @@ package arrow.optics import io.kotlintest.properties.Gen -import arrow.identity +import identity import arrow.syntax.either.left import arrow.syntax.either.right diff --git a/arrow-syntax/build.gradle b/arrow-syntax/build.gradle index d79f3f92d06..d17bda1efc6 100644 --- a/arrow-syntax/build.gradle +++ b/arrow-syntax/build.gradle @@ -2,6 +2,7 @@ dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" compile project(':arrow-annotations') compile project(':arrow-data') + compile project(':arrow-instances') kapt project(':arrow-annotations-processor') kaptTest project(':arrow-annotations-processor') compileOnly project(':arrow-annotations-processor') diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Applicative.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/applicative/applicative.kt similarity index 70% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Applicative.kt rename to arrow-syntax/src/main/kotlin/arrow/syntax/applicative/applicative.kt index d757799b3b8..17e30c9cdd7 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Applicative.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/applicative/applicative.kt @@ -1,23 +1,6 @@ -@file:Suppress("UNUSED_PARAMETER") +package arrow.syntax.applicative -package arrow - -interface Applicative : Functor, Typeclass { - - fun pure(a: A): HK - - fun ap(fa: HK, ff: HK B>): HK - - fun product(fa: HK, fb: HK): HK> = ap(fb, map(fa) { a: A -> { b: B -> Tuple2(a, b) } }) - - override fun map(fa: HK, f: (A) -> B): HK = ap(fa, pure(f)) - - fun map2(fa: HK, fb: HK, f: (Tuple2) -> Z): HK = map(product(fa, fb), f) - - fun map2Eval(fa: HK, fb: Eval>, f: (Tuple2) -> Z): Eval> = fb.map { fc -> map2(fa, fc, f) } -} - -// Syntax +import arrow.* inline fun A.pure(FT: Applicative = applicative()): HK = FT.pure(this) @@ -29,73 +12,6 @@ inline fun HK.map2(FT: Applicative = applicative() inline fun HK.map2Eval(FT: Applicative = applicative(), fb: Eval>, noinline f: (Tuple2) -> Z): Eval> = FT.map2Eval(this, fb, f) -//Applicative Builder - -data class Tuple2(val a: A, val b: B) { - fun reverse(): Tuple2 = Tuple2(b, a) - companion object -} - -data class Tuple3(val a: A, val b: B, val c: C) { - fun reverse(): Tuple3 = Tuple3(c, b, a) - companion object -} - -data class Tuple4(val a: A, val b: B, val c: C, val d: D) { - fun reverse(): Tuple4 = Tuple4(d, c, b, a) - companion object -} - -data class Tuple5(val a: A, val b: B, val c: C, val d: D, val e: E) { - fun reverse(): Tuple5 = Tuple5(e, d, c, b, a) - companion object -} - -data class Tuple6(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F) { - fun reverse(): Tuple6 = Tuple6(f, e, d, c, b, a) - companion object -} - -data class Tuple7(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G) { - fun reverse(): Tuple7 = Tuple7(g, f, e, d, c, b, a) - companion object -} - -data class Tuple8(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, val h: H) { - fun reverse(): Tuple8 = Tuple8(h, g, f, e, d, c, b, a) - companion object -} - -data class Tuple9(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, - val h: H, val i: I) { - fun reverse(): Tuple9 = Tuple9(i, h, g, f, e, d, c, b, a) - companion object -} - -data class Tuple10(val a: A, val b: B, val c: C, val d: D, val e: E, val f: F, val g: G, - val h: H, val i: I, val j: J) { - fun reverse(): Tuple10 = Tuple10(j, i, h, g, f, e, d, c, b, a) - companion object -} - -infix operator fun Tuple9.plus(j: J): Tuple10 = - Tuple10(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.i, j) - -infix operator fun Tuple8.plus(i: I): Tuple9 = - Tuple9(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, i) - -infix operator fun Tuple7.plus(h: H): Tuple8 = - Tuple8(this.a, this.b, this.c, this.d, this.e, this.f, this.g, h) - -infix operator fun Tuple6.plus(g: G): Tuple7 = - Tuple7(this.a, this.b, this.c, this.d, this.e, this.f, g) - -infix operator fun Tuple5.plus(f: F): Tuple6 = Tuple6(this.a, this.b, this.c, this.d, this.e, f) -infix operator fun Tuple4.plus(e: E): Tuple5 = Tuple5(this.a, this.b, this.c, this.d, e) -infix operator fun Tuple3.plus(d: D): Tuple4 = Tuple4(this.a, this.b, this.c, d) -infix operator fun Tuple2.plus(c: C): Tuple3 = Tuple3(this.a, this.b, c) -infix fun A.toT(b: B): Tuple2 = Tuple2(this, b) - fun HK.product(AP: Applicative, other: HK): HK> = AP.product(this, other) fun HK>.product( @@ -347,6 +263,4 @@ fun Applicative.map( j: HK, lbd: (Tuple10) -> Z): HK = this.map(a.product(this, b).product(this, c).product(this, d).product(this, e).product(this, f) - .product(this, g).product(this, h).product(this, i).product(this, j), lbd) - -inline fun applicative(): Applicative = instance(InstanceParametrizedType(Applicative::class.java, listOf(typeLiteral()))) + .product(this, g).product(this, h).product(this, i).product(this, j), lbd) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/applicativeerror/applicativeerror.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/applicativeerror/applicativeerror.kt new file mode 100644 index 00000000000..f505d512b6b --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/applicativeerror/applicativeerror.kt @@ -0,0 +1,22 @@ +package arrow.syntax.applicativeerror + +import arrow.* + +inline fun A.raiseError(FT: ApplicativeError = applicativeError(), e: E): HK = FT.raiseError(e) + +inline fun HK.handlerErrorWith(FT: ApplicativeError = applicativeError(), noinline f: (E) -> HK): HK = + FT.handleErrorWith(this, f) + +inline fun HK.attempt(FT: ApplicativeError = applicativeError()): HK> = FT.attempt(this) + +inline fun Either.toError(FT: ApplicativeError = applicativeError()): HK = FT.fromEither(this) + +inline fun (() -> A).catch(FT: ApplicativeError = applicativeError()): HK = FT.catch(this) + +fun ApplicativeError.catch(f: () -> A): HK = + try { + pure(f()) + } + catch (e: Throwable) { + raiseError(e) + } \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/iterable.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/iterable.kt index 55d904b5723..2b725a7fbb0 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/iterable.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/iterable.kt @@ -6,4 +6,4 @@ import arrow.Predicate fun Iterable.firstOption(): Option = firstOrNull().toOption() -fun Iterable.firstOption(predicate: Predicate): Option = firstOrNull(predicate).toOption() +fun Iterable.firstOption(predicate: Predicate): Option = firstOrNull(predicate).toOption() \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/list.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/list.kt index 018b7a263bf..0811353f282 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/list.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/list.kt @@ -5,8 +5,8 @@ import arrow.Option import arrow.Some import arrow.State import arrow.map -import arrow.data.Disjunction -import arrow.data.map +import data.Disjunction +import data.map /** * Returns a list containing all elements except the first element diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/map.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/map.kt index 3f2579d51c1..a6a53d07403 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/collections/map.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/collections/map.kt @@ -8,4 +8,4 @@ import arrow.Option val Map.option: GetterOperation> get() { return GetterOperationImpl { k -> this[k].toOption() } - } \ No newline at end of file + } diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/comonad/comonad.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/comonad/comonad.kt new file mode 100644 index 00000000000..ef493ea74bd --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/comonad/comonad.kt @@ -0,0 +1,9 @@ +package arrow.syntax.comonad + +import arrow.* + +inline fun HK.coflatMap(FT: Comonad = comonad(), noinline f: (HK) -> B): HK = FT.coflatMap(this, f) + +inline fun HK.extract(FT: Comonad = comonad()): A = FT.extract(this) + +inline fun HK.duplicate(FT: Comonad = comonad()): HK> = FT.duplicate(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/either/either.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/either/either.kt index ece71475cc3..da37eb2f41d 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/either/either.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/either/either.kt @@ -1,7 +1,10 @@ package arrow.syntax.either -import arrow.Either +import arrow.* fun A.left(): Either = Either.Left(this) -fun A.right(): Either = Either.Right(this) \ No newline at end of file +fun A.right(): Either = Either.Right(this) + +fun Either.traverse(f: (B) -> HK, GA: Applicative): HK> = + this.ev().fold({ GA.pure(Either.Left(it)) }, { GA.map(f(it), { Either.Right(it) }) }) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/eithert/eithert.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/eithert/eithert.kt new file mode 100644 index 00000000000..d086b751df1 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/eithert/eithert.kt @@ -0,0 +1,12 @@ +package arrow.syntax.eithert + +import arrow.* + +fun EitherT.foldLeft(b: C, f: (C, B) -> C, FF: Foldable): C = FF.compose(Either.foldable()).foldLC(value, b, f) + +fun EitherT.foldRight(lb: Eval, f: (B, Eval) -> Eval, FF: Foldable): Eval = FF.compose(Either.foldable()).foldRC(value, lb, f) + +fun EitherT. traverse(f: (B) -> HK, GA: Applicative, FF: Traverse): HK> { + val fa: HK>, C>> = ComposedTraverse(FF, Either.traverse(), Either.monad()).traverseC(value, f, GA) + return GA.map(fa, { EitherT(FF.map(it.unnest(), { it.ev() })) }) +} \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/eq/eq.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/eq/eq.kt new file mode 100644 index 00000000000..f5c04ac6fd0 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/eq/eq.kt @@ -0,0 +1,22 @@ +package arrow.syntax.eq + +import arrow.Eq +import arrow.eq + +/** + * Syntax method for [Eq.eqv]. + * + * @param F [Eq] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Eq.eqv] + */ +inline fun F.eqv(EQ: Eq = eq(), b: F): Boolean = EQ.eqv(this, b) + +/** + * Syntax method for [Eq.neqv]. + * + * @param F [Eq] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Eq.neqv] + */ +inline fun F.neqv(EQ: Eq = eq(), b: F): Boolean = EQ.neqv(this, b) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/eval/eval.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/eval/eval.kt new file mode 100644 index 00000000000..63b406ea4d0 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/eval/eval.kt @@ -0,0 +1,148 @@ +package arrow.syntax.eval + +import arrow.* +import arrow.syntax.applicative.tupled + +fun merge( + op1: () -> A, + op2: () -> B): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5), + Eval.later(op6) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5), + Eval.later(op6), + Eval.later(op7) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5), + Eval.later(op6), + Eval.later(op7), + Eval.later(op8) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H, + op9: () -> I): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5), + Eval.later(op6), + Eval.later(op7), + Eval.later(op8), + Eval.later(op9) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H, + op9: () -> I, + op10: () -> J): Eval> = + Eval.applicative().tupled( + Eval.later(op1), + Eval.later(op2), + Eval.later(op3), + Eval.later(op4), + Eval.later(op5), + Eval.later(op6), + Eval.later(op7), + Eval.later(op8), + Eval.later(op9), + Eval.later(op10) + ).ev() \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/foldable/foldable.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/foldable/foldable.kt new file mode 100644 index 00000000000..f25460d830a --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/foldable/foldable.kt @@ -0,0 +1,30 @@ +package arrow.syntax.foldable + +import arrow.* + +inline fun HK.foldLeft(FT: Foldable = foldable(), b: B, noinline f: (B, A) -> B): B = FT.foldLeft(this, b, f) + +inline fun HK.foldRight(FT: Foldable = foldable(), b: Eval, noinline f: (A, Eval) -> Eval): Eval = FT.foldRight(this, b, f) + +inline fun HK.fold(FT: Foldable = foldable(), MA: Monoid = monoid()): A = FT.fold(MA, this) + +inline fun HK.combineAll(FT: Foldable = foldable(), MA: Monoid = monoid()): A = FT.combineAll(MA, this) + +inline fun HK.foldMap(FT: Foldable = foldable(), MB: Monoid = monoid(), noinline f: (A) -> B): B = + FT.foldMap(MB, this, f) + +inline fun HK.traverse_(FT: Foldable = foldable(), AG: Applicative = applicative(), noinline f: (A) -> HK): + HK = FT.traverse_(AG, this, f) + +inline fun HK>.sequence_(FT: Foldable = foldable(), AG: Applicative = applicative()): + HK = FT.sequence_(AG, this) + +inline fun HK.find(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Option = FT.find(this, f) + +inline fun HK.exists(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Boolean = FT.exists(this, f) + +inline fun HK.forall(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Boolean = FT.forall(this, f) + +inline fun HK.isEmpty(FT: Foldable = foldable()): Boolean = FT.isEmpty(this) + +inline fun HK.nonEmpty(FT: Foldable = foldable()): Boolean = FT.nonEmpty(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/functionk/funktionk.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/functionk/funktionk.kt new file mode 100644 index 00000000000..682920378a5 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/functionk/funktionk.kt @@ -0,0 +1,10 @@ +package arrow.syntax.functionk + +import arrow.* + +fun FunctionK.or(h: FunctionK): FunctionK, G> = + object : FunctionK, G> { + override fun invoke(fa: CoproductKind): HK { + return fa.ev().fold(this@or, h) + } + } \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/functor/functor.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/functor/functor.kt new file mode 100644 index 00000000000..8c5e872a4b9 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/functor/functor.kt @@ -0,0 +1,7 @@ +package arrow.syntax.functor + +import arrow.* + +inline fun HK.map(FT : Functor = functor(), noinline f: (A) -> B): HK = FT.map(this, f) + +inline fun ((A) -> B).lift(FT : Functor = functor()): (HK) -> HK = FT.lift(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/id/id.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/id/id.kt new file mode 100644 index 00000000000..5b0e4240581 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/id/id.kt @@ -0,0 +1,5 @@ +package arrow.syntax.id + +import arrow.* + +fun Id.traverse(f: (A) -> HK, GA: Applicative): HK> = GA.map(f(this.ev().value), { Id(it) }) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/inject/inject.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/inject/inject.kt new file mode 100644 index 00000000000..73c5a6837c1 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/inject/inject.kt @@ -0,0 +1,5 @@ +package arrow.syntax.inject + +import arrow.* + +inline fun HK.inj(FT: Inject = inject()) : HK = FT.invoke(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/monad/monad.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/monad/monad.kt new file mode 100644 index 00000000000..c796b0c87d0 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/monad/monad.kt @@ -0,0 +1,13 @@ +package arrow.syntax.monad + +import arrow.* + +inline fun Monad.mproduct(fa: HK, crossinline f: (A) -> HK): HK> = + flatMap(fa, { a -> map(f(a), { Tuple2(a, it) }) }) + +inline fun Monad.ifM(fa: HK, crossinline ifTrue: () -> HK, crossinline ifFalse: () -> HK): HK = + flatMap(fa, { if (it) ifTrue() else ifFalse() }) + +inline fun HK.flatMap(FT: Monad = monad(), noinline f: (A) -> HK): HK = FT.flatMap(this, f) + +inline fun HK>.flatten(FT: Monad = monad()): HK = FT.flatten(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/monaderror/monaderror.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/monaderror/monaderror.kt new file mode 100644 index 00000000000..e4c137b36f1 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/monaderror/monaderror.kt @@ -0,0 +1,8 @@ +package arrow.syntax.monaderror + +import arrow.* + +inline fun HK.ensure( + FT: MonadError = monadError(), + noinline error: () -> E, + noinline predicate: (A) -> Boolean): HK = FT.ensure(this, error, predicate) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/monoid/monoid.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/monoid/monoid.kt new file mode 100644 index 00000000000..66c980bc260 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/monoid/monoid.kt @@ -0,0 +1,7 @@ +package arrow.syntax.monoid + +import arrow.* + +inline fun A.empty(FT: Monoid = monoid()): A = FT.empty() + +inline fun Collection.combineAll(FT: Monoid = monoid()): A = FT.combineAll(this) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/option/option.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/option/option.kt index 22b880d4be6..4e671ed3ccd 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/option/option.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/option/option.kt @@ -1,7 +1,6 @@ package arrow.syntax.option -import arrow.Option -import arrow.data.Disjunction +import arrow.* import arrow.toEitherLeft import arrow.toEitherRight @@ -9,4 +8,20 @@ import arrow.toEitherRight inline fun Option.toDisjunctionRight(left: () -> X): Disjunction = toEitherRight(left).toDisjunction() @Deprecated("arrow.data.Either is right biased. This method will be removed in future releases") -inline fun Option.toDisjunctionLeft(right: () -> X): Disjunction = toEitherLeft(right).toDisjunction() \ No newline at end of file +inline fun Option.toDisjunctionLeft(right: () -> X): Disjunction = toEitherLeft(right).toDisjunction() + +fun Option.traverse(f: (A) -> HK, GA: Applicative): HK> = + this.ev().let { option -> + when (option) { + is Option.Some -> GA.map(f(option.t), { Option.Some(it) }) + is Option.None -> GA.pure(None) + } + } + +fun Option.traverseFilter(f: (A) -> HK>, GA: Applicative): HK> = + this.ev().let { option -> + when (option) { + is Option.Some -> f(option.t) + is Option.None -> GA.pure(None) + } + } \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/optiont/optiont.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/optiont/optiont.kt new file mode 100644 index 00000000000..f0afd26eeae --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/optiont/optiont.kt @@ -0,0 +1,12 @@ +package arrow.syntax.optiont + +import arrow.* + +fun OptionT.foldLeft(b: B, f: (B, A) -> B, FF: Foldable): B = FF.compose(Option.foldable()).foldLC(value, b, f) + +fun OptionT.foldRight(lb: Eval, f: (A, Eval) -> Eval, FF: Foldable): Eval = FF.compose(Option.foldable()).foldRC(value, lb, f) + +fun OptionT.traverse(f: (A) -> HK, GA: Applicative, FF: Traverse): HK> { + val fa = ComposedTraverse(FF, Option.traverse(), Option.applicative()).traverseC(value, f, GA) + return GA.map(fa, { OptionT(FF.map(it.unnest(), { it.ev() })) }) +} \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/order/order.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/order/order.kt new file mode 100644 index 00000000000..ae08d6c0719 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/order/order.kt @@ -0,0 +1,67 @@ +package arrow.syntax.order + +import arrow.* + +/** + * Syntax method for [Order.compare]. + * + * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Order.compare] + */ +inline fun F.compare(O: Order = order(), b: F): Boolean = O.lt(this, b) + +/** + * Syntax method for [Order.lt]. + * + * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Order.lt] + */ +inline fun F.lt(O: Order = order(), b: F): Boolean = O.lt(this, b) + +/** + * Syntax method for [Order.lte]. + * + * @param O [Order] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Order.lte] + */ +inline fun F.lte(O: Order = order(), b: F): Boolean = O.lte(this, b) + +/** + * Syntax method for [Order.gt]. + * + * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Order.gt] + */ +inline fun F.gt(O: Order = order(), b: F): Boolean = O.gt(this, b) + +/** + * Syntax method for [Order.gte]. + * + * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. + * @param b the object to compare with. + * @see [Order.gt] + */ +inline fun F.gte(O: Order = order(), b: F): Boolean = O.gte(this, b) + +/** + * Get an [Order] instance for a type that implements [Comparable]. + * + * @param F which is constraint in [Comparable] for [F]. + */ +fun > toOrder(): Order = object : Order { + override fun compare(a: F, b: F): Int = a.compareTo(b) +} + +/** + * Returns a list of all elements sorted according to the specified [order]. + * + * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. + * @returns sorted list by [O]. + */ +inline fun Iterable.sorted(O: Order = order()): List = sortedWith(Comparator { o1, o2 -> + O.compare(o1, o2) +}) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/partialfunction/partialfunction.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/partialfunction/partialfunction.kt new file mode 100644 index 00000000000..0b66e83ffcd --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/partialfunction/partialfunction.kt @@ -0,0 +1,12 @@ +package arrow.syntax.partialfunction + +import arrow.PartialFunction +import arrow.Tuple2 + +fun case(ff: Tuple2<(A) -> Boolean, (A) -> B>): PartialFunction = + object : PartialFunction() { + override fun isDefinedAt(a: A): Boolean = ff.a(a) + override fun invoke(a: A): B = ff.b(a) + } + +infix fun ((A) -> Boolean).then(f: (A) -> B): Tuple2<(A) -> Boolean, (A) -> B> = Tuple2(this, f) diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/reducible/reducible.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/reducible/reducible.kt new file mode 100644 index 00000000000..85ca6fd057c --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/reducible/reducible.kt @@ -0,0 +1,8 @@ +package arrow.syntax.reducible + +import arrow.* + +fun Reducible.toNonEmptyList(fa: HK): NonEmptyList = + reduceRightTo(fa, { a -> NonEmptyList.of(a) }, { a, lnel -> + lnel.map { nonEmptyList -> NonEmptyList(a, listOf(nonEmptyList.head) + nonEmptyList.tail) } + }).value() \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/semigroup/semigroup.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/semigroup/semigroup.kt new file mode 100644 index 00000000000..8bebb21697d --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/semigroup/semigroup.kt @@ -0,0 +1,5 @@ +package arrow.syntax.semigroup + +import arrow.* + +inline fun A.combine(b: A, FT: Semigroup = semigroup()): A = FT.combine(this, b) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/traverse/traverse.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/traverse/traverse.kt new file mode 100644 index 00000000000..335013c2218 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/traverse/traverse.kt @@ -0,0 +1,13 @@ +package arrow.syntax.traverse + +import arrow.* + +inline fun HK.traverse( + FT: Traverse = traverse(), + GA: Applicative = applicative(), + noinline f: (A) -> HK): HK> = FT.traverse(this, f, GA) + +inline fun HK.flatTraverse( + FT: Traverse = traverse(), + GA: Applicative = applicative(), + FM: Monad = monad(), noinline f: (A) -> HK>): HK> = GA.map(FT.traverse(this, f, GA), { FM.flatten(it) }) \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/try/try.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/try/try.kt index 0ac082c54c1..f47ef8b3fec 100644 --- a/arrow-syntax/src/main/kotlin/arrow/syntax/try/try.kt +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/try/try.kt @@ -1,13 +1,155 @@ package arrow.syntax.`try` -import arrow.DeprecatedAmbiguity -import arrow.None -import arrow.Option -import arrow.Some +import arrow.* +import arrow.syntax.applicative.tupled @Deprecated(DeprecatedAmbiguity, ReplaceWith("Try { body }.toOption()")) inline fun optionTry(body: () -> T): Option = try { Some(body()) } catch (e: Throwable) { None -} \ No newline at end of file +} + +fun merge( + op1: () -> A, + op2: () -> B): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5), + Try.invoke(op6) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5), + Try.invoke(op6), + Try.invoke(op7) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5), + Try.invoke(op6), + Try.invoke(op7), + Try.invoke(op8) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H, + op9: () -> I): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5), + Try.invoke(op6), + Try.invoke(op7), + Try.invoke(op8), + Try.invoke(op9) + ).ev() + +fun merge( + op1: () -> A, + op2: () -> B, + op3: () -> C, + op4: () -> D, + op5: () -> E, + op6: () -> F, + op7: () -> G, + op8: () -> H, + op9: () -> I, + op10: () -> J): Try> = + Try.applicative().tupled( + Try.invoke(op1), + Try.invoke(op2), + Try.invoke(op3), + Try.invoke(op4), + Try.invoke(op5), + Try.invoke(op6), + Try.invoke(op7), + Try.invoke(op8), + Try.invoke(op9), + Try.invoke(op10) + ).ev() \ No newline at end of file diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/tuples/tuples.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/tuples/tuples.kt new file mode 100644 index 00000000000..8bed79da036 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/tuples/tuples.kt @@ -0,0 +1,21 @@ +package arrow.syntax.tuples + +import arrow.* + +infix operator fun Tuple9.plus(j: J): Tuple10 = + Tuple10(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.i, j) + +infix operator fun Tuple8.plus(i: I): Tuple9 = + Tuple9(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, i) + +infix operator fun Tuple7.plus(h: H): Tuple8 = + Tuple8(this.a, this.b, this.c, this.d, this.e, this.f, this.g, h) + +infix operator fun Tuple6.plus(g: G): Tuple7 = + Tuple7(this.a, this.b, this.c, this.d, this.e, this.f, g) + +infix operator fun Tuple5.plus(f: F): Tuple6 = Tuple6(this.a, this.b, this.c, this.d, this.e, f) +infix operator fun Tuple4.plus(e: E): Tuple5 = Tuple5(this.a, this.b, this.c, this.d, e) +infix operator fun Tuple3.plus(d: D): Tuple4 = Tuple4(this.a, this.b, this.c, d) +infix operator fun Tuple2.plus(c: C): Tuple3 = Tuple3(this.a, this.b, c) + diff --git a/arrow-syntax/src/main/kotlin/arrow/syntax/validated/validated.kt b/arrow-syntax/src/main/kotlin/arrow/syntax/validated/validated.kt new file mode 100644 index 00000000000..15e9458a7a8 --- /dev/null +++ b/arrow-syntax/src/main/kotlin/arrow/syntax/validated/validated.kt @@ -0,0 +1,11 @@ +package arrow.syntax.validated + +import arrow.* + +fun A.valid(): Validated = Valid(this) + +fun E.invalid(): Validated = Invalid(this) + +fun A.validNel(): ValidatedNel = Validated.validNel(this) + +fun E.invalidNel(): ValidatedNel = Validated.invalidNel(this) \ No newline at end of file diff --git a/arrow-test/src/main/kotlin/arrow/laws/FunctorLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/FunctorLaws.kt index 2f7346842f4..0af2ce7d54a 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/FunctorLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/FunctorLaws.kt @@ -1,5 +1,7 @@ package arrow +import andThen +import identity import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll diff --git a/arrow-test/src/main/kotlin/arrow/laws/IsoLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/IsoLaws.kt index 4ab532bdfbf..b7d23b441c8 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/IsoLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/IsoLaws.kt @@ -4,6 +4,8 @@ import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Iso import arrow.optics.modify +import compose +import identity object IsoLaws { diff --git a/arrow-test/src/main/kotlin/arrow/laws/LensLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/LensLaws.kt index 2f5fbdaf32a..85f98bad60b 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/LensLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/LensLaws.kt @@ -4,7 +4,8 @@ import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Lens import arrow.optics.modify -import arrow.optics.modifyF +import compose +import identity object LensLaws { diff --git a/arrow-test/src/main/kotlin/arrow/laws/OptionalLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/OptionalLaws.kt index 43cbfc23b06..33cd4b82d06 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/OptionalLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/OptionalLaws.kt @@ -4,7 +4,8 @@ import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Optional import arrow.optics.modify -import arrow.optics.modifyF +import compose +import identity object OptionalLaws { diff --git a/arrow-test/src/main/kotlin/arrow/laws/PrismLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/PrismLaws.kt index 61849e2611e..5a36a699bb6 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/PrismLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/PrismLaws.kt @@ -4,6 +4,8 @@ import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Prism import arrow.optics.modify +import compose +import identity object PrismLaws { diff --git a/arrow-test/src/main/kotlin/arrow/laws/SetterLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/SetterLaws.kt index 1cc382c5ab7..0d4b6b5d06e 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/SetterLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/SetterLaws.kt @@ -3,6 +3,8 @@ package arrow import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Setter +import compose +import identity object SetterLaws { diff --git a/arrow-test/src/main/kotlin/arrow/laws/TraversalLaws.kt b/arrow-test/src/main/kotlin/arrow/laws/TraversalLaws.kt index ef5ac992d4a..ae5c8c94eb9 100644 --- a/arrow-test/src/main/kotlin/arrow/laws/TraversalLaws.kt +++ b/arrow-test/src/main/kotlin/arrow/laws/TraversalLaws.kt @@ -4,6 +4,8 @@ import io.kotlintest.properties.Gen import io.kotlintest.properties.forAll import arrow.optics.Traversal import arrow.optics.modify +import compose +import identity object TraversalLaws { diff --git a/arrow-typeclasses/build.gradle b/arrow-typeclasses/build.gradle new file mode 100644 index 00000000000..2cdacc57d25 --- /dev/null +++ b/arrow-typeclasses/build.gradle @@ -0,0 +1,16 @@ +dependencies { + compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlinVersion" + compile project(':arrow-annotations') + compile project(':arrow-core') + kapt project(':arrow-annotations-processor') + kaptTest project(':arrow-annotations-processor') + compileOnly project(':arrow-annotations-processor') + testCompileOnly project(':arrow-annotations-processor') + testCompile "io.kotlintest:kotlintest:$kotlinTestVersion" + testCompile project(':arrow-syntax') + testCompile project(':arrow-test') +} + +apply from: rootProject.file('gradle/gradle-mvn-push.gradle') +apply from: rootProject.file('gradle/generated-kotlin-sources.gradle') +apply plugin: 'kotlin-kapt' diff --git a/arrow-typeclasses/gradle.properties b/arrow-typeclasses/gradle.properties new file mode 100644 index 00000000000..33f0a7e853d --- /dev/null +++ b/arrow-typeclasses/gradle.properties @@ -0,0 +1,4 @@ +# Maven publishing configuration +POM_NAME=Arrow Type Classes +POM_ARTIFACT_ID=arrow-typeclasses +POM_PACKAGING=jar diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Alternative.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Alternative.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Alternative.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Alternative.kt diff --git a/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Applicative.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Applicative.kt new file mode 100644 index 00000000000..acb18495122 --- /dev/null +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Applicative.kt @@ -0,0 +1,20 @@ +@file:Suppress("UNUSED_PARAMETER") + +package arrow + +interface Applicative : Functor, Typeclass { + + fun pure(a: A): HK + + fun ap(fa: HK, ff: HK B>): HK + + fun product(fa: HK, fb: HK): HK> = ap(fb, map(fa) { a: A -> { b: B -> Tuple2(a, b) } }) + + override fun map(fa: HK, f: (A) -> B): HK = ap(fa, pure(f)) + + fun map2(fa: HK, fb: HK, f: (Tuple2) -> Z): HK = map(product(fa, fb), f) + + fun map2Eval(fa: HK, fb: Eval>, f: (Tuple2) -> Z): Eval> = fb.map { fc -> map2(fa, fc, f) } +} + +inline fun applicative(): Applicative = instance(InstanceParametrizedType(Applicative::class.java, listOf(typeLiteral()))) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt similarity index 50% rename from arrow-data/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt index 85468c49975..c0f6732784c 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ApplicativeError.kt @@ -23,24 +23,5 @@ interface ApplicativeError : Applicative, Typeclass { } } -inline fun A.raiseError(FT: ApplicativeError = applicativeError(), e: E): HK = FT.raiseError(e) - -inline fun HK.handlerErrorWith(FT: ApplicativeError = applicativeError(), noinline f: (E) -> HK): HK = - FT.handleErrorWith(this, f) - -inline fun HK.attempt(FT: ApplicativeError = applicativeError()): HK> = FT.attempt(this) - -inline fun Either.toError(FT: ApplicativeError = applicativeError()): HK = FT.fromEither(this) - -inline fun (() -> A).catch(FT: ApplicativeError = applicativeError()): HK = FT.catch(this) - -fun ApplicativeError.catch(f: () -> A): HK = - try { - pure(f()) - } - catch (e: Throwable) { - raiseError(e) - } - inline fun applicativeError(): ApplicativeError = instance(InstanceParametrizedType(ApplicativeError::class.java, listOf(typeLiteral(), typeLiteral()))) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Bifoldable.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Bifoldable.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Bifoldable.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Bifoldable.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Bimonad.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Bimonad.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Bimonad.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Bimonad.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Comonad.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Comonad.kt similarity index 85% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Comonad.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Comonad.kt index 2c615d8bd22..5ad21ee8500 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Comonad.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Comonad.kt @@ -17,12 +17,6 @@ interface Comonad : Functor, Typeclass { fun duplicate(fa: HK): HK> = coflatMap(fa, { it }) } -inline fun HK.coflatMap(FT: Comonad = comonad(), noinline f: (HK) -> B): HK = FT.coflatMap(this, f) - -inline fun HK.extract(FT: Comonad = comonad()): A = FT.extract(this) - -inline fun HK.duplicate(FT: Comonad = comonad()): HK> = FT.duplicate(this) - @RestrictsSuspension open class ComonadContinuation(val CM: Comonad, override val context: CoroutineContext = EmptyCoroutineContext) : Serializable, Continuation { diff --git a/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Composed.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Composed.kt new file mode 100644 index 00000000000..af33afcef6b --- /dev/null +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Composed.kt @@ -0,0 +1,22 @@ +package arrow + +/** + * https://www.youtube.com/watch?v=wvSP5qYiz4Y + */ +interface Nested + +typealias NestedType = HK, A> + +typealias UnnestedType = HK> + +@Suppress("UNCHECKED_CAST") +fun UnnestedType.nest(): NestedType = this as HK, A> + +@Suppress("UNCHECKED_CAST") +fun NestedType.unnest(): HK> = this as HK> + +@Suppress("UNCHECKED_CAST") +fun HK2, HK2>.binest(): HK2, A, B> = this as HK2, A, B> + +@Suppress("UNCHECKED_CAST") +fun HK2, A, B>.biunnest(): HK2, HK2> = this as HK2, HK2> diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt similarity index 94% rename from arrow-data/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt index 85574828756..fa91821beb7 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/ContinuationUtils.kt @@ -15,7 +15,7 @@ private var Continuation.completion: Continuation<*>? get() = completionField.get(this) as Continuation<*> set(value) = completionField.set(this@completion, value) -internal var Continuation.stackLabels: List +var Continuation.stackLabels: List get() = if (coroutineImplClass.isInstance(this)) listOf(label) + completion?.stackLabels.orEmpty() else emptyList() set(value) { if (coroutineImplClass.isInstance(this)) { diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Eq.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Eq.kt similarity index 76% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Eq.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Eq.kt index 63ef84e471c..720498fc9a0 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Eq.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Eq.kt @@ -59,21 +59,3 @@ interface Eq : Typeclass { * @return [Eq] instance for type [F]. */ inline fun eq(): Eq = instance(InstanceParametrizedType(Eq::class.java, listOf(typeLiteral()))) - -/** - * Syntax method for [Eq.eqv]. - * - * @param F [Eq] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Eq.eqv] - */ -inline fun F.eqv(EQ: Eq = eq(), b: F): Boolean = EQ.eqv(this, b) - -/** - * Syntax method for [Eq.neqv]. - * - * @param F [Eq] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Eq.neqv] - */ -inline fun F.neqv(EQ: Eq = eq(), b: F): Boolean = EQ.neqv(this, b) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Foldable.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Foldable.kt similarity index 75% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Foldable.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Foldable.kt index b05a60be6ee..8b3cee817e6 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Foldable.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Foldable.kt @@ -148,7 +148,7 @@ inline fun Foldable.foldMapM(fa: HK, noinl /** * Get the element at the index of the Foldable. */ -inline fun Foldable.get(fa: HK, idx: Long): Option { +fun Foldable.get(fa: HK, idx: Long): Option { if (idx < 0L) return None else { foldM(fa, 0L, { i, a -> @@ -173,42 +173,3 @@ inline fun Foldable.foldM(fa: HK, z: B, crossinlin foldLeft(fa, MG.pure(z), { gb, a -> MG.flatMap(gb) { f(it, a) } }) inline fun foldable(): Foldable = instance(InstanceParametrizedType(Foldable::class.java, listOf(typeLiteral()))) - -/** - * The size of this Foldable. - * - * This is overriden in structures that have more efficient size implementations - * (e.g. Vector, Set, Map). - * - * Note: will not terminate for infinite-sized collections. - */ -inline fun Foldable.size(MB: Monoid = monoid(), fa: HK): Long = foldMap(MB, fa, { 1 }) - -inline fun HK.foldLeft(FT: Foldable = foldable(), b: B, noinline f: (B, A) -> B): B = FT.foldLeft(this, b, f) - -inline fun HK.foldRight(FT: Foldable = foldable(), b: Eval, noinline f: (A, Eval) -> Eval): Eval = FT.foldRight(this, b, f) - -inline fun HK.fold(FT: Foldable = foldable(), MA: Monoid = monoid()): A = FT.fold(MA, this) - -inline fun HK.combineAll(FT: Foldable = foldable(), MA: Monoid = monoid()): A = FT.combineAll(MA, this) - -inline fun HK.foldMap(FT: Foldable = foldable(), MB: Monoid = monoid(), noinline f: (A) -> B): B = - FT.foldMap(MB, this, f) - -inline fun HK.traverse_(FT: Foldable = foldable(), AG: Applicative = applicative(), noinline f: (A) -> HK): - HK = FT.traverse_(AG, this, f) - -inline fun HK>.sequence_(FT: Foldable = foldable(), AG: Applicative = applicative()): - HK = FT.sequence_(AG, this) - -inline fun HK.find(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Option = FT.find(this, f) - -inline fun HK.exists(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Boolean = FT.exists(this, f) - -inline fun HK.forall(FT: Foldable = foldable(), noinline f: (A) -> Boolean): Boolean = FT.forall(this, f) - -inline fun HK.isEmpty(FT: Foldable = foldable()): Boolean = FT.isEmpty(this) - -inline fun HK.nonEmpty(FT: Foldable = foldable()): Boolean = FT.nonEmpty(this) - -fun Iterator.iterateRight(lb: Eval): (f: (A, Eval) -> Eval) -> Eval = Foldable.iterateRight(this, lb) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Functor.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Functor.kt similarity index 71% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Functor.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Functor.kt index 800afa8a652..ca342a7b0b5 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Functor.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Functor.kt @@ -21,12 +21,6 @@ interface Functor : Typeclass { } -fun Functor.widen(fa: HK): HK = fa as HK +fun Functor.widen(fa: HK): HK = fa -inline fun functor(): Functor = instance(InstanceParametrizedType(Functor::class.java, listOf(typeLiteral()))) - -//Syntax - -inline fun HK.map(FT : Functor = functor(), noinline f: (A) -> B): HK = FT.map(this, f) - -inline fun ((A) -> B).lift(FT : Functor = functor()): (HK) -> HK = FT.lift(this) \ No newline at end of file +inline fun functor(): Functor = instance(InstanceParametrizedType(Functor::class.java, listOf(typeLiteral()))) \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Inject.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Inject.kt similarity index 76% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Inject.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Inject.kt index b7d18378fd6..b87890e2fd1 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Inject.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Inject.kt @@ -13,6 +13,4 @@ interface Inject : Typeclass { } -inline fun inject(): Inject = instance(InstanceParametrizedType(Inject::class.java, listOf(typeLiteral(), typeLiteral()))) - -inline fun HK.inj(FT: Inject = inject()) : HK = FT.invoke(this) \ No newline at end of file +inline fun inject(): Inject = instance(InstanceParametrizedType(Inject::class.java, listOf(typeLiteral(), typeLiteral()))) \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Monad.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monad.kt similarity index 53% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Monad.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monad.kt index 16e2877ec46..da3d56714ff 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Monad.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monad.kt @@ -21,16 +21,6 @@ interface Monad : Applicative, Typeclass { fun forEffectEval(fa: HK, fb: Eval>): HK = flatMap(fa, { a -> map(fb.value(), { a }) }) } -inline fun Monad.mproduct(fa: HK, crossinline f: (A) -> HK): HK> = - flatMap(fa, { a -> map(f(a), { a toT it }) }) - -inline fun Monad.ifM(fa: HK, crossinline ifTrue: () -> HK, crossinline ifFalse: () -> HK): HK = - flatMap(fa, { if (it) ifTrue() else ifFalse() }) - -inline fun HK.flatMap(FT: Monad = monad(), noinline f: (A) -> HK): HK = FT.flatMap(this, f) - -inline fun HK>.flatten(FT: Monad = monad()): HK = FT.flatten(this) - /** * Entry point for monad bindings which enables for comprehension. The underlying impl is based on coroutines. * A coroutine is initiated and inside [MonadContinuation] suspended yielding to [flatMap]. Once all the flatMap binds are completed @@ -42,19 +32,4 @@ fun Monad.binding(c: suspend MonadContinuation.() -> HK): return continuation.returnedMonad() } -/** - * Entry point for monad bindings which enables for comprehension. The underlying impl is based on coroutines. - * A coroutine is initiated and inside [StackSafeMonadContinuation] suspended yielding to [flatMap]. Once all the flatMap binds are completed - * the underlying monad is returned from the act of executing the coroutine. - * - * This combinator ultimately returns computations lifting to [Free] to automatically for comprehend in a stack-safe way - * over any stack-unsafe monads. - */ -fun Monad.bindingStackSafe(c: suspend StackSafeMonadContinuation.() -> Free): - Free { - val continuation = StackSafeMonadContinuation(this) - c.startCoroutine(continuation, continuation) - return continuation.returnedMonad() -} - inline fun monad(): Monad = instance(InstanceParametrizedType(Monad::class.java, listOf(typeLiteral()))) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt similarity index 73% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt index 83066f80673..55423890c3e 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadContinuations.kt @@ -44,7 +44,7 @@ open class MonadContinuation(M: Monad, override val context: CoroutineC protected lateinit var returnedMonad: HK - internal fun returnedMonad(): HK = returnedMonad + fun returnedMonad(): HK = returnedMonad suspend fun HK.bind(): B = bind { this } @@ -92,38 +92,3 @@ open class MonadContinuation(M: Monad, override val context: CoroutineC infix fun yields(b: () -> B): HK = pure(b()) } - -@RestrictsSuspension -open class StackSafeMonadContinuation(M: Monad, override val context: CoroutineContext = EmptyCoroutineContext) : - Continuation>, Monad by M { - - override fun resume(value: Free) { - returnedMonad = value - } - - override fun resumeWithException(exception: Throwable) { - throw exception - } - - protected lateinit var returnedMonad: Free - - internal fun returnedMonad(): Free = returnedMonad - - suspend fun HK.bind(): B = bind { Free.liftF(this) } - - suspend fun Free.bind(): B = bind { this } - - suspend fun bind(m: () -> Free): B = suspendCoroutineOrReturn { c -> - val labelHere = c.stackLabels // save the whole coroutine stack labels - returnedMonad = m().flatMap { z -> - c.stackLabels = labelHere - c.resume(z) - returnedMonad - } - COROUTINE_SUSPENDED - } - - infix fun yields(b: B): Free = yields { b } - - infix fun yields(b: () -> B): Free = Free.liftF(pure(b())) -} diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadError.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadError.kt similarity index 86% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadError.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadError.kt index 48230b49e62..fed7a610e94 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadError.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadError.kt @@ -12,11 +12,6 @@ interface MonadError : ApplicativeError, Monad, Typeclass { } -inline fun HK.ensure( - FT: MonadError = monadError(), - noinline error: () -> E, - noinline predicate: (A) -> Boolean): HK = FT.ensure(this, error, predicate) - /** * Entry point for monad bindings which enables for comprehensions. The underlying impl is based on coroutines. * A coroutines is initiated and inside [MonadErrorContinuation] suspended yielding to [Monad.flatMap]. Once all the flatMap binds are completed diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonadErrorContinuations.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadErrorContinuations.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonadErrorContinuations.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonadErrorContinuations.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Monoid.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monoid.kt similarity index 76% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Monoid.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monoid.kt index 4481b0c2527..c097a9f9e07 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Monoid.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Monoid.kt @@ -19,8 +19,4 @@ interface Monoid : Semigroup, Typeclass { } -inline fun A.empty(FT: Monoid = monoid()): A = FT.empty() - -inline fun Collection.combineAll(FT: Monoid = monoid()): A = FT.combineAll(this) - inline fun monoid(): Monoid = instance(InstanceParametrizedType(Monoid::class.java, listOf(typeLiteral()))) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/MonoidK.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonoidK.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/MonoidK.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/MonoidK.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Order.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Order.kt similarity index 62% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Order.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Order.kt index 3118124b57c..264eafc18db 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Order.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Order.kt @@ -86,7 +86,7 @@ interface Order : Eq, Typeclass { * @param b object to compare with [a] * @returns a sorted [Tuple2] of [a] and [b]. */ - fun sort(a: F, b: F): Tuple2 = if (gte(a, b)) a toT b else b toT a + fun sort(a: F, b: F): Tuple2 = if (gte(a, b)) Tuple2(a, b) else Tuple2(b, a) companion object { @@ -118,68 +118,4 @@ interface Order : Eq, Typeclass { * * @return [Order] instance for type [F]. */ -inline fun order(): Order = instance(InstanceParametrizedType(Order::class.java, listOf(typeLiteral()))) - -/** - * Syntax method for [Order.compare]. - * - * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Order.compare] - */ -inline fun F.compare(O: Order = order(), b: F): Boolean = O.lt(this, b) - -/** - * Syntax method for [Order.lt]. - * - * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Order.lt] - */ -inline fun F.lt(O: Order = order(), b: F): Boolean = O.lt(this, b) - -/** - * Syntax method for [Order.lte]. - * - * @param O [Order] instance for the type [F] you want to compare, by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Order.lte] - */ -inline fun F.lte(O: Order = order(), b: F): Boolean = O.lte(this, b) - -/** - * Syntax method for [Order.gt]. - * - * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Order.gt] - */ -inline fun F.gt(O: Order = order(), b: F): Boolean = O.gt(this, b) - -/** - * Syntax method for [Order.gte]. - * - * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. - * @param b the object to compare with. - * @see [Order.gt] - */ -inline fun F.gte(O: Order = order(), b: F): Boolean = O.gte(this, b) - -/** - * Get an [Order] instance for a type that implements [Comparable]. - * - * @param F which is constraint in [Comparable] for [F]. - */ -fun > toOrder(): Order = object : Order { - override fun compare(a: F, b: F): Int = a.compareTo(b) -} - -/** - * Returns a list of all elements sorted according to the specified [order]. - * - * @param O [Order] for the type [F] you want to compare by default the global instance will be used for type [F]. - * @returns sorted list by [O]. - */ -inline fun Iterable.sorted(O: Order = order()): List = sortedWith(Comparator { o1, o2 -> - O.compare(o1, o2) -}) \ No newline at end of file +inline fun order(): Order = instance(InstanceParametrizedType(Order::class.java, listOf(typeLiteral()))) \ No newline at end of file diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Reducible.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Reducible.kt similarity index 91% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Reducible.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Reducible.kt index b65942ff770..def44a0a338 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Reducible.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Reducible.kt @@ -42,11 +42,6 @@ interface Reducible : Foldable, Typeclass { override fun reduceRightToOption(fa: HK, f: (A) -> B, g: (A, Eval) -> Eval): Eval> = reduceRightTo(fa, f, g).map({ Some(it) }) - fun toNonEmptyList(fa: HK): NonEmptyList = - reduceRightTo(fa, { a -> NonEmptyList.of(a) }, { a, lnel -> - lnel.map { nonEmptyList -> NonEmptyList(a, listOf(nonEmptyList.head) + nonEmptyList.tail) } - }).value() - override fun isEmpty(fa: HK): Boolean = false override fun nonEmpty(fa: HK): Boolean = true @@ -127,11 +122,6 @@ abstract class NonEmptyReducible : Reducible { } } -inline fun NonEmptyReducible.size(MB: Monoid = monoid(), fa: HK): Long { - val (_, tail) = split(fa) - return 1 + FG().size(MB, tail) -} - fun NonEmptyReducible.get(fa: HK, idx: Long): Option = if (idx == 0L) Some(split(fa).a) else FG().get(split(fa).b, idx - 1L) inline fun NonEmptyReducible.foldM(fa: HK, z: B, crossinline f: (B, A) -> HK, MG: Monad = monad()): HK { diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Semigroup.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Semigroup.kt similarity index 79% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Semigroup.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Semigroup.kt index 5d762505a6e..b86827420df 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Semigroup.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Semigroup.kt @@ -10,6 +10,4 @@ interface Semigroup : Typeclass { } -inline fun A.combine(b: A, FT: Semigroup = semigroup()): A = FT.combine(this, b) - inline fun semigroup(): Semigroup = instance(InstanceParametrizedType(Semigroup::class.java, listOf(typeLiteral()))) diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/SemigroupK.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/SemigroupK.kt similarity index 100% rename from arrow-data/src/main/kotlin/arrow/typeclasses/SemigroupK.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/SemigroupK.kt diff --git a/arrow-data/src/main/kotlin/arrow/typeclasses/Traverse.kt b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Traverse.kt similarity index 65% rename from arrow-data/src/main/kotlin/arrow/typeclasses/Traverse.kt rename to arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Traverse.kt index c8bcea3c45f..faea2e57ad8 100644 --- a/arrow-data/src/main/kotlin/arrow/typeclasses/Traverse.kt +++ b/arrow-typeclasses/src/main/kotlin/arrow/typeclasses/Traverse.kt @@ -11,21 +11,9 @@ interface Traverse : Functor, Foldable, Typeclass { */ fun traverse(fa: HK, f: (A) -> HK, GA: Applicative): HK> - override fun map(fa: HK, f: (A) -> B): HK = traverse(fa, { Id(f(it)) }, Id.applicative()).value() - fun sequence(GA: Applicative, fga: HK>): HK> = traverse(fga, { it }, GA) } -inline fun HK.traverse( - FT: Traverse = traverse(), - GA: Applicative = applicative(), - noinline f: (A) -> HK): HK> = FT.traverse(this, f, GA) - -inline fun HK.flatTraverse( - FT: Traverse = traverse(), - GA: Applicative = applicative(), - FM: Monad = monad(), noinline f: (A) -> HK>): HK> = GA.map(FT.traverse(this, f, GA), { FM.flatten(it) }) - inline fun Traverse.flatTraverse(fa: HK, noinline f: (A) -> HK>, GA: Applicative = applicative(), FM: Monad = monad()): HK> = GA.map(traverse(fa, f, GA), { FM.flatten(it) }) diff --git a/detekt.yml b/detekt.yml index 4b1805c6032..d3a73dc96ca 100644 --- a/detekt.yml +++ b/detekt.yml @@ -12,6 +12,8 @@ potential-bugs: active: false UnsafeCallOnNullableType: active: false + LateinitUsage: + active: false exceptions: active: true @@ -19,6 +21,9 @@ exceptions: empty: active: true +empty-blocks: + active: false + complexity: active: true LongMethod: diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 0c886350f69..00000000000 --- a/pom.xml +++ /dev/null @@ -1,175 +0,0 @@ - - - - - 4.0.0 - - org.funktionale - funktionale - 1.2 - - funktionale-collections - funktionale-complement - funktionale-composition - funktionale-currying - funktionale-memoization - funktionale-pairing - funktionale-partials - funktionale-reverse - funktionale-utils - funktionale-option - funktionale-either - funktionale-validation - funktionale-try - funktionale-state - funktionale-pipe - funktionale-all - funktionale-experimental - - pom - funKTionale - Functional constructs and utilities for Kotlin - https://github.com/MarioAriasC/funKTionale - - - The Apache Software License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0.txt - repo - - - - - - false - - bintray-kotlin-kotlin-eap - bintray - http://dl.bintray.com/kotlin/kotlin-eap - - - - - - false - - bintray-kotlin-kotlin-eap - bintray-plugins - http://dl.bintray.com/kotlin/kotlin-eap - - - - https://github.com/MarioAriasC/funKTionale - git@github.com:MarioAriasC/funKTionale.git - - - - Mario Arias - - Lead Developer - - mario@marioarias.org - - - - true - 1.2.0 - - - - org.jetbrains.kotlin - kotlin-stdlib - ${kotlin.version} - - - org.testng - testng - 6.4 - test - - - org.assertj - assertj-core - 3.6.2 - test - - - - - - - org.apache.maven.plugins - maven-source-plugin - 2.1.2 - - - attach-sources - verify - - jar-no-fork - - - - - - org.jetbrains.kotlin - kotlin-maven-plugin - ${kotlin.version} - - - compile - compile - - compile - - - - test-compile - test-compile - - test-compile - - - - - - org.apache.maven.plugins - maven-gpg-plugin - 1.6 - - - sign-artifacts - verify - - sign - - - - - - - - - - - bintray-marioariasc-funKTionale-funKTionale - marioariasc-funKTionale-funKTionale - https://api.bintray.com/maven/marioariasc/funKTionale/funKTionale - - - diff --git a/settings.gradle b/settings.gradle index ea0a8d4d273..dba5ce1bd49 100644 --- a/settings.gradle +++ b/settings.gradle @@ -15,7 +15,12 @@ */ include ':arrow-syntax' +include ':arrow-core' +include ':arrow-typeclasses' +include ':arrow-instances' include ':arrow-data' +include ':arrow-free' +include ':arrow-mtl' include ':arrow-annotations' include ':arrow-annotations-processor' include ':arrow-kindedj'