It is! http://package.elm-lang.org/packages/nphollon/collision/1.0.2/
I was going to solicit feedback here on elm-discuss once I got this bug sorted out. Until then, I've purposely kept the API to a bare minimum. Would love to hear your thoughts! On Tue, Jul 12, 2016 at 4:14 PM, Ian Mackenzie <[email protected]> wrote: > Good to know! > > By the way, is the original code you were working on part of an > open-source library, by any chance? I'm working on some 2D/3D geometric > libraries for Elm myself, including stuff like bounding boxes and spatial > trees much like the one you describe. Might would be worth seeing if there > are places we can collaborate (or at least not duplicate work if we don't > need to). > > On Wednesday, 13 July 2016 07:15:21 UTC+10, Nick H wrote: >> >> Well, it turns out the bug isn't in my code. It is in elm-lang/core >> <https://github.com/elm-lang/core/issues/601>. >> >> List.take fills ups the call stack all on its own: >> >> main = [ 1 .. 5000 ] |> List.take 2500 |> toString |> Html.text >> >> List.drop does not have this problem. If we redefine the partition >> function solely in terms of List.drop, even the code in the OP works fine! >> >> partition _ foos = >> let >> n = List.length foos // 2 >> in >> ( List.reverse foos |> List.drop (n+1) |> List.reverse, List.drop n >> foos ) >> >> I am happy that I learned how to use trampolines though. Maybe it will >> come in handy some day :-) >> >> On Tue, Jul 12, 2016 at 11:17 AM, Nick H <[email protected]> wrote: >> >>> So I felt this 0.16 tutorial >>> <https://www.classes.cs.uchicago.edu/archive/2015/winter/22300-1/lectures/TailRecursion.html> >>> helped me understand trampolines better. Then it took a bit of work >>> rewriting `create` in a way that utilized tail calls. But the new version >>> is still failing with "too much recursion." Adding or removing the >>> trampolines doesn't seem to make a difference. >>> >>> Below is a SSCCE, with dummy implementations for wrap and partition. In >>> anybody has insight into what I am doing wrong, I would really appreciate >>> it! >>> >>> module Main exposing (..) >>> >>> import Html >>> import Dict exposing (Dict) >>> import Trampoline exposing (Trampoline) >>> >>> >>> main = >>> [1..4500] |> create |> toString |> Html.text >>> >>> >>> create : List Foo -> Tree >>> create foos = >>> Trampoline.evaluate (descend foos []) >>> >>> >>> type Partial >>> = LeftBranch Bar (List Foo) >>> | RightBranch Bar Tree >>> >>> >>> descend : List Foo -> List Partial -> Trampoline Tree >>> descend incomplete stack = >>> case incomplete of >>> [] -> >>> Trampoline.jump (\_ -> ascend (Leaf emptyFoo) stack) >>> >>> foo :: [] -> >>> Trampoline.jump (\_ -> ascend (Leaf foo) stack) >>> >>> _ -> >>> Trampoline.jump >>> (\_ -> >>> let >>> bar = >>> wrap incomplete >>> >>> ( left, right ) = >>> partition bar incomplete >>> in >>> descend left (LeftBranch bar right :: stack) >>> ) >>> >>> >>> ascend : Tree -> List Partial -> Trampoline Tree >>> ascend complete stack = >>> case stack of >>> [] -> >>> Trampoline.done complete >>> >>> (LeftBranch parent sibling) :: remainder -> >>> Trampoline.jump >>> (\_ -> >>> descend sibling (RightBranch parent complete :: >>> remainder) >>> ) >>> >>> (RightBranch parent sibling) :: remainder -> >>> Trampoline.jump >>> (\_ -> >>> ascend (Node parent sibling complete) remainder >>> ) >>> >>> >>> type alias Bar = >>> String >>> >>> >>> type alias Foo = >>> Int >>> >>> >>> type Tree >>> = Leaf Foo >>> | Node Bar Tree Tree >>> >>> >>> wrap : List Foo -> Bar >>> wrap = >>> toString >>> >>> >>> partition : Bar -> List Foo -> ( List Foo, List Foo ) >>> partition _ foos = >>> let >>> n = >>> List.length foos // 2 >>> in >>> ( List.take n foos, List.drop n foos ) >>> >>> >>> emptyFoo : Foo >>> emptyFoo = >>> 0 >>> >>> >>> On Tue, Jul 12, 2016 at 10:08 AM, Max Goldstein <[email protected]> >>> wrote: >>> >>>> Nah, trampoline takes some mental gymnastics! Hope it's helpful for >>>> your tree problem. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Elm Discuss" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> >> -- > You received this message because you are subscribed to the Google Groups > "Elm Discuss" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Elm Discuss" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
