git.iko.soy/rowtype-yoga/purescript-backend-optimizer
on main help sign in
55 lines 1.5 kB history raw
1-- @inline export overArray arity=1
2module Snapshot.Fusion01 (test) where
4import Prelude
6import Data.Array as Array
7import Data.List as List
8import Data.Maybe (Maybe(..))
9import Data.String as String
10import Partial.Unsafe (unsafePartial)
12newtype Fold a = Fold (forall r. (a -> r -> r) -> r -> r)
14mapF :: forall a b. (a -> b) -> Fold a -> Fold b
15mapF f (Fold next) = Fold \cons nil -> next (cons <<< f) nil
17filterMapF :: forall a b. (a -> Maybe b) -> Fold a -> Fold b
18filterMapF f (Fold next) = Fold \cons nil ->
19 next
20 ( \a as ->
21 case f a of
22 Just b ->
23 cons b as
24 Nothing ->
25 as
26 )
27 nil
29filterF :: forall a. (a -> Boolean) -> Fold a -> Fold a
30filterF p = filterMapF (\a -> if p a then Just a else Nothing)
32fromArray :: forall a. Array a -> Fold a
33fromArray arr = Fold \cons nil -> do
34 let
35 loop n acc
36 | n == 0 =
37 acc
38 | otherwise =
39 loop (n - 1) $ cons (unsafePartial (Array.unsafeIndex arr n)) acc
40 loop (Array.length arr - 1) nil
42toArray :: forall a. Fold a -> Array a
43toArray (Fold next) = Array.reverse $ List.toUnfoldable $ next List.Cons List.Nil
45overArray :: forall a b. (Fold a -> Fold b) -> Array a -> Array b
46overArray fold = toArray <<< fold <<< fromArray
48test :: Array Int -> Array String
49test = overArray do
50 mapF (add 1)
51 >>> mapF show
52 >>> filterMapF (String.stripPrefix (String.Pattern "1"))
53 >>> mapF (append "2")
54 >>> filterF (_ /= "wat")
55 >>> mapF (flip append "1")