Skip to content

Instantly share code, notes, and snippets.

View jjant's full-sized avatar
馃挜

Julian Antonielli jjant

馃挜
View GitHub Profile
myCoolFunction : Int -> Int
myCoolFunction a =
-- Calls the JS `addTwo` function.
jsCall "addTwo" a
main =
myCoolFunction 3
|> String.fromInt
|> Html.text
@jjant
jjant / FreeMonoidDataType.hs
Created September 9, 2018 19:36
FreeMonoid implementation
data FreeMonoid t
= Zero
| Combine t (FreeMonoid t)
@jjant
jjant / FreeMonoid1.hs
Created September 9, 2018 19:35
First attempt at writing a free monoid
data FreeMonoid1 t
= Zero
| Val t
| Combine (FreeMonoid1 t) (FreeMonoid1 t)
isAdmin :: FreeMonoid (String, Bool) -> Bool
isAdmin perms = interpret True (\(_, perm) rest -> perm && rest) perms
isPowerUser :: FreeMonoid (String, Bool) -> Bool
isPowerUser perms = interpret False (\(_, perm) rest -> perm || rest) perms
isRegularUser :: FreeMonoid (String, Bool) -> Bool
isRegularUser perms = not (isPowerUser perms)
interpret :: b -> (a -> b -> b) -> FreeMonoid a -> b
interpret myZero myCombine Zero = myZero
interpret myZero myCombine (Combine a rest) =
a `myCombine` (interpret myZero myCombine rest) -- a `Combine` (b `Combine` Zero) -> a `myCombine` (b `myCombine` myZero)
zero :: FreeMonoid t
zero = Zero
(<>) :: FreeMonoid t -> FreeMonoid t -> FreeMonoid t
Zero <> x = x -- Left identity
x <> Zero = x -- Right identity
(Combine t1 rest1) <> x =
-- `(a <> b) <> x` is represented as `a <> (b <> x)`
Combine t1 (rest1 <> x)
employeeAppToEmployeeCount : EmployeeApp -> EmployeeWithCount
employeeAppToEmployeeCount employeeApp =
map (\employees -> List.length employees) employeeApp
map : (a -> b) -> Employee a -> Employee b
map f (Employee sharedData a) =
Employee sharedData (f a)
replace : b -> Employee a -> Employee b
replace b =
map (\_ -> b)
type alias Id =
Int
type Employee1
= Employee1
{ id : Id
, name : String
, age : Int
, employees : List Employee1
type EmployeeFromDb1
= EmployeeFromDb1
{ id : Id
, name : String
, age : Int
, employerId : Id
}