Skip to content

Commit

Permalink
[#24] Move all protocol implementation for Keyword type to its module
Browse files Browse the repository at this point in the history
  • Loading branch information
jfacorro committed Jan 26, 2016
1 parent 0e822f4 commit d62d0b3
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 32 deletions.
12 changes: 0 additions & 12 deletions src/lang/clojerl.Keyword.clojerl.IMeta.erl

This file was deleted.

10 changes: 0 additions & 10 deletions src/lang/clojerl.Keyword.clojerl.Named.erl

This file was deleted.

40 changes: 32 additions & 8 deletions src/lang/clojerl.Keyword.erl
Original file line number Diff line number Diff line change
@@ -1,26 +1,50 @@
-module('clojerl.Keyword').

-behaviour('clojerl.Stringable').
-behavior('clojerl.IMeta').
-behavior('clojerl.Named').
-behavior('clojerl.Stringable').

-define(T, ?MODULE).

-export([new/1, new/2]).
-export([ 'clojerl.Named.name'/1
, 'clojerl.Named.namespace'/1
]).
-export(['clojerl.Stringable.str'/1]).
-export([ 'clojerl.IMeta.meta'/1
, 'clojerl.IMeta.with_meta'/2
]).

-record(?T, { ns :: binary() | undefined
, name :: binary()
, info = #{} :: map()
}).

-type type() :: {?MODULE, #{ns => binary() | undefined,
name => binary()}}.
-type type() :: #?T{}.

-spec new(binary()) -> 'clojerl.Keyword':type().
-spec new(binary()) -> type().
new(Name) ->
new(undefined, Name).

-spec new(binary(), binary()) -> 'clojerl.Keyword':type().
-spec new(binary(), binary()) -> type().
new(Namespace, Name) ->
{?MODULE, #{ns => Namespace, name => Name}}.
#?T{ns = Namespace, name = Name}.

%%------------------------------------------------------------------------------
%% Protocols
%%------------------------------------------------------------------------------

'clojerl.Stringable.str'({'clojerl.Keyword', #{ns := undefined, name := Name}}) ->
'clojerl.Stringable.str'(#?T{ns = undefined, name = Name}) ->
<<":", Name/binary>>;
'clojerl.Stringable.str'({'clojerl.Keyword', #{ns := Namespace, name := Name}}) ->
'clojerl.Stringable.str'(#?T{ns = Namespace, name = Name}) ->
<<":", Namespace/binary, "/", Name/binary>>.

'clojerl.Named.name'(#?T{name = Name}) -> Name.

'clojerl.Named.namespace'(#?T{ns = Namespace}) -> Namespace.

'clojerl.IMeta.meta'(#?T{info = Info}) ->
maps:get(meta, Info, undefined).

'clojerl.IMeta.with_meta'(#?T{info = Info} = Keyword, Metadata) ->
Keyword#?T{info = Info#{meta => Metadata}}.
4 changes: 2 additions & 2 deletions test/clj_reader_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -442,8 +442,8 @@ syntax_quote(_Config) ->
" (clojure.core/apply"
" clojure.core/hash-set"
" (clojure.core/concat"
" (clojure.core/list :world)"
" (clojure.core/list user/hello)))"
" (clojure.core/list user/hello)"
" (clojure.core/list :world)))"
" nil)">>),

ct:comment("Read unquote-splice inside list"),
Expand Down

0 comments on commit d62d0b3

Please sign in to comment.